1 #include <iostream>
2 #include <cerrno>
3 #include <cstring>
4 #include <pthread.h>
5 #include <semaphore.h>
6 
7 struct FailedOn
8 {
FailedOnFailedOn9   FailedOn(const char *f, int e) : func(f), eno(e) {}
10   std::string func;
11   int eno;
12 };
13 
main(void)14 int main(void)
15 {
16   try {
17     sem_t mySemaphore;
18     if (sem_init(&mySemaphore, 0, 0) != 0)
19       throw FailedOn("sem_init", errno);
20 
21     std::cerr << "Calling sem_trywait\n";
22     if (sem_trywait(&mySemaphore) != 0) {
23       if (errno != EAGAIN)
24         throw FailedOn("sem_trywait", errno);
25 
26       std::cerr << "Wait would have blocked" << std::endl;
27     } else {
28       std::cerr << "Wait succeeded" << std::endl;
29     }
30 
31     if (sem_destroy(&mySemaphore) != 0)
32       throw FailedOn("sem_destroy", errno);
33 
34     return 0;
35   } catch (FailedOn &e) {
36     std::cerr << e.func << " failed: " << strerror(e.eno) << std::endl;
37   } catch (...) {
38     std::cerr << "Unknown exception" << std::endl;
39   }
40 
41   return -1;
42 }
43