5 #include <Foundation/NSObject.h>
9 #include <objc/runtime.h>
10 #include <objc/objc-sync.h>
12 // Basic @synchronized tests.
18 static semaphore_t go;
19 static semaphore_t stop;
21 void *thread(void *arg __unused)
25 // non-blocking sync_enter
26 err = objc_sync_enter(obj);
27 testassert(err == OBJC_SYNC_SUCCESS);
30 // main thread: sync_exit of object locked on some other thread
33 err = objc_sync_exit(obj);
34 testassert(err == OBJC_SYNC_SUCCESS);
35 err = objc_sync_enter(obj);
36 testassert(err == OBJC_SYNC_SUCCESS);
39 // main thread: blocking sync_enter
40 testassert(WAIT_SEC/3*3 == WAIT_SEC);
42 // recursive enter while someone waits
43 err = objc_sync_enter(obj);
44 testassert(err == OBJC_SYNC_SUCCESS);
46 // recursive exit while someone waits
47 err = objc_sync_exit(obj);
48 testassert(err == OBJC_SYNC_SUCCESS);
50 // sync_exit while someone waits
51 err = objc_sync_exit(obj);
52 testassert(err == OBJC_SYNC_SUCCESS);
61 struct timeval start, end;
63 obj = [[NSObject alloc] init];
65 // sync_exit of never-locked object
66 err = objc_sync_exit(obj);
67 testassert(err == OBJC_SYNC_NOT_OWNING_THREAD_ERROR);
69 semaphore_create(mach_task_self(), &go, 0, 0);
70 semaphore_create(mach_task_self(), &stop, 0, 0);
71 pthread_create(&th, NULL, &thread, NULL);
74 // sync_exit of object locked on some other thread
75 err = objc_sync_exit(obj);
76 testassert(err == OBJC_SYNC_NOT_OWNING_THREAD_ERROR);
78 semaphore_signal(stop);
81 // blocking sync_enter
82 gettimeofday(&start, NULL);
83 err = objc_sync_enter(obj);
84 gettimeofday(&end, NULL);
85 testassert(err == OBJC_SYNC_SUCCESS);
86 // should have waited more than WAIT_SEC but less than WAIT_SEC+1
87 // fixme hack: sleep(1) is ending 500 usec too early on x86_64 buildbot
89 testassert(end.tv_sec*1000000LL+end.tv_usec >=
90 start.tv_sec*1000000LL+start.tv_usec + WAIT_SEC*1000000LL
92 testassert(end.tv_sec*1000000LL+end.tv_usec <
93 start.tv_sec*1000000LL+start.tv_usec + (1+WAIT_SEC)*1000000LL);
95 err = objc_sync_exit(obj);
96 testassert(err == OBJC_SYNC_SUCCESS);
98 err = objc_sync_exit(obj);
99 testassert(err == OBJC_SYNC_NOT_OWNING_THREAD_ERROR);