2
0

rw_lock_posix.cpp 1.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. #if defined(UNIX_ENABLED) || defined(PTHREAD_ENABLED)
  2. #include "os/memory.h"
  3. #include "rw_lock_posix.h"
  4. #include "error_macros.h"
  5. #include <stdio.h>
  6. void RWLockPosix::read_lock() {
  7. int err =pthread_rwlock_rdlock(&rwlock);
  8. if (err!=0) {
  9. perror("wtf: ");
  10. }
  11. ERR_FAIL_COND(err!=0);
  12. }
  13. void RWLockPosix::read_unlock() {
  14. pthread_rwlock_unlock(&rwlock);
  15. }
  16. Error RWLockPosix::read_try_lock() {
  17. if (pthread_rwlock_tryrdlock(&rwlock)!=0) {
  18. return ERR_BUSY;
  19. } else {
  20. return OK;
  21. }
  22. }
  23. void RWLockPosix::write_lock() {
  24. int err = pthread_rwlock_wrlock(&rwlock);
  25. ERR_FAIL_COND(err!=0);
  26. }
  27. void RWLockPosix::write_unlock() {
  28. pthread_rwlock_unlock(&rwlock);
  29. }
  30. Error RWLockPosix::write_try_lock() {
  31. if (pthread_rwlock_trywrlock(&rwlock)!=0) {
  32. return ERR_BUSY;
  33. } else {
  34. return OK;
  35. }
  36. }
  37. RWLock *RWLockPosix::create_func_posix() {
  38. return memnew( RWLockPosix );
  39. }
  40. void RWLockPosix::make_default() {
  41. create_func=create_func_posix;
  42. }
  43. RWLockPosix::RWLockPosix() {
  44. //rwlock=PTHREAD_RWLOCK_INITIALIZER; fails on OSX
  45. pthread_rwlock_init(&rwlock,NULL);
  46. }
  47. RWLockPosix::~RWLockPosix() {
  48. pthread_rwlock_destroy(&rwlock);
  49. }
  50. #endif