dlc.cpp 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. #include "macro.h"
  2. #include "dlc.h"
  3. using namespace aFuntool;
  4. static DlcHandle *dlc_l = nullptr;
  5. /**
  6. * 打开动态库
  7. * @param file 动态库路径
  8. * @param mode 模式
  9. * @return
  10. */
  11. DlcHandle *aFuntool::openLibrary(const char *file, int mode) {
  12. void *handle = dlopen(file, mode);
  13. DlcHandle *dlc;
  14. if (handle == nullptr)
  15. return nullptr;
  16. for (struct DlcHandle *tmp = dlc_l; tmp != nullptr; tmp = tmp->next) {
  17. if (tmp->handle == handle) {
  18. dlclose(handle); // 减少dlopen时对handle的引用计数
  19. tmp++;
  20. return tmp;
  21. }
  22. }
  23. dlc = new DlcHandle(handle);
  24. dlc->next = dlc_l;
  25. dlc->prev = nullptr;
  26. if (dlc_l != nullptr)
  27. dlc_l->prev = dlc;
  28. dlc_l = dlc;
  29. return dlc;
  30. }
  31. aFuntool::DlcHandle::DlcHandle(void *handle){
  32. this->handle = handle;
  33. this->link = 1;
  34. this->next = nullptr;
  35. this->prev = nullptr;
  36. }
  37. aFuntool::DlcHandle::~DlcHandle() {
  38. dlclose(handle);
  39. if (prev == nullptr)
  40. dlc_l = next;
  41. else
  42. prev->next = next;
  43. if (next != nullptr)
  44. next->prev = prev;
  45. }
  46. void aFuntool::DlcHandle::close() {
  47. this->operator--(1);
  48. }
  49. int aFuntool::DlcHandle::operator++(int){
  50. return link++;
  51. }
  52. int aFuntool::DlcHandle::operator--(int){
  53. int ret = link--;
  54. if (link == 0)
  55. delete this; // 删除自己
  56. return ret;
  57. }
  58. /**
  59. * 退出函数
  60. * 需要使用at_exit注册
  61. */
  62. void aFuntool::dlcExit() {
  63. while (dlc_l != nullptr) {
  64. auto next = dlc_l->next;
  65. free(dlc_l);
  66. dlc_l = next;
  67. }
  68. }