PageRenderTime 46ms CodeModel.GetById 21ms RepoModel.GetById 0ms app.codeStats 0ms

/trunk/Examples/test-suite/swig_examples_lock.h

#
C++ Header | 70 lines | 55 code | 14 blank | 1 comment | 2 complexity | 81c54ce8755f1fcecd301b3408ed8e16 MD5 | raw file
Possible License(s): LGPL-2.1, Cube, GPL-3.0, 0BSD, GPL-2.0
  1. # if defined(_WIN32) || defined(__WIN32__)
  2. #include <windows.h>
  3. namespace SwigExamples {
  4. class CriticalSection {
  5. public:
  6. CriticalSection() {
  7. InitializeCriticalSection(&mutex_);
  8. }
  9. ~CriticalSection() {
  10. DeleteCriticalSection(&mutex_);
  11. }
  12. CRITICAL_SECTION mutex_;
  13. };
  14. struct Lock {
  15. Lock(CriticalSection &cs) : critical_section(cs) {
  16. EnterCriticalSection(&critical_section.mutex_);
  17. }
  18. ~Lock() {
  19. LeaveCriticalSection(&critical_section.mutex_);
  20. }
  21. private:
  22. CriticalSection &critical_section;
  23. };
  24. }
  25. #else
  26. #include <pthread.h>
  27. #ifndef PTHREAD_MUTEX_RECURSIVE_NP
  28. // For Cygwin and possibly other OSs: _NP is "non-portable"
  29. #define PTHREAD_MUTEX_RECURSIVE_NP PTHREAD_MUTEX_RECURSIVE
  30. #endif
  31. namespace SwigExamples {
  32. class CriticalSection {
  33. public:
  34. CriticalSection() {
  35. pthread_mutexattr_t mutexattr;
  36. pthread_mutexattr_settype(&mutexattr, PTHREAD_MUTEX_RECURSIVE_NP);
  37. pthread_mutex_init(&mutex_, &mutexattr);
  38. pthread_mutexattr_destroy(&mutexattr);
  39. }
  40. ~CriticalSection() {
  41. pthread_mutex_destroy (&mutex_);
  42. }
  43. pthread_mutex_t mutex_;
  44. };
  45. struct Lock {
  46. Lock(CriticalSection &cs) : critical_section(cs) {
  47. pthread_mutex_lock (&critical_section.mutex_);
  48. }
  49. ~Lock() {
  50. pthread_mutex_unlock (&critical_section.mutex_);
  51. }
  52. private:
  53. CriticalSection &critical_section;
  54. };
  55. }
  56. #endif