< prev index next >

src/os/posix/vm/os_posix.cpp

Print this page




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__
< prev index next >