]> git.donarmstrong.com Git - rsem.git/blob - my_assert.h
Modified build rules for sam/libbam.a to enable parallel build
[rsem.git] / my_assert.h
1 #ifndef MY_ASSERT_H
2 #define MY_ASSERT_H
3
4 #include<cstdio>
5 #include<cstring>
6 #include<cstdlib>
7 #include<cerrno>
8 #include<string>
9 #include<sstream>
10 #include<iomanip>
11
12 std::string itos(int i) {
13   std::ostringstream strout;
14   strout<<i;
15   return strout.str();
16 }
17
18 // n : number of significant digits
19 std::string ftos(double f, int n) {
20   std::ostringstream strout;
21   strout<<std::setprecision(n)<<f;
22   return strout.str();
23 }
24
25 std::string ctos(char c) {
26   return std::string(1, c);
27 }
28
29 std::string cstrtos(const char* s) {
30   return std::string(s);
31 }
32
33
34 void general_assert(int expr, const std::string& errmsg) {
35         if (expr) return;
36
37         fprintf(stderr, "%s\n", errmsg.c_str());
38         exit(-1);
39 }
40
41 void pthread_assert(int rc, const std::string& func_name, const std::string& errmsg) {
42         if (rc == 0) return;
43
44         fprintf(stderr, "%s\n", errmsg.c_str());
45
46         if (func_name == "pthread_create") {
47                 switch(rc) {
48                 case EAGAIN:
49                         fprintf(stderr, "Error code: EAGAIN. Insufficient resources to create another thread, or a system-imposed limit on the number of threads was encountered.\n");
50                         break;
51                 case EINVAL:
52                         fprintf(stderr, "Error code: EINVAL. Invalid settings in attr.\n");
53                         break;
54                 case EPERM:
55                         fprintf(stderr, "Error code: EPERM. No permission to set the scheduling policy and parameters specified in attr.\n");
56                         break;
57                 default: fprintf(stderr, "Unknown error code: %d.\n", rc);
58                 }
59         } else if (func_name == "pthread_join") {
60                 switch(rc) {
61                 case EDEADLK:
62                         fprintf(stderr, "Error code: EDEADLK. A deadlock was detected (e.g., two threads tried to join with each other); or thread_id specifies the calling thread.\n");
63                         break;
64                 case EINVAL:
65                         fprintf(stderr, "Error code: EINVAL. The implementation has detected that the value specified by thread_id does not refer to a joinable thread.\n");
66                         break;
67                 case ESRCH:
68                         fprintf(stderr, "Error code: ESRCH. No thread with thread_id could be found.\n");
69                         break;
70                 default: fprintf(stderr, "Unknown error code: %d.\n", rc);
71                 }
72         } else if (func_name == "pthread_mutex_lock") {
73                 switch(rc) {
74                 case EAGAIN:
75                         fprintf(stderr, "Error code: EAGAIN. The mutex could not be acquired because the maximum number of recursive locks for mutex has been exceeded.\n");
76                         break;
77                 case EDEADLK:
78                         fprintf(stderr, "Error code: EDEADLK. The current thread already owns the mutex.\n");
79                         break;
80                 case EINVAL:
81                         fprintf(stderr, "Error code: EINVAL. The mutex was created with the protocol attribute having the value PTHREAD_PRIO_PROTECT and the calling thread's priority is higher than the mutex's current priority ceiling. Or the value specified by mutex does not refer to an initialized mutex object.\n");
82                         break;
83                 default: fprintf(stderr, "Unknown error code: %d.\n", rc);
84                 }
85         } else if (func_name == "pthread_mutex_unlock") {
86                 switch(rc) {
87                 case EAGAIN:
88                         fprintf(stderr, "Error code: EAGAIN. The mutex could not be acquired because the maximum number of recursive locks for mutex has been exceeded.\n");
89                         break;
90                 case EINVAL:
91                         fprintf(stderr, "Error code: EINVAL. The value specified by mutex does not refer to an initialized mutex object.\n");
92                         break;
93                 case EPERM:
94                         fprintf(stderr, "Error code: EPERM. The current thread does not own the mutex.\n");
95                         break;
96                 default: fprintf(stderr, "Unknown error code: %d.\n", rc);
97                 }
98         } else {
99                 fprintf(stderr, "Unknown function name: %s.\n", func_name.c_str());
100         }
101
102         exit(-1);
103 }
104
105 #endif