| #include <iostream> |
| #include <cerrno> |
| #include <cstring> |
| #include <pthread.h> |
| #include <semaphore.h> |
| |
| struct FailedOn |
| { |
| FailedOn(const char *f, int e) : func(f), eno(e) {} |
| std::string func; |
| int eno; |
| }; |
| |
| int main(void) |
| { |
| try { |
| sem_t mySemaphore; |
| if (sem_init(&mySemaphore, 0, 0) != 0) |
| throw FailedOn("sem_init", errno); |
| |
| std::cerr << "Calling sem_trywait\n"; |
| if (sem_trywait(&mySemaphore) != 0) { |
| if (errno != EAGAIN) |
| throw FailedOn("sem_trywait", errno); |
| |
| std::cerr << "Wait would have blocked" << std::endl; |
| } else { |
| std::cerr << "Wait succeeded" << std::endl; |
| } |
| |
| if (sem_destroy(&mySemaphore) != 0) |
| throw FailedOn("sem_destroy", errno); |
| |
| return 0; |
| } catch (FailedOn &e) { |
| std::cerr << e.func << " failed: " << strerror(e.eno) << std::endl; |
| } catch (...) { |
| std::cerr << "Unknown exception" << std::endl; |
| } |
| |
| return -1; |
| } |