herr.cpp 1.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. #include "herr.h"
  2. #include <string.h> // for strerror
  3. #include <map>
  4. #include "hthread.h" // for gettid
  5. #define SYS_NERR 133
  6. // id => errcode
  7. static std::map<int, int> s_mapErr;
  8. void set_id_errcode(int id, int errcode) {
  9. s_mapErr[id] = errcode;
  10. }
  11. int get_id_errcode(int id) {
  12. auto iter = s_mapErr.find(id);
  13. if (iter != s_mapErr.end()) {
  14. // note: erase after get
  15. s_mapErr.erase(iter);
  16. return iter->second;
  17. }
  18. return ERR_OK;
  19. }
  20. void set_last_errcode(int errcode) {
  21. #if defined(OS_WIN) || defined(OS_LINUX)
  22. int id = gettid();
  23. #else
  24. int id = getpid();
  25. #endif
  26. set_id_errcode(id, errcode);
  27. }
  28. int get_last_errcode() {
  29. #if defined(OS_WIN) || defined(OS_LINUX)
  30. int id = gettid();
  31. #else
  32. int id = getpid();
  33. #endif
  34. return get_id_errcode(id);
  35. }
  36. const char* get_errmsg(int err) {
  37. if (err >= 0 && err <= SYS_NERR) {
  38. return strerror(err);
  39. }
  40. switch (err) {
  41. #define CASE_ERR(macro, errcode, errmsg) \
  42. case errcode: \
  43. return errmsg;
  44. FOREACH_ERR(CASE_ERR)
  45. #undef CASE_ERR
  46. default:
  47. return "Undefined error";
  48. }
  49. }