| | |
| | | static pthread_key_t strerrorKey; |
| | | |
| | | |
| | | static char *_bus_errlist[_bus_nerr] = { |
| | | static const char *_bus_errlist[_bus_nerr] = { |
| | | "\0", |
| | | "Timed out", |
| | | "The other end is not inline", |
| | | "Key already in use", |
| | | "Network fault", |
| | | "Send to self error", |
| | | "Receive from wrong end" |
| | | "Receive from wrong end", |
| | | "Service stoped", |
| | | "Exceed resource limit", |
| | | "Service not supported", |
| | | "Resource busy", |
| | | "Resource not provide", |
| | | "Invalid parameters", |
| | | "No enough memory" |
| | | |
| | | }; |
| | | |
| | |
| | | } |
| | | |
| | | char * |
| | | bus_strerror(int err) |
| | | bus_strerror(int err, int flag) |
| | | { |
| | | int s; |
| | | char *buf; |
| | |
| | | { |
| | | /* If first call from this thread, allocate |
| | | buffer for thread, and save its location */ |
| | | buf = (char *)malloc(MAX_ERROR_LEN); |
| | | buf = (char *)malloc(MAX_ERROR_LEN + sizeof(int)); |
| | | if (buf == NULL) |
| | | err_exit(errno, "malloc"); |
| | | |
| | | memset(buf, 0x00, MAX_ERROR_LEN + sizeof(int)); |
| | | s = pthread_setspecific(strerrorKey, buf); |
| | | if (s != 0) |
| | | err_exit(s, "pthread_setspecific"); |
| | | } |
| | | |
| | | if (flag != 0) { |
| | | err = *(int *)(buf + MAX_ERROR_LEN); |
| | | } |
| | | |
| | | if (err == 0) { |
| | | err = EBUS_BASE; |
| | | } |
| | | |
| | | if(err < EBUS_BASE) { |
| | | // libc错误 |
| | |
| | | |
| | | return buf; |
| | | } |
| | | |
| | | void bus_errorset(int err) |
| | | { |
| | | int s; |
| | | char *buf; |
| | | /* Make first caller allocate key for thread-specific data */ |
| | | s = pthread_once(&once, createKey); |
| | | if (s != 0) |
| | | err_exit(s, "pthread_once"); |
| | | |
| | | buf = (char *)pthread_getspecific(strerrorKey); |
| | | if (buf == NULL) |
| | | { |
| | | /* If first call from this thread, allocate |
| | | buffer for thread, and save its location */ |
| | | buf = (char *)malloc(MAX_ERROR_LEN + sizeof(int)); |
| | | if (buf == NULL) |
| | | err_exit(errno, "malloc"); |
| | | |
| | | s = pthread_setspecific(strerrorKey, buf); |
| | | if (s != 0) |
| | | err_exit(s, "pthread_setspecific"); |
| | | } |
| | | |
| | | *(int *)(buf + MAX_ERROR_LEN) = err; |
| | | |
| | | } |
| | | |
| | | |
| | | |