31
31
#ifdef __APPLE__
32
32
// OS X doesn't support unnamed POSIX semaphores, so the implementation in os_posix.cpp can't be used.
33
33
34
- static const char * sem_init_strerror (kern_return_t value) {
34
+ static const char * sem_strerror (kern_return_t value) {
35
35
switch (value) {
36
- case KERN_INVALID_ARGUMENT: return " Invalid argument" ;
37
- case KERN_RESOURCE_SHORTAGE: return " Resource shortage" ;
38
- default : return " Unknown" ;
36
+ case KERN_INVALID_ARGUMENT: return " Invalid argument" ;
37
+ case KERN_RESOURCE_SHORTAGE: return " Resource shortage" ;
38
+ case KERN_TERMINATED: return " Resource has been destroyed" ;
39
+ case KERN_ABORTED: return " Operation was aborted" ;
40
+ case KERN_INVALID_VALUE: return " Invalid time specified" ;
41
+ case KERN_OPERATION_TIMED_OUT: return " Operation timed-out" ;
42
+ default : return " Unknown" ;
39
43
}
40
44
}
41
45
42
46
OSXSemaphore::OSXSemaphore (uint value) {
43
47
kern_return_t ret = semaphore_create (mach_task_self (), &_semaphore, SYNC_POLICY_FIFO, value);
44
48
45
- guarantee (ret == KERN_SUCCESS, " Failed to create semaphore: %s" , sem_init_strerror (ret));
49
+ guarantee (ret == KERN_SUCCESS, " Failed to create semaphore: %s (0x%x)" ,
50
+ sem_strerror (ret), (uint)ret);
46
51
}
47
52
48
53
OSXSemaphore::~OSXSemaphore () {
@@ -53,7 +58,8 @@ void OSXSemaphore::signal(uint count) {
53
58
for (uint i = 0 ; i < count; i++) {
54
59
kern_return_t ret = semaphore_signal (_semaphore);
55
60
56
- assert (ret == KERN_SUCCESS, " Failed to signal semaphore" );
61
+ assert (ret == KERN_SUCCESS, " Failed to signal semaphore: %s (0x%x)" ,
62
+ sem_strerror (ret), (uint)ret);
57
63
}
58
64
}
59
65
@@ -62,7 +68,8 @@ void OSXSemaphore::wait() {
62
68
while ((ret = semaphore_wait (_semaphore)) == KERN_ABORTED) {
63
69
// Semaphore was interrupted. Retry.
64
70
}
65
- assert (ret == KERN_SUCCESS, " Failed to wait on semaphore" );
71
+ assert (ret == KERN_SUCCESS, " Failed to wait on semaphore: %s (0x%x)" ,
72
+ sem_strerror (ret), (uint)ret);
66
73
}
67
74
68
75
bool OSXSemaphore::trywait () {
@@ -100,6 +107,10 @@ bool OSXSemaphore::timedwait(int64_t millis) {
100
107
kr = semaphore_timedwait (_semaphore, waitspec);
101
108
}
102
109
110
+ assert (kr == KERN_SUCCESS || kr == KERN_OPERATION_TIMED_OUT,
111
+ " Failed to timed-wait on semaphore: %s (0x%x)" ,
112
+ sem_strerror (kr), (uint)kr);
113
+
103
114
return kr == KERN_SUCCESS;
104
115
}
105
116
#endif // __APPLE__
0 commit comments