threading_Lock.c 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849
  1. #include "threading_Lock.h"
  2. #include "PikaPlatformEx.h"
  3. void threading_Lock___del__(PikaObj* self) {
  4. pika_platform_thread_mutex_t* m = obj_getPtr(self, "_mutex_");
  5. // pika_platform_thread_mutex_unlock(m);
  6. pika_platform_thread_mutex_destroy(m);
  7. pikaFree(m, sizeof(pika_platform_thread_mutex_t));
  8. }
  9. void threading_Lock___init__(PikaObj* self) {
  10. pika_platform_thread_mutex_t* m =
  11. pikaMalloc(sizeof(pika_platform_thread_mutex_t));
  12. pika_platform_thread_mutex_init(m);
  13. obj_setPtr(self, "_mutex_", m);
  14. }
  15. pika_bool threading_Lock_acquire(PikaObj* self, pika_bool block, Arg* timeout) {
  16. pika_platform_thread_mutex_t* m = obj_getPtr(self, "_mutex_");
  17. int result = pika_platform_thread_mutex_timedlock(m, block, timeout);
  18. if (result == PIKA_RES_ERR_INVALID_PARAM) {
  19. obj_setErrorCode(self, PIKA_RES_ERR_INVALID_PARAM);
  20. obj_setSysOut(self, "invalid param!");
  21. }
  22. return result == 0 ? pika_true : pika_false;
  23. }
  24. pika_bool threading_Lock_locked(PikaObj* self) {
  25. pika_platform_thread_mutex_t* m = obj_getPtr(self, "_mutex_");
  26. pika_GIL_EXIT();
  27. int result = pika_platform_thread_mutex_trylock(m);
  28. pika_GIL_ENTER();
  29. if (result == 0) {
  30. // 成功获得了锁,需要解锁
  31. // pika_GIL_EXIT();
  32. pika_platform_thread_mutex_unlock(m);
  33. // pika_GIL_ENTER();/* */
  34. return pika_false; // 锁未被占用/* */
  35. } else {
  36. // 锁已被占用或发生了其他错误
  37. // perror("pthread_mutex_trylock");
  38. return pika_true;
  39. }
  40. }
  41. void threading_Lock_release(PikaObj* self) {
  42. pika_platform_thread_mutex_t* m = obj_getPtr(self, "_mutex_");
  43. // pika_GIL_EXIT();
  44. pika_platform_thread_mutex_unlock(m);
  45. // pika_GIL_ENTER();
  46. }