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

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. #include "SimulatedBlock.hpp"
  14. #include "Mutex.hpp"
  15. #include <signaldata/UtilLock.hpp>
  16. SimulatedBlock::MutexManager::MutexManager(class SimulatedBlock & block) 
  17.   : m_block(block),
  18.     m_activeMutexes(m_mutexPool) {
  19. }
  20.   
  21. bool
  22. SimulatedBlock::MutexManager::setSize(Uint32 maxNoOfActiveMutexes){
  23.   return m_mutexPool.setSize(maxNoOfActiveMutexes);
  24. }
  25. Uint32
  26. SimulatedBlock::MutexManager::getSize() const {
  27.   return m_mutexPool.getSize();
  28. }
  29. bool
  30. SimulatedBlock::MutexManager::seize(ActiveMutexPtr& ptr){
  31.   return m_activeMutexes.seize(ptr);
  32. }
  33. void
  34. SimulatedBlock::MutexManager::release(Uint32 activeMutexPtrI){
  35.   m_activeMutexes.release(activeMutexPtrI);
  36. }
  37. void
  38. SimulatedBlock::MutexManager::getPtr(ActiveMutexPtr& ptr){
  39.   m_activeMutexes.getPtr(ptr);
  40. }
  41. BlockReference
  42. SimulatedBlock::MutexManager::reference() const { 
  43.   return m_block.reference(); 
  44. }
  45. void
  46. SimulatedBlock::MutexManager::progError(int line, 
  47. int err_code, 
  48. const char* extra)
  49. {
  50.   m_block.progError(line, err_code, extra); 
  51. }
  52. void
  53. SimulatedBlock::MutexManager::create(Signal* signal, ActiveMutexPtr& ptr){
  54.   
  55.   UtilCreateLockReq * req = (UtilCreateLockReq*)signal->getDataPtrSend();
  56.   req->senderData = ptr.i;
  57.   req->senderRef = m_block.reference();
  58.   req->lockId = ptr.p->m_mutexId;
  59.   req->lockType = UtilCreateLockReq::Mutex;
  60.   m_block.sendSignal(DBUTIL_REF, 
  61.      GSN_UTIL_CREATE_LOCK_REQ, 
  62.      signal,
  63.      UtilCreateLockReq::SignalLength,
  64.      JBB);
  65.   ptr.p->m_gsn = GSN_UTIL_CREATE_LOCK_REQ;
  66. }
  67. void
  68. SimulatedBlock::MutexManager::execUTIL_CREATE_LOCK_REF(Signal* signal){
  69.   UtilCreateLockRef * ref = (UtilCreateLockRef*)signal->getDataPtr();
  70.   ActiveMutexPtr ptr;
  71.   m_activeMutexes.getPtr(ptr, ref->senderData);
  72.   ndbrequire(ptr.p->m_gsn == GSN_UTIL_CREATE_LOCK_REQ);
  73.   ndbrequire(ptr.p->m_mutexId == ref->lockId);
  74.   ptr.p->m_gsn = 0;
  75.   m_block.execute(signal, ptr.p->m_callback, ref->errorCode);
  76. }
  77. void 
  78. SimulatedBlock::MutexManager::execUTIL_CREATE_LOCK_CONF(Signal* signal){
  79.   UtilCreateLockConf * conf = (UtilCreateLockConf*)signal->getDataPtr();
  80.   ActiveMutexPtr ptr;
  81.   m_activeMutexes.getPtr(ptr, conf->senderData);
  82.   ndbrequire(ptr.p->m_gsn == GSN_UTIL_CREATE_LOCK_REQ);
  83.   ndbrequire(ptr.p->m_mutexId == conf->lockId);
  84.   ptr.p->m_gsn = 0;
  85.   m_block.execute(signal, ptr.p->m_callback, 0);
  86. }
  87. void
  88. SimulatedBlock::MutexManager::destroy(Signal* signal, ActiveMutexPtr& ptr){
  89.   UtilDestroyLockReq * req = (UtilDestroyLockReq*)signal->getDataPtrSend();
  90.   req->senderData = ptr.i;
  91.   req->senderRef = m_block.reference();
  92.   req->lockId = ptr.p->m_mutexId;
  93.   req->lockKey = ptr.p->m_mutexKey;
  94.   m_block.sendSignal(DBUTIL_REF, 
  95.      GSN_UTIL_DESTROY_LOCK_REQ, 
  96.      signal,
  97.      UtilDestroyLockReq::SignalLength,
  98.      JBB);
  99.   ptr.p->m_gsn = GSN_UTIL_DESTROY_LOCK_REQ;
  100. }
  101. void
  102. SimulatedBlock::MutexManager::execUTIL_DESTORY_LOCK_REF(Signal* signal){
  103.   UtilDestroyLockRef * ref = (UtilDestroyLockRef*)signal->getDataPtr();
  104.   ActiveMutexPtr ptr;
  105.   m_activeMutexes.getPtr(ptr, ref->senderData);
  106.   ndbrequire(ptr.p->m_gsn == GSN_UTIL_DESTROY_LOCK_REQ);
  107.   ndbrequire(ptr.p->m_mutexId == ref->lockId);
  108.   ptr.p->m_gsn = 0;
  109.   m_block.execute(signal, ptr.p->m_callback, ref->errorCode);
  110. }
  111. void
  112. SimulatedBlock::MutexManager::execUTIL_DESTORY_LOCK_CONF(Signal* signal){
  113.   UtilDestroyLockConf * conf = (UtilDestroyLockConf*)signal->getDataPtr();
  114.   ActiveMutexPtr ptr;
  115.   m_activeMutexes.getPtr(ptr, conf->senderData);
  116.   ndbrequire(ptr.p->m_gsn == GSN_UTIL_DESTROY_LOCK_REQ);
  117.   ndbrequire(ptr.p->m_mutexId == conf->lockId);
  118.   ptr.p->m_gsn = 0;
  119.   m_block.execute(signal, ptr.p->m_callback, 0);
  120. }
  121. void 
  122. SimulatedBlock::MutexManager::lock(Signal* signal, ActiveMutexPtr& ptr){
  123.   UtilLockReq * req = (UtilLockReq*)signal->getDataPtrSend();
  124.   req->senderData = ptr.i;
  125.   req->senderRef = m_block.reference();
  126.   req->lockId = ptr.p->m_mutexId;
  127.   req->requestInfo = 0;
  128.   
  129.   m_block.sendSignal(DBUTIL_REF, 
  130.      GSN_UTIL_LOCK_REQ, 
  131.      signal,
  132.      UtilLockReq::SignalLength,
  133.      JBB);
  134.   
  135.   ptr.p->m_gsn = GSN_UTIL_LOCK_REQ;
  136. }
  137. void 
  138. SimulatedBlock::MutexManager::trylock(Signal* signal, ActiveMutexPtr& ptr){
  139.   UtilLockReq * req = (UtilLockReq*)signal->getDataPtrSend();
  140.   req->senderData = ptr.i;
  141.   req->senderRef = m_block.reference();
  142.   req->lockId = ptr.p->m_mutexId;
  143.   req->requestInfo = UtilLockReq::TryLock;
  144.   
  145.   m_block.sendSignal(DBUTIL_REF, 
  146.      GSN_UTIL_LOCK_REQ, 
  147.      signal,
  148.      UtilLockReq::SignalLength,
  149.      JBB);
  150.   
  151.   ptr.p->m_gsn = GSN_UTIL_LOCK_REQ;
  152. }
  153. void
  154. SimulatedBlock::MutexManager::execUTIL_LOCK_REF(Signal* signal){
  155.   UtilLockRef * ref = (UtilLockRef*)signal->getDataPtr();
  156.   ActiveMutexPtr ptr;
  157.   m_activeMutexes.getPtr(ptr, ref->senderData);
  158.   ndbrequire(ptr.p->m_gsn == GSN_UTIL_LOCK_REQ);
  159.   ndbrequire(ptr.p->m_mutexId == ref->lockId);
  160.   ptr.p->m_gsn = 0;
  161.   m_block.execute(signal, ptr.p->m_callback, ref->errorCode);
  162. }
  163. void
  164. SimulatedBlock::MutexManager::execUTIL_LOCK_CONF(Signal* signal){
  165.   UtilLockConf * conf = (UtilLockConf*)signal->getDataPtr();
  166.   ActiveMutexPtr ptr;
  167.   m_activeMutexes.getPtr(ptr, conf->senderData);
  168.   ndbrequire(ptr.p->m_gsn == GSN_UTIL_LOCK_REQ);
  169.   ndbrequire(ptr.p->m_mutexId == conf->lockId);
  170.   ptr.p->m_mutexKey = conf->lockKey;
  171.   ptr.p->m_gsn = 0;
  172.   m_block.execute(signal, ptr.p->m_callback, 0);
  173. }
  174. void 
  175. SimulatedBlock::MutexManager::unlock(Signal* signal, ActiveMutexPtr& ptr){
  176.   UtilUnlockReq * req = (UtilUnlockReq*)signal->getDataPtrSend();
  177.   req->senderData = ptr.i;
  178.   req->senderRef = m_block.reference();
  179.   req->lockId = ptr.p->m_mutexId;
  180.   req->lockKey = ptr.p->m_mutexKey;
  181.   
  182.   m_block.sendSignal(DBUTIL_REF, 
  183.      GSN_UTIL_UNLOCK_REQ, 
  184.      signal,
  185.      UtilUnlockReq::SignalLength,
  186.      JBB);
  187.   
  188.   ptr.p->m_gsn = GSN_UTIL_UNLOCK_REQ;
  189. }
  190. void
  191. SimulatedBlock::MutexManager::execUTIL_UNLOCK_REF(Signal* signal){
  192.   UtilUnlockRef * ref = (UtilUnlockRef*)signal->getDataPtr();
  193.   ActiveMutexPtr ptr;
  194.   m_activeMutexes.getPtr(ptr, ref->senderData);
  195.   ndbrequire(ptr.p->m_gsn == GSN_UTIL_UNLOCK_REQ);
  196.   ndbrequire(ptr.p->m_mutexId == ref->lockId);
  197.   ptr.p->m_gsn = 0;
  198.   m_block.execute(signal, ptr.p->m_callback, ref->errorCode);
  199. }
  200. void
  201. SimulatedBlock::MutexManager::execUTIL_UNLOCK_CONF(Signal* signal){
  202.   UtilUnlockConf * conf = (UtilUnlockConf*)signal->getDataPtr();
  203.   ActiveMutexPtr ptr;
  204.   m_activeMutexes.getPtr(ptr, conf->senderData);
  205.   ndbrequire(ptr.p->m_gsn == GSN_UTIL_UNLOCK_REQ);
  206.   ndbrequire(ptr.p->m_mutexId == conf->lockId);
  207.   ptr.p->m_gsn = 0;
  208.   m_block.execute(signal, ptr.p->m_callback, 0);
  209. }
  210. void
  211. Mutex::release(SimulatedBlock::MutexManager& mgr, 
  212.        Uint32 activePtrI, Uint32 mutexId){
  213.   SimulatedBlock::MutexManager::ActiveMutexPtr ptr;
  214.   ptr.i = activePtrI;
  215.   mgr.getPtr(ptr);
  216.   if(ptr.p->m_gsn == 0 && ptr.p->m_mutexId == mutexId){
  217.     mgr.release(activePtrI);
  218.     return;
  219.   }
  220.   
  221.   if(ptr.p->m_mutexId != mutexId)
  222.     ErrorReporter::handleAssert("MutexHandle::release invalid handle", 
  223. __FILE__, __LINE__);
  224.   ErrorReporter::handleAssert("MutexHandle::release of mutex inuse", 
  225.       __FILE__, __LINE__);
  226. }
  227. void
  228. Mutex::unlock(){
  229.   if(!m_ptr.isNull()){
  230.     m_mgr.getPtr(m_ptr);
  231.     if(m_ptr.p->m_mutexId == m_mutexId){
  232.       SimulatedBlock::Callback c = 
  233. { &SimulatedBlock::ignoreMutexUnlockCallback, m_ptr.i };
  234.       m_ptr.p->m_callback = c;
  235.       m_mgr.unlock(m_signal, m_ptr);
  236.       m_ptr.setNull(); // Remove reference
  237.     }
  238.   }
  239. }