⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mutex.cpp

📁 mysql-5.0.22.tar.gz源码包
💻 CPP
字号:
/* Copyright (C) 2003 MySQL AB   This program is free software; you can redistribute it and/or modify   it under the terms of the GNU General Public License as published by   the Free Software Foundation; either version 2 of the License, or   (at your option) any later version.   This program is distributed in the hope that it will be useful,   but WITHOUT ANY WARRANTY; without even the implied warranty of   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the   GNU General Public License for more details.   You should have received a copy of the GNU General Public License   along with this program; if not, write to the Free Software   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA */#include "SimulatedBlock.hpp"#include "Mutex.hpp"#include <signaldata/UtilLock.hpp>SimulatedBlock::MutexManager::MutexManager(class SimulatedBlock & block)   : m_block(block),    m_activeMutexes(m_mutexPool) {}  boolSimulatedBlock::MutexManager::setSize(Uint32 maxNoOfActiveMutexes){  return m_mutexPool.setSize(maxNoOfActiveMutexes);}Uint32SimulatedBlock::MutexManager::getSize() const {  return m_mutexPool.getSize();}boolSimulatedBlock::MutexManager::seize(ActiveMutexPtr& ptr){  return m_activeMutexes.seize(ptr);}voidSimulatedBlock::MutexManager::release(Uint32 activeMutexPtrI){  m_activeMutexes.release(activeMutexPtrI);}voidSimulatedBlock::MutexManager::getPtr(ActiveMutexPtr& ptr){  m_activeMutexes.getPtr(ptr);}BlockReferenceSimulatedBlock::MutexManager::reference() const {   return m_block.reference(); }voidSimulatedBlock::MutexManager::progError(int line, 					int err_code, 					const char* extra){  m_block.progError(line, err_code, extra); }voidSimulatedBlock::MutexManager::create(Signal* signal, ActiveMutexPtr& ptr){    UtilCreateLockReq * req = (UtilCreateLockReq*)signal->getDataPtrSend();  req->senderData = ptr.i;  req->senderRef = m_block.reference();  req->lockId = ptr.p->m_mutexId;  req->lockType = UtilCreateLockReq::Mutex;  m_block.sendSignal(DBUTIL_REF, 		     GSN_UTIL_CREATE_LOCK_REQ, 		     signal,		     UtilCreateLockReq::SignalLength,		     JBB);  ptr.p->m_gsn = GSN_UTIL_CREATE_LOCK_REQ;}voidSimulatedBlock::MutexManager::execUTIL_CREATE_LOCK_REF(Signal* signal){  UtilCreateLockRef * ref = (UtilCreateLockRef*)signal->getDataPtr();  ActiveMutexPtr ptr;  m_activeMutexes.getPtr(ptr, ref->senderData);  ndbrequire(ptr.p->m_gsn == GSN_UTIL_CREATE_LOCK_REQ);  ndbrequire(ptr.p->m_mutexId == ref->lockId);  ptr.p->m_gsn = 0;  m_block.execute(signal, ptr.p->m_callback, ref->errorCode);}void SimulatedBlock::MutexManager::execUTIL_CREATE_LOCK_CONF(Signal* signal){  UtilCreateLockConf * conf = (UtilCreateLockConf*)signal->getDataPtr();  ActiveMutexPtr ptr;  m_activeMutexes.getPtr(ptr, conf->senderData);  ndbrequire(ptr.p->m_gsn == GSN_UTIL_CREATE_LOCK_REQ);  ndbrequire(ptr.p->m_mutexId == conf->lockId);  ptr.p->m_gsn = 0;  m_block.execute(signal, ptr.p->m_callback, 0);}voidSimulatedBlock::MutexManager::destroy(Signal* signal, ActiveMutexPtr& ptr){  UtilDestroyLockReq * req = (UtilDestroyLockReq*)signal->getDataPtrSend();  req->senderData = ptr.i;  req->senderRef = m_block.reference();  req->lockId = ptr.p->m_mutexId;  req->lockKey = ptr.p->m_mutexKey;  m_block.sendSignal(DBUTIL_REF, 		     GSN_UTIL_DESTROY_LOCK_REQ, 		     signal,		     UtilDestroyLockReq::SignalLength,		     JBB);  ptr.p->m_gsn = GSN_UTIL_DESTROY_LOCK_REQ;}voidSimulatedBlock::MutexManager::execUTIL_DESTORY_LOCK_REF(Signal* signal){  UtilDestroyLockRef * ref = (UtilDestroyLockRef*)signal->getDataPtr();  ActiveMutexPtr ptr;  m_activeMutexes.getPtr(ptr, ref->senderData);  ndbrequire(ptr.p->m_gsn == GSN_UTIL_DESTROY_LOCK_REQ);  ndbrequire(ptr.p->m_mutexId == ref->lockId);  ptr.p->m_gsn = 0;  m_block.execute(signal, ptr.p->m_callback, ref->errorCode);}voidSimulatedBlock::MutexManager::execUTIL_DESTORY_LOCK_CONF(Signal* signal){  UtilDestroyLockConf * conf = (UtilDestroyLockConf*)signal->getDataPtr();  ActiveMutexPtr ptr;  m_activeMutexes.getPtr(ptr, conf->senderData);  ndbrequire(ptr.p->m_gsn == GSN_UTIL_DESTROY_LOCK_REQ);  ndbrequire(ptr.p->m_mutexId == conf->lockId);  ptr.p->m_gsn = 0;  m_block.execute(signal, ptr.p->m_callback, 0);}void SimulatedBlock::MutexManager::lock(Signal* signal, ActiveMutexPtr& ptr){  UtilLockReq * req = (UtilLockReq*)signal->getDataPtrSend();  req->senderData = ptr.i;  req->senderRef = m_block.reference();  req->lockId = ptr.p->m_mutexId;  req->requestInfo = 0;    m_block.sendSignal(DBUTIL_REF, 		     GSN_UTIL_LOCK_REQ, 		     signal,		     UtilLockReq::SignalLength,		     JBB);    ptr.p->m_gsn = GSN_UTIL_LOCK_REQ;}void SimulatedBlock::MutexManager::trylock(Signal* signal, ActiveMutexPtr& ptr){  UtilLockReq * req = (UtilLockReq*)signal->getDataPtrSend();  req->senderData = ptr.i;  req->senderRef = m_block.reference();  req->lockId = ptr.p->m_mutexId;  req->requestInfo = UtilLockReq::TryLock;    m_block.sendSignal(DBUTIL_REF, 		     GSN_UTIL_LOCK_REQ, 		     signal,		     UtilLockReq::SignalLength,		     JBB);    ptr.p->m_gsn = GSN_UTIL_LOCK_REQ;}voidSimulatedBlock::MutexManager::execUTIL_LOCK_REF(Signal* signal){  UtilLockRef * ref = (UtilLockRef*)signal->getDataPtr();  ActiveMutexPtr ptr;  m_activeMutexes.getPtr(ptr, ref->senderData);  ndbrequire(ptr.p->m_gsn == GSN_UTIL_LOCK_REQ);  ndbrequire(ptr.p->m_mutexId == ref->lockId);  ptr.p->m_gsn = 0;  m_block.execute(signal, ptr.p->m_callback, ref->errorCode);}voidSimulatedBlock::MutexManager::execUTIL_LOCK_CONF(Signal* signal){  UtilLockConf * conf = (UtilLockConf*)signal->getDataPtr();  ActiveMutexPtr ptr;  m_activeMutexes.getPtr(ptr, conf->senderData);  ndbrequire(ptr.p->m_gsn == GSN_UTIL_LOCK_REQ);  ndbrequire(ptr.p->m_mutexId == conf->lockId);  ptr.p->m_mutexKey = conf->lockKey;  ptr.p->m_gsn = 0;  m_block.execute(signal, ptr.p->m_callback, 0);}void SimulatedBlock::MutexManager::unlock(Signal* signal, ActiveMutexPtr& ptr){  UtilUnlockReq * req = (UtilUnlockReq*)signal->getDataPtrSend();  req->senderData = ptr.i;  req->senderRef = m_block.reference();  req->lockId = ptr.p->m_mutexId;  req->lockKey = ptr.p->m_mutexKey;    m_block.sendSignal(DBUTIL_REF, 		     GSN_UTIL_UNLOCK_REQ, 		     signal,		     UtilUnlockReq::SignalLength,		     JBB);    ptr.p->m_gsn = GSN_UTIL_UNLOCK_REQ;}voidSimulatedBlock::MutexManager::execUTIL_UNLOCK_REF(Signal* signal){  UtilUnlockRef * ref = (UtilUnlockRef*)signal->getDataPtr();  ActiveMutexPtr ptr;  m_activeMutexes.getPtr(ptr, ref->senderData);  ndbrequire(ptr.p->m_gsn == GSN_UTIL_UNLOCK_REQ);  ndbrequire(ptr.p->m_mutexId == ref->lockId);  ptr.p->m_gsn = 0;  m_block.execute(signal, ptr.p->m_callback, ref->errorCode);}voidSimulatedBlock::MutexManager::execUTIL_UNLOCK_CONF(Signal* signal){  UtilUnlockConf * conf = (UtilUnlockConf*)signal->getDataPtr();  ActiveMutexPtr ptr;  m_activeMutexes.getPtr(ptr, conf->senderData);  ndbrequire(ptr.p->m_gsn == GSN_UTIL_UNLOCK_REQ);  ndbrequire(ptr.p->m_mutexId == conf->lockId);  ptr.p->m_gsn = 0;  m_block.execute(signal, ptr.p->m_callback, 0);}voidMutex::release(SimulatedBlock::MutexManager& mgr, 	       Uint32 activePtrI, Uint32 mutexId){  SimulatedBlock::MutexManager::ActiveMutexPtr ptr;  ptr.i = activePtrI;  mgr.getPtr(ptr);  if(ptr.p->m_gsn == 0 && ptr.p->m_mutexId == mutexId){    mgr.release(activePtrI);    return;  }    if(ptr.p->m_mutexId != mutexId)    ErrorReporter::handleAssert("MutexHandle::release invalid handle", 				__FILE__, __LINE__);  ErrorReporter::handleAssert("MutexHandle::release of mutex inuse", 			      __FILE__, __LINE__);}voidMutex::unlock(){  if(!m_ptr.isNull()){    m_mgr.getPtr(m_ptr);    if(m_ptr.p->m_mutexId == m_mutexId){      SimulatedBlock::Callback c = 	{ &SimulatedBlock::ignoreMutexUnlockCallback, m_ptr.i };      m_ptr.p->m_callback = c;      m_mgr.unlock(m_signal, m_ptr);      m_ptr.setNull(); // Remove reference    }  }}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -