12 inline std::string itos(int i) {
13 std::ostringstream strout;
18 // n : number of significant digits
19 inline std::string ftos(double f, int n) {
20 std::ostringstream strout;
21 strout<<std::setprecision(n)<<f;
25 inline std::string ctos(char c) {
26 return std::string(1, c);
29 inline std::string cstrtos(const char* s) {
30 return std::string(s);
34 inline void general_assert(int expr, const std::string& errmsg, bool putEnter = false) {
37 if (putEnter) printf("\n");
38 fprintf(stderr, "%s\n", errmsg.c_str());
42 inline void pthread_assert(int rc, const std::string& func_name, const std::string& errmsg) {
45 fprintf(stderr, "%s\n", errmsg.c_str());
47 if (func_name == "pthread_create") {
50 fprintf(stderr, "Error code: EAGAIN. Insufficient resources to create another thread, or a system-imposed limit on the number of threads was encountered.\n");
53 fprintf(stderr, "Error code: EINVAL. Invalid settings in attr.\n");
56 fprintf(stderr, "Error code: EPERM. No permission to set the scheduling policy and parameters specified in attr.\n");
58 default: fprintf(stderr, "Unknown error code: %d.\n", rc);
60 } else if (func_name == "pthread_join") {
63 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");
66 fprintf(stderr, "Error code: EINVAL. The implementation has detected that the value specified by thread_id does not refer to a joinable thread.\n");
69 fprintf(stderr, "Error code: ESRCH. No thread with thread_id could be found.\n");
71 default: fprintf(stderr, "Unknown error code: %d.\n", rc);
73 } else if (func_name == "pthread_mutex_lock") {
76 fprintf(stderr, "Error code: EAGAIN. The mutex could not be acquired because the maximum number of recursive locks for mutex has been exceeded.\n");
79 fprintf(stderr, "Error code: EDEADLK. The current thread already owns the mutex.\n");
82 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");
84 default: fprintf(stderr, "Unknown error code: %d.\n", rc);
86 } else if (func_name == "pthread_mutex_unlock") {
89 fprintf(stderr, "Error code: EAGAIN. The mutex could not be acquired because the maximum number of recursive locks for mutex has been exceeded.\n");
92 fprintf(stderr, "Error code: EINVAL. The value specified by mutex does not refer to an initialized mutex object.\n");
95 fprintf(stderr, "Error code: EPERM. The current thread does not own the mutex.\n");
97 default: fprintf(stderr, "Unknown error code: %d.\n", rc);
100 fprintf(stderr, "Unknown function name: %s.\n", func_name.c_str());