1033 PosixSemaphore::PosixSemaphore(uint value) { 1034 int ret = sem_init(&_semaphore, 0, value); 1035 1036 guarantee_with_errno(ret == 0, "Failed to initialize semaphore"); 1037 } 1038 1039 PosixSemaphore::~PosixSemaphore() { 1040 sem_destroy(&_semaphore); 1041 } 1042 1043 void PosixSemaphore::signal(uint count) { 1044 for (uint i = 0; i < count; i++) { 1045 int ret = sem_post(&_semaphore); 1046 1047 assert_with_errno(ret == 0, "sem_post failed"); 1048 } 1049 } 1050 1051 void PosixSemaphore::wait() { 1052 int ret; 1053 while ((ret = sem_wait(&_semaphore)) == -1 && errno == EINTR) { 1054 // Retry if the wait was interrupted by a signal. 1055 } 1056 assert_with_errno(ret == 0, "sem_wait failed"); 1057 } 1058 1059 bool PosixSemaphore::trywait() { 1060 bool succeeded = sem_trywait(&_semaphore) == 0; 1061 1062 assert_with_errno(succeeded || errno == EAGAIN, "trywait failed"); 1063 1064 return succeeded; 1065 } 1066 1067 bool PosixSemaphore::timedwait(const struct timespec ts) { 1068 while (true) { 1069 int result = sem_timedwait(&_semaphore, &ts); 1070 if (result == 0) { 1071 return true; 1072 } else if (errno == EINTR) { 1073 continue; 1074 } else if (errno == ETIMEDOUT) { 1075 return false; 1076 } else { 1077 assert_with_errno(false, "timedwait failed"); 1078 return false; 1079 } 1080 } 1081 } 1082 1083 #endif // __APPLE__ | 1033 PosixSemaphore::PosixSemaphore(uint value) { 1034 int ret = sem_init(&_semaphore, 0, value); 1035 1036 guarantee_with_errno(ret == 0, "Failed to initialize semaphore"); 1037 } 1038 1039 PosixSemaphore::~PosixSemaphore() { 1040 sem_destroy(&_semaphore); 1041 } 1042 1043 void PosixSemaphore::signal(uint count) { 1044 for (uint i = 0; i < count; i++) { 1045 int ret = sem_post(&_semaphore); 1046 1047 assert_with_errno(ret == 0, "sem_post failed"); 1048 } 1049 } 1050 1051 void PosixSemaphore::wait() { 1052 int ret; 1053 1054 do { 1055 ret = sem_wait(&_semaphore); 1056 } while (ret != 0 && errno == EINTR); 1057 1058 assert_with_errno(ret == 0, "sem_wait failed"); 1059 } 1060 1061 bool PosixSemaphore::trywait() { 1062 int ret; 1063 1064 do { 1065 ret = sem_trywait(&_semaphore); 1066 } while (ret != 0 && errno == EINTR); 1067 1068 assert_with_errno(ret == 0 || errno == EAGAIN, "trywait failed"); 1069 1070 return ret == 0; 1071 } 1072 1073 bool PosixSemaphore::timedwait(const struct timespec ts) { 1074 while (true) { 1075 int result = sem_timedwait(&_semaphore, &ts); 1076 if (result == 0) { 1077 return true; 1078 } else if (errno == EINTR) { 1079 continue; 1080 } else if (errno == ETIMEDOUT) { 1081 return false; 1082 } else { 1083 assert_with_errno(false, "timedwait failed"); 1084 return false; 1085 } 1086 } 1087 } 1088 1089 #endif // __APPLE__ |