Fu Juntang
2021-09-17 5c912c70e9333298ff48f7ea15424f72ca977b99
src/bus_error.cpp
@@ -11,14 +11,21 @@
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"
};
@@ -42,7 +49,7 @@
}
char *
bus_strerror(int err)
bus_strerror(int err, int flag)
{
  int s;
  char *buf;
@@ -57,15 +64,23 @@
  {
    /* 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错误
@@ -95,3 +110,33 @@
  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;
}