NdbMutex.h
上传用户:romrleung
上传日期:2022-05-23
资源大小:18897k
文件大小:3k
源码类别:

MySQL数据库

开发平台:

Visual C++

  1. /* Copyright (C) 2003 MySQL AB
  2.    This program is free software; you can redistribute it and/or modify
  3.    it under the terms of the GNU General Public License as published by
  4.    the Free Software Foundation; either version 2 of the License, or
  5.    (at your option) any later version.
  6.    This program is distributed in the hope that it will be useful,
  7.    but WITHOUT ANY WARRANTY; without even the implied warranty of
  8.    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  9.    GNU General Public License for more details.
  10.    You should have received a copy of the GNU General Public License
  11.    along with this program; if not, write to the Free Software
  12.    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA */
  13. #ifndef NDB_MUTEX_H
  14. #define NDB_MUTEX_H
  15. #include <ndb_global.h>
  16. #ifdef NDB_WIN32
  17. #include <winsock2.h>
  18. #include <ws2tcpip.h>
  19. #endif
  20. #ifdef __cplusplus
  21. extern "C" {
  22. #endif
  23. #if defined NDB_OSE || defined NDB_SOFTOSE
  24. #include <ose.h>
  25. typedef SEMAPHORE NdbMutex;
  26. #elif defined NDB_WIN32
  27. typedef CRITICAL_SECTION NdbMutex;
  28. #else
  29. #include <pthread.h>
  30. typedef pthread_mutex_t NdbMutex;
  31. #endif
  32. /**
  33.  * Create a mutex
  34.  *
  35.  * p_mutex: pointer to the mutex structure
  36.  * returnvalue: pointer to the mutex structure
  37.  */
  38. NdbMutex* NdbMutex_Create(void);
  39. /**
  40.  * Destroy a mutex
  41.  *
  42.  * * p_mutex: pointer to the mutex structure
  43.  * * returnvalue: 0 = succeeded, -1 = failed
  44.  */
  45. int NdbMutex_Destroy(NdbMutex* p_mutex);
  46. /**
  47.  * Lock a mutex
  48.  *
  49.  * * p_mutex: pointer to the mutex structure
  50.  * * returnvalue: 0 = succeeded, -1 = failed
  51.  */
  52. int NdbMutex_Lock(NdbMutex* p_mutex);
  53. /**
  54.  * Unlock a mutex
  55.  *
  56.  * * p_mutex: pointer to the mutex structure
  57.  * * returnvalue: 0 = succeeded, -1 = failed
  58.  */
  59. int NdbMutex_Unlock(NdbMutex* p_mutex);
  60. /**
  61.  * Try to lock a mutex
  62.  *
  63.  * * p_mutex: pointer to the mutex structure
  64.  * * returnvalue: 0 = succeeded, -1 = failed
  65.  */
  66. int NdbMutex_Trylock(NdbMutex* p_mutex);
  67. #ifdef __cplusplus
  68. }
  69. #endif
  70. #ifdef __cplusplus
  71. class NdbLockable {
  72.   friend class Guard;
  73. public:
  74.   NdbLockable() { m_mutex = NdbMutex_Create(); }
  75.   ~NdbLockable() { NdbMutex_Destroy(m_mutex); }
  76.   
  77.   void lock() { NdbMutex_Lock(m_mutex); }
  78.   void unlock(){ NdbMutex_Unlock(m_mutex);}
  79.   bool tryLock(){ return NdbMutex_Trylock(m_mutex) == 0;}
  80.   
  81.   NdbMutex* getMutex() {return m_mutex;};
  82. protected:
  83.   NdbMutex * m_mutex;
  84. };
  85. class Guard {
  86. public:
  87.   Guard(NdbMutex *mtx) : m_mtx(mtx) { NdbMutex_Lock(m_mtx); };
  88.   Guard(NdbLockable & l) : m_mtx(l.m_mutex) { NdbMutex_Lock(m_mtx); }; 
  89.   ~Guard() { NdbMutex_Unlock(m_mtx); };
  90. private:
  91.   NdbMutex *m_mtx;
  92. };
  93. #endif
  94. #endif