7 void alarm_handler(int unused)
13 main(int argc, char *argv[])
17 jit_node_t *jmpi_main, *label;
18 jit_node_t *func0, *func1, *func2, *func3;
19 jit_node_t *patch0, *patch1, *patch2, *patch3;
23 /* If there is any bug, do not hang in "make check" */
24 signal(SIGALRM, alarm_handler);
28 _jit = jit_new_state();
30 jmpi_main = jit_jmpi();
32 #define defun(name, line) \
34 jit_note("catomic.c", line); \
37 jit_movi(JIT_V0, (jit_word_t)&lock); \
38 jit_movi(JIT_R1, 0); \
39 jit_movi(JIT_R2, line); \
40 /* spin until get the lock */ \
41 label = jit_label(); \
42 jit_casr(JIT_R0, JIT_V0, JIT_R1, JIT_R2); \
43 jit_patch_at(jit_beqi(JIT_R0, 0), label); \
46 /* pretend to be doing something useful for 0.01 usec
47 * while holding the lock */ \
48 jit_pushargi(10000); \
49 jit_finishi(usleep); \
51 jit_movi(JIT_R1, 0); \
52 jit_str(JIT_V0, JIT_R1); \
54 jit_movi(JIT_R1, 0); \
55 jit_movi(JIT_R2, line); \
56 /* spin until get the lock */ \
57 label = jit_label(); \
58 jit_casi(JIT_R0, (jit_word_t)&lock, JIT_R1, JIT_R2); \
59 jit_patch_at(jit_beqi(JIT_R0, 0), label); \
62 /* pretend to be doing something useful for 0.01 usec
63 * while holding the lock */ \
64 jit_pushargi(10000); \
65 jit_finishi(usleep); \
67 /* for make check, just print "ok" */ \
68 jit_pushargi((jit_word_t)"ok"); \
69 /*jit_pushargi((jit_word_t)#name);*/ \
72 jit_movi(JIT_R1, 0); \
73 jit_str(JIT_V0, JIT_R1); \
76 defun(func0, __LINE__);
77 defun(func1, __LINE__);
78 defun(func2, __LINE__);
79 defun(func3, __LINE__);
83 jit_note("catomic.c", __LINE__);
87 /* set JIT_R0 to thread function */ \
88 jit_patch_at(jit_movi(JIT_R0, 0), func##tid); \
90 /* pthread_t first argument */ \
91 jit_pushargi((jit_word_t)(tids + tid)); \
92 /* pthread_attr_t second argument */ \
93 jit_pushargi((jit_word_t)NULL); \
94 /* start routine third argument */ \
95 jit_pushargr(JIT_R0); \
96 /* argument to start routine fourth argument */ \
97 jit_pushargi((jit_word_t)NULL); \
99 jit_finishi(pthread_create);
100 /* spawn four threads */
107 /* load pthread_t value in JIT_R0 */ \
108 jit_movi(JIT_R0, (jit_word_t)tids); \
109 jit_ldxi(JIT_R0, JIT_R0, tid * sizeof(pthread_t)); \
111 jit_pushargr(JIT_R0); \
112 jit_pushargi((jit_word_t)NULL); \
113 jit_finishi(pthread_join);
114 /* wait for threads to finish */
121 jit_pushargi((jit_word_t)"ok");
135 /* let first thread acquire the lock */