Commit 8888980d authored by joreland@mysql.com's avatar joreland@mysql.com

wl1744 - ndb on windows

parent 3029bbdb
......@@ -19,8 +19,6 @@ CFG=@name@ - Win32 Debug
!MESSAGE
!MESSAGE "@name@ - Win32 Release" (based on "Win32 (x86) Static Library")
!MESSAGE "@name@ - Win32 Debug" (based on "Win32 (x86) Static Library")
!MESSAGE "@name@ - Win32 TLS_DEBUG" (based on "Win32 (x86) Static Library")
!MESSAGE "@name@ - Win32 TLS" (based on "Win32 (x86) Static Library")
!MESSAGE
# Begin Project
......@@ -54,7 +52,7 @@ BSC32=bscmake.exe
# ADD BSC32 /nologo
LIB32=xilink6.exe -lib
# ADD BASE LIB32 /nologo
# ADD LIB32 /nologo /out:"..\lib_release\@name@.lib"
# ADD LIB32 /nologo /out:".\lib_release\@name@.lib"
@release_libs@
!ELSEIF "$(CFG)" == "@name@ - Win32 Debug"
......@@ -81,72 +79,15 @@ BSC32=bscmake.exe
# ADD BSC32 /nologo
LIB32=xilink6.exe -lib
# ADD BASE LIB32 /nologo
# ADD LIB32 /nologo /out:"..\lib_debug\@name@.lib"
# ADD LIB32 /nologo /out:".\lib_debug\@name@.lib"
@debug_libs@
!ELSEIF "$(CFG)" == "@name@ - Win32 TLS_DEBUG"
# PROP BASE Use_MFC 0
# PROP BASE Use_Debug_Libraries 1
# PROP BASE Output_Dir "@name@___Win32_TLS_DEBUG"
# PROP BASE Intermediate_Dir "@name@___Win32_TLS_DEBUG"
# PROP BASE Target_Dir ""
# PROP Use_MFC 0
# PROP Use_Debug_Libraries 1
# PROP Output_Dir "@name@___Win32_TLS_DEBUG"
# PROP Intermediate_Dir "@name@___Win32_TLS_DEBUG"
# PROP Target_Dir ""
# ADD BASE CPP /nologo /G6 /MTd /W3 /Z7 /Od /Gf /D "WIN32" /D "_DEBUG" /D "SAFEMALLOC" /D "SAFE_MUTEX" /D "_WINDOWS" /FD /c
# SUBTRACT BASE CPP /YX
# ADD CPP /nologo /G6 /MTd /W3 /Z7 /Od /Gf /D "WIN32" /D "_DEBUG" /D "SAFEMALLOC" /D "SAFE_MUTEX" /D "_WINDOWS" /D "USE_TLS" /FD /c
# ADD BASE CPP @includes@
# ADD CPP @includes@
# ADD BASE RSC /l 0x409
# ADD RSC /l 0x409
BSC32=bscmake.exe
# ADD BASE BSC32 /nologo
# ADD BSC32 /nologo
LIB32=link.exe -lib
# ADD BASE LIB32 /nologo /out:"..\lib_debug\@name@_tls.lib"
# ADD LIB32 /nologo /out:"..\lib_debug\@name@_tls.lib"
@tls_debug_libs@
!ELSEIF "$(CFG)" == "@name@ - Win32 TLS"
# PROP BASE Use_MFC 0
# PROP BASE Use_Debug_Libraries 0
# PROP BASE Output_Dir "@name@___Win32_TLS"
# PROP BASE Intermediate_Dir "@name@___Win32_TLS"
# PROP BASE Target_Dir ""
# PROP Use_MFC 0
# PROP Use_Debug_Libraries 0
# PROP Output_Dir "@name@___Win32_TLS"
# PROP Intermediate_Dir "@name@___Win32_TLS"
# PROP Target_Dir ""
# ADD BASE CPP /nologo /G6 /MT /W3 /O2 /D "WIN32" /D "DBUG_OFF" /D "_WINDOWS" /D "NDEBUG" /FD /c
# SUBTRACT BASE CPP /YX
# ADD CPP /nologo /G6 /MT /W3 /O2 /D "WIN32" /D "DBUG_OFF" /D "_WINDOWS" /D "NDEBUG" /D "USE_TLS" /FD /c
# ADD BASE CPP @includes@
# ADD CPP @includes@
# SUBTRACT CPP /YX
# ADD BASE RSC /l 0x409
# ADD RSC /l 0x409
BSC32=bscmake.exe
# ADD BASE BSC32 /nologo
# ADD BSC32 /nologo
LIB32=link.exe -lib
# ADD BASE LIB32 /nologo /out:"..\lib_release\@name@_tls.lib"
# ADD LIB32 /nologo /out:"..\lib_release\@name@_tls.lib"
@tls_release_libs@
!ENDIF
# Begin Target
# Name "@name@ - Win32 Release"
# Name "@name@ - Win32 Debug"
# Name "@name@ - Win32 TLS_DEBUG"
# Name "@name@ - Win32 TLS"
# Begin Group "Source Files"
# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
......
......@@ -39,7 +39,7 @@ public:
enum RequestInfo {
TryLock = 1
};
private:
public:
Uint32 senderData;
Uint32 senderRef;
Uint32 lockId;
......@@ -63,7 +63,7 @@ class UtilLockConf {
public:
STATIC_CONST( SignalLength = 4 );
private:
public:
Uint32 senderData;
Uint32 senderRef;
Uint32 lockId;
......@@ -95,7 +95,7 @@ public:
LockAlreadyHeld = 4
};
private:
public:
Uint32 senderData;
Uint32 senderRef;
Uint32 lockId;
......@@ -119,7 +119,7 @@ class UtilUnlockReq {
public:
STATIC_CONST( SignalLength = 4 );
private:
public:
Uint32 senderData;
Uint32 senderRef;
Uint32 lockId;
......@@ -143,7 +143,7 @@ class UtilUnlockConf {
public:
STATIC_CONST( SignalLength = 3 );
private:
public:
Uint32 senderData;
Uint32 senderRef;
Uint32 lockId;
......@@ -171,7 +171,7 @@ public:
NoSuchLock = 1,
NotLockOwner = 2
};
private:
public:
Uint32 senderData;
Uint32 senderRef;
Uint32 lockId;
......@@ -200,7 +200,7 @@ public:
STATIC_CONST( SignalLength = 4 );
private:
public:
Uint32 senderData;
Uint32 senderRef;
Uint32 lockId;
......@@ -229,7 +229,7 @@ public:
STATIC_CONST( SignalLength = 4 );
private:
public:
Uint32 senderData;
Uint32 senderRef;
Uint32 lockId;
......@@ -251,7 +251,7 @@ class UtilCreateLockConf {
public:
STATIC_CONST( SignalLength = 3 );
private:
public:
Uint32 senderData;
Uint32 senderRef;
Uint32 lockId;
......@@ -275,7 +275,7 @@ class UtilDestroyLockReq {
public:
STATIC_CONST( SignalLength = 4 );
private:
public:
Uint32 senderData;
Uint32 senderRef;
Uint32 lockId;
......@@ -303,7 +303,7 @@ public:
STATIC_CONST( SignalLength = 4 );
private:
public:
Uint32 senderData;
Uint32 senderRef;
Uint32 lockId;
......@@ -325,7 +325,7 @@ class UtilDestroyLockConf {
public:
STATIC_CONST( SignalLength = 3 );
private:
public:
Uint32 senderData;
Uint32 senderRef;
Uint32 lockId;
......
......@@ -16,8 +16,8 @@
#define snprintf _snprintf
#define vsnprintf _vsnprintf
#define HAVE_STRCASECMP
#define strcasecmp(a,b) _strcmpi(a,b)
#define strncasecmp(a,b) _strncmpi(a,b)
#define strcasecmp _strcmpi
#define strncasecmp _strncmpi
#pragma warning(disable: 4503 4786)
#else
#undef NDB_WIN32
......
......@@ -95,7 +95,7 @@ Transporter::connect_client() {
return true;
NDB_SOCKET_TYPE sockfd = m_socket_client->connect();
if (sockfd < 0)
if (sockfd == NDB_INVALID_SOCKET)
return false;
// send info about own id
......
......@@ -26,14 +26,14 @@ SocketClient::SocketClient(const char *server_name, unsigned short port, SocketA
m_auth= sa;
m_port= port;
m_server_name= strdup(server_name);
m_sockfd= -1;
m_sockfd= NDB_INVALID_SOCKET;
}
SocketClient::~SocketClient()
{
if (m_server_name)
free(m_server_name);
if (m_sockfd >= 0)
if (m_sockfd != NDB_INVALID_SOCKET)
NDB_CLOSE_SOCKET(m_sockfd);
if (m_auth)
delete m_auth;
......@@ -42,7 +42,7 @@ SocketClient::~SocketClient()
bool
SocketClient::init()
{
if (m_sockfd >= 0)
if (m_sockfd != NDB_INVALID_SOCKET)
NDB_CLOSE_SOCKET(m_sockfd);
memset(&m_servaddr, 0, sizeof(m_servaddr));
......@@ -63,32 +63,32 @@ SocketClient::init()
NDB_SOCKET_TYPE
SocketClient::connect()
{
if (m_sockfd < 0)
if (m_sockfd == NDB_INVALID_SOCKET)
{
if (!init()) {
#ifdef VM_TRACE
ndbout << "SocketClient::connect() failed " << m_server_name << " " << m_port << endl;
#endif
return -1;
return NDB_INVALID_SOCKET;
}
}
const int r = ::connect(m_sockfd, (struct sockaddr*) &m_servaddr, sizeof(m_servaddr));
if (r == -1) {
NDB_CLOSE_SOCKET(m_sockfd);
m_sockfd= -1;
return -1;
m_sockfd= NDB_INVALID_SOCKET;
return NDB_INVALID_SOCKET;
}
if (m_auth) {
if (!m_auth->client_authenticate(m_sockfd))
{
NDB_CLOSE_SOCKET(m_sockfd);
m_sockfd= -1;
return -1;
m_sockfd= NDB_INVALID_SOCKET;
return NDB_INVALID_SOCKET;
}
}
NDB_SOCKET_TYPE sockfd= m_sockfd;
m_sockfd= -1;
m_sockfd= NDB_INVALID_SOCKET;
return sockfd;
}
......@@ -20,12 +20,5 @@
/**
* Block callbacks
*/
typedef void (SimulatedBlock::* CallbackFunction)(class Signal*,
Uint32 callbackData,
Uint32 returnCode);
struct Callback {
CallbackFunction m_callbackFunction;
Uint32 m_callbackData;
};
#endif
......@@ -279,18 +279,18 @@ static char * get_and_validate_path(ndb_mgm_configuration_iterator &iter,
#ifdef NDB_WIN32
char* szFilePart;
if(!GetFullPathName(path, sizeof(buf2), buf2, &szFilePart) ||
(GetFileAttributes(buf2) & FILE_ATTRIBUTE_READONLY));
(GetFileAttributes(buf2) & FILE_ATTRIBUTE_READONLY))
#else
if((::realpath(path, buf2) == NULL)||
(::access(buf2, W_OK) != 0))
#endif
{
ERROR_SET(fatal, AFS_ERROR_INVALIDPATH, path, " Filename::init()");
}
ERROR_SET(fatal, AFS_ERROR_INVALIDPATH, path, " Filename::init()");
}
if (strcmp(&buf2[strlen(buf2) - 1], DIR_SEPARATOR))
strcat(buf2, DIR_SEPARATOR);
return strdup(buf2);
}
......
......@@ -19,48 +19,51 @@
#include "Mutex.hpp"
#include <signaldata/UtilLock.hpp>
MutexManager::MutexManager(class SimulatedBlock & block)
SimulatedBlock::MutexManager::MutexManager(class SimulatedBlock & block)
: m_block(block),
m_activeMutexes(m_mutexPool) {
}
bool
MutexManager::setSize(Uint32 maxNoOfActiveMutexes){
SimulatedBlock::MutexManager::setSize(Uint32 maxNoOfActiveMutexes){
return m_mutexPool.setSize(maxNoOfActiveMutexes);
}
Uint32
MutexManager::getSize() const {
SimulatedBlock::MutexManager::getSize() const {
return m_mutexPool.getSize();
}
bool
MutexManager::seize(ActiveMutexPtr& ptr){
SimulatedBlock::MutexManager::seize(ActiveMutexPtr& ptr){
return m_activeMutexes.seize(ptr);
}
void
MutexManager::release(Uint32 activeMutexPtrI){
SimulatedBlock::MutexManager::release(Uint32 activeMutexPtrI){
m_activeMutexes.release(activeMutexPtrI);
}
void
MutexManager::getPtr(ActiveMutexPtr& ptr){
SimulatedBlock::MutexManager::getPtr(ActiveMutexPtr& ptr){
m_activeMutexes.getPtr(ptr);
}
BlockReference
MutexManager::reference() const {
SimulatedBlock::MutexManager::reference() const {
return m_block.reference();
}
void
MutexManager::progError(int line, int err_code, const char* extra) {
SimulatedBlock::MutexManager::progError(int line,
int err_code,
const char* extra)
{
m_block.progError(line, err_code, extra);
}
void
MutexManager::create(Signal* signal, ActiveMutexPtr& ptr){
SimulatedBlock::MutexManager::create(Signal* signal, ActiveMutexPtr& ptr){
UtilCreateLockReq * req = (UtilCreateLockReq*)signal->getDataPtrSend();
req->senderData = ptr.i;
......@@ -78,7 +81,7 @@ MutexManager::create(Signal* signal, ActiveMutexPtr& ptr){
}
void
MutexManager::execUTIL_CREATE_LOCK_REF(Signal* signal){
SimulatedBlock::MutexManager::execUTIL_CREATE_LOCK_REF(Signal* signal){
UtilCreateLockRef * ref = (UtilCreateLockRef*)signal->getDataPtr();
ActiveMutexPtr ptr;
......@@ -91,7 +94,7 @@ MutexManager::execUTIL_CREATE_LOCK_REF(Signal* signal){
}
void
MutexManager::execUTIL_CREATE_LOCK_CONF(Signal* signal){
SimulatedBlock::MutexManager::execUTIL_CREATE_LOCK_CONF(Signal* signal){
UtilCreateLockConf * conf = (UtilCreateLockConf*)signal->getDataPtr();
ActiveMutexPtr ptr;
......@@ -105,7 +108,7 @@ MutexManager::execUTIL_CREATE_LOCK_CONF(Signal* signal){
void
MutexManager::destroy(Signal* signal, ActiveMutexPtr& ptr){
SimulatedBlock::MutexManager::destroy(Signal* signal, ActiveMutexPtr& ptr){
UtilDestroyLockReq * req = (UtilDestroyLockReq*)signal->getDataPtrSend();
req->senderData = ptr.i;
......@@ -123,7 +126,7 @@ MutexManager::destroy(Signal* signal, ActiveMutexPtr& ptr){
}
void
MutexManager::execUTIL_DESTORY_LOCK_REF(Signal* signal){
SimulatedBlock::MutexManager::execUTIL_DESTORY_LOCK_REF(Signal* signal){
UtilDestroyLockRef * ref = (UtilDestroyLockRef*)signal->getDataPtr();
ActiveMutexPtr ptr;
m_activeMutexes.getPtr(ptr, ref->senderData);
......@@ -135,7 +138,7 @@ MutexManager::execUTIL_DESTORY_LOCK_REF(Signal* signal){
}
void
MutexManager::execUTIL_DESTORY_LOCK_CONF(Signal* signal){
SimulatedBlock::MutexManager::execUTIL_DESTORY_LOCK_CONF(Signal* signal){
UtilDestroyLockConf * conf = (UtilDestroyLockConf*)signal->getDataPtr();
ActiveMutexPtr ptr;
m_activeMutexes.getPtr(ptr, conf->senderData);
......@@ -148,7 +151,7 @@ MutexManager::execUTIL_DESTORY_LOCK_CONF(Signal* signal){
void
MutexManager::lock(Signal* signal, ActiveMutexPtr& ptr){
SimulatedBlock::MutexManager::lock(Signal* signal, ActiveMutexPtr& ptr){
UtilLockReq * req = (UtilLockReq*)signal->getDataPtrSend();
req->senderData = ptr.i;
......@@ -166,7 +169,7 @@ MutexManager::lock(Signal* signal, ActiveMutexPtr& ptr){
}
void
MutexManager::trylock(Signal* signal, ActiveMutexPtr& ptr){
SimulatedBlock::MutexManager::trylock(Signal* signal, ActiveMutexPtr& ptr){
UtilLockReq * req = (UtilLockReq*)signal->getDataPtrSend();
req->senderData = ptr.i;
......@@ -184,7 +187,7 @@ MutexManager::trylock(Signal* signal, ActiveMutexPtr& ptr){
}
void
MutexManager::execUTIL_LOCK_REF(Signal* signal){
SimulatedBlock::MutexManager::execUTIL_LOCK_REF(Signal* signal){
UtilLockRef * ref = (UtilLockRef*)signal->getDataPtr();
ActiveMutexPtr ptr;
m_activeMutexes.getPtr(ptr, ref->senderData);
......@@ -196,7 +199,7 @@ MutexManager::execUTIL_LOCK_REF(Signal* signal){
}
void
MutexManager::execUTIL_LOCK_CONF(Signal* signal){
SimulatedBlock::MutexManager::execUTIL_LOCK_CONF(Signal* signal){
UtilLockConf * conf = (UtilLockConf*)signal->getDataPtr();
ActiveMutexPtr ptr;
m_activeMutexes.getPtr(ptr, conf->senderData);
......@@ -210,7 +213,7 @@ MutexManager::execUTIL_LOCK_CONF(Signal* signal){
}
void
MutexManager::unlock(Signal* signal, ActiveMutexPtr& ptr){
SimulatedBlock::MutexManager::unlock(Signal* signal, ActiveMutexPtr& ptr){
UtilUnlockReq * req = (UtilUnlockReq*)signal->getDataPtrSend();
req->senderData = ptr.i;
req->senderRef = m_block.reference();
......@@ -227,7 +230,7 @@ MutexManager::unlock(Signal* signal, ActiveMutexPtr& ptr){
}
void
MutexManager::execUTIL_UNLOCK_REF(Signal* signal){
SimulatedBlock::MutexManager::execUTIL_UNLOCK_REF(Signal* signal){
UtilUnlockRef * ref = (UtilUnlockRef*)signal->getDataPtr();
ActiveMutexPtr ptr;
m_activeMutexes.getPtr(ptr, ref->senderData);
......@@ -239,7 +242,7 @@ MutexManager::execUTIL_UNLOCK_REF(Signal* signal){
}
void
MutexManager::execUTIL_UNLOCK_CONF(Signal* signal){
SimulatedBlock::MutexManager::execUTIL_UNLOCK_CONF(Signal* signal){
UtilUnlockConf * conf = (UtilUnlockConf*)signal->getDataPtr();
ActiveMutexPtr ptr;
m_activeMutexes.getPtr(ptr, conf->senderData);
......@@ -251,8 +254,9 @@ MutexManager::execUTIL_UNLOCK_CONF(Signal* signal){
}
void
Mutex::release(MutexManager& mgr, Uint32 activePtrI, Uint32 mutexId){
MutexManager::ActiveMutexPtr ptr;
Mutex::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){
......@@ -272,7 +276,8 @@ Mutex::unlock(){
if(!m_ptr.isNull()){
m_mgr.getPtr(m_ptr);
if(m_ptr.p->m_mutexId == m_mutexId){
Callback c = { &SimulatedBlock::ignoreMutexUnlockCallback, m_ptr.i };
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
......
......@@ -22,63 +22,6 @@
class Mutex;
class MutexManager {
friend class Mutex;
friend class SimulatedBlock;
friend class DbUtil;
public:
MutexManager(class SimulatedBlock &);
bool setSize(Uint32 maxNoOfActiveMutexes);
Uint32 getSize() const ; // Get maxNoOfActiveMutexes
private:
/**
* core interface
*/
struct ActiveMutex {
Uint32 m_gsn; // state
Uint32 m_mutexId;
Uint32 m_mutexKey;
Callback m_callback;
union {
Uint32 nextPool;
Uint32 nextList;
};
Uint32 prevList;
};
typedef Ptr<ActiveMutex> ActiveMutexPtr;
bool seize(ActiveMutexPtr& ptr);
void release(Uint32 activeMutexPtrI);
void getPtr(ActiveMutexPtr& ptr);
void create(Signal*, ActiveMutexPtr&);
void destroy(Signal*, ActiveMutexPtr&);
void lock(Signal*, ActiveMutexPtr&);
void trylock(Signal*, ActiveMutexPtr&);
void unlock(Signal*, ActiveMutexPtr&);
private:
void execUTIL_CREATE_LOCK_REF(Signal* signal);
void execUTIL_CREATE_LOCK_CONF(Signal* signal);
void execUTIL_DESTORY_LOCK_REF(Signal* signal);
void execUTIL_DESTORY_LOCK_CONF(Signal* signal);
void execUTIL_LOCK_REF(Signal* signal);
void execUTIL_LOCK_CONF(Signal* signal);
void execUTIL_UNLOCK_REF(Signal* signal);
void execUTIL_UNLOCK_CONF(Signal* signal);
SimulatedBlock & m_block;
ArrayPool<ActiveMutex> m_mutexPool;
DLList<ActiveMutex> m_activeMutexes;
BlockReference reference() const;
void progError(int line, int err_code, const char* extra = 0);
};
/**
* MutexHandle - A "reference" to a mutex
* - Should be used together with Mutex
......@@ -89,7 +32,7 @@ public:
MutexHandle(Uint32 id);
bool isNull() const;
void release(MutexManager & mgr);
void release(SimulatedBlock::MutexManager & mgr);
private:
const Uint32 m_mutexId;
......@@ -106,7 +49,7 @@ public:
MutexHandle2();
bool isNull() const;
void release(MutexManager & mgr);
void release(SimulatedBlock::MutexManager & mgr);
private:
Uint32 m_activeMutexPtrI;
......@@ -117,33 +60,34 @@ private:
*/
class Mutex {
public:
Mutex(Signal*, MutexManager & mgr, MutexHandle &);
Mutex(Signal*, SimulatedBlock::MutexManager & mgr, MutexHandle &);
template<Uint32 MutexId>
Mutex(Signal*, MutexManager & mgr, MutexHandle2<MutexId> &);
Mutex(Signal*, SimulatedBlock::MutexManager & mgr, MutexHandle2<MutexId> &);
~Mutex();
void release();
bool isNull() const ;
bool lock(Callback & callback);
bool trylock(Callback & callback);
void unlock(Callback & callback);
bool lock(SimulatedBlock::Callback & callback);
bool trylock(SimulatedBlock::Callback & callback);
void unlock(SimulatedBlock::Callback & callback);
void unlock(); // Ignore callback
bool create(Callback & callback);
bool destroy(Callback & callback);
bool create(SimulatedBlock::Callback & callback);
bool destroy(SimulatedBlock::Callback & callback);
private:
Signal* m_signal;
MutexManager & m_mgr;
SimulatedBlock::MutexManager & m_mgr;
const Uint32 m_mutexId;
Uint32 & m_srcPtrI;
MutexManager::ActiveMutexPtr m_ptr;
SimulatedBlock::MutexManager::ActiveMutexPtr m_ptr;
public:
static void release(MutexManager&, Uint32 activePtrI, Uint32 mutexId);
static void release(SimulatedBlock::MutexManager&,
Uint32 activePtrI, Uint32 mutexId);
};
inline
......@@ -159,7 +103,7 @@ MutexHandle::isNull() const {
inline
void
MutexHandle::release(MutexManager & mgr){
MutexHandle::release(SimulatedBlock::MutexManager & mgr){
if(!isNull()){
Mutex::release(mgr, m_activeMutexPtrI, m_mutexId);
m_activeMutexPtrI = RNIL;
......@@ -183,7 +127,7 @@ MutexHandle2<MutexId>::isNull() const {
template<Uint32 MutexId>
inline
void
MutexHandle2<MutexId>::release(MutexManager & mgr){
MutexHandle2<MutexId>::release(SimulatedBlock::MutexManager & mgr){
if(!isNull()){
Mutex::release(mgr, m_activeMutexPtrI, MutexId);
m_activeMutexPtrI = RNIL;
......@@ -192,7 +136,8 @@ MutexHandle2<MutexId>::release(MutexManager & mgr){
inline
Mutex::Mutex(Signal* signal, MutexManager & mgr, MutexHandle & mh)
Mutex::Mutex(Signal* signal, SimulatedBlock::MutexManager & mgr,
MutexHandle & mh)
: m_signal(signal),
m_mgr(mgr),
m_mutexId(mh.m_mutexId),
......@@ -204,7 +149,8 @@ Mutex::Mutex(Signal* signal, MutexManager & mgr, MutexHandle & mh)
template<Uint32 MutexId>
inline
Mutex::Mutex(Signal* signal, MutexManager & mgr, MutexHandle2<MutexId> & mh)
Mutex::Mutex(Signal* signal, SimulatedBlock::MutexManager & mgr,
MutexHandle2<MutexId> & mh)
: m_signal(signal),
m_mgr(mgr),
m_mutexId(MutexId),
......@@ -236,7 +182,7 @@ Mutex::isNull() const {
inline
bool
Mutex::lock(Callback & callback){
Mutex::lock(SimulatedBlock::Callback & callback){
if(m_ptr.isNull()){
if(m_mgr.seize(m_ptr)){
m_ptr.p->m_mutexId = m_mutexId;
......@@ -253,7 +199,7 @@ Mutex::lock(Callback & callback){
inline
bool
Mutex::trylock(Callback & callback){
Mutex::trylock(SimulatedBlock::Callback & callback){
if(m_ptr.isNull()){
if(m_mgr.seize(m_ptr)){
m_ptr.p->m_mutexId = m_mutexId;
......@@ -270,7 +216,7 @@ Mutex::trylock(Callback & callback){
inline
void
Mutex::unlock(Callback & callback){
Mutex::unlock(SimulatedBlock::Callback & callback){
if(!m_ptr.isNull()){
m_mgr.getPtr(m_ptr);
if(m_ptr.p->m_mutexId == m_mutexId){
......@@ -285,7 +231,7 @@ Mutex::unlock(Callback & callback){
inline
bool
Mutex::create(Callback & callback){
Mutex::create(SimulatedBlock::Callback & callback){
if(m_ptr.isNull()){
if(m_mgr.seize(m_ptr)){
m_ptr.p->m_mutexId = m_mutexId;
......@@ -302,7 +248,7 @@ Mutex::create(Callback & callback){
inline
bool
Mutex::destroy(Callback & callback){
Mutex::destroy(SimulatedBlock::Callback & callback){
if(m_ptr.isNull()){
if(m_mgr.seize(m_ptr)){
m_ptr.p->m_mutexId = m_mutexId;
......
......@@ -26,7 +26,7 @@
#endif
SectionReader::SectionReader
(class SegmentedSectionPtr & ptr, class SectionSegmentPool & pool)
(struct SegmentedSectionPtr & ptr, class SectionSegmentPool & pool)
: m_pool(pool)
{
if(ptr.p == 0){
......
......@@ -21,7 +21,7 @@
class SectionReader {
public:
SectionReader(class SegmentedSectionPtr &,
SectionReader(struct SegmentedSectionPtr &,
class SectionSegmentPool &);
void reset();
......
......@@ -1598,7 +1598,7 @@ SimulatedBlock::sendFragmentedSignal(NodeReceiverGroup rg,
}
}
Callback SimulatedBlock::TheEmptyCallback = {0, 0};
SimulatedBlock::Callback SimulatedBlock::TheEmptyCallback = {0, 0};
void
SimulatedBlock::sendFragmentedSignal(BlockReference ref,
......
......@@ -41,7 +41,6 @@
#include "ArrayPool.hpp"
#include "DLHashTable.hpp"
#include "Callback.hpp"
#include "Mutex.hpp"
#include "SafeCounter.hpp"
#include "MetaData.hpp"
......@@ -104,6 +103,14 @@ public:
*
*/
inline void executeFunction(GlobalSignalNumber gsn, Signal* signal);
public:
typedef void (SimulatedBlock::* CallbackFunction)(class Signal*,
Uint32 callbackData,
Uint32 returnCode);
struct Callback {
CallbackFunction m_callbackFunction;
Uint32 m_callbackData;
};
protected:
static Callback TheEmptyCallback;
void execute(Signal* signal, Callback & c, Uint32 returnCode);
......@@ -405,7 +412,63 @@ private:
DLList<FragmentSendInfo> c_linearFragmentSendList;
DLList<FragmentSendInfo> c_segmentedFragmentSendList;
public:
public:
class MutexManager {
friend class Mutex;
friend class SimulatedBlock;
friend class DbUtil;
public:
MutexManager(class SimulatedBlock &);
bool setSize(Uint32 maxNoOfActiveMutexes);
Uint32 getSize() const ; // Get maxNoOfActiveMutexes
private:
/**
* core interface
*/
struct ActiveMutex {
Uint32 m_gsn; // state
Uint32 m_mutexId;
Uint32 m_mutexKey;
Callback m_callback;
union {
Uint32 nextPool;
Uint32 nextList;
};
Uint32 prevList;
};
typedef Ptr<ActiveMutex> ActiveMutexPtr;
bool seize(ActiveMutexPtr& ptr);
void release(Uint32 activeMutexPtrI);
void getPtr(ActiveMutexPtr& ptr);
void create(Signal*, ActiveMutexPtr&);
void destroy(Signal*, ActiveMutexPtr&);
void lock(Signal*, ActiveMutexPtr&);
void trylock(Signal*, ActiveMutexPtr&);
void unlock(Signal*, ActiveMutexPtr&);
private:
void execUTIL_CREATE_LOCK_REF(Signal* signal);
void execUTIL_CREATE_LOCK_CONF(Signal* signal);
void execUTIL_DESTORY_LOCK_REF(Signal* signal);
void execUTIL_DESTORY_LOCK_CONF(Signal* signal);
void execUTIL_LOCK_REF(Signal* signal);
void execUTIL_LOCK_CONF(Signal* signal);
void execUTIL_UNLOCK_REF(Signal* signal);
void execUTIL_UNLOCK_CONF(Signal* signal);
SimulatedBlock & m_block;
ArrayPool<ActiveMutex> m_mutexPool;
DLList<ActiveMutex> m_activeMutexes;
BlockReference reference() const;
void progError(int line, int err_code, const char* extra = 0);
};
MutexManager c_mutexMgr;
void ignoreMutexUnlockCallback(Signal* signal, Uint32 ptrI, Uint32 retVal);
......@@ -688,5 +751,7 @@ BLOCK::addRecSignal(GlobalSignalNumber gsn, ExecSignalLocal f, bool force){ \
addRecSignalImpl(gsn, (ExecFunction)f, force);\
}
#include "Mutex.hpp"
#endif
......@@ -24,4 +24,28 @@ ndb_mgm_LDFLAGS = @ndb_bin_am_ldflags@
# Don't update the files from bitkeeper
%::SCCS/s.%
windoze-dsp:
windoze-dsp: ndb_mgm.dsp libndbmgmclient.dsp
ndb_mgm.dsp: Makefile \
$(top_srcdir)/ndb/config/win-prg.am \
$(top_srcdir)/ndb/config/win-name \
$(top_srcdir)/ndb/config/win-includes \
$(top_srcdir)/ndb/config/win-sources \
$(top_srcdir)/ndb/config/win-libraries
cat $(top_srcdir)/ndb/config/win-prg.am > $@
@$(top_srcdir)/ndb/config/win-name $@ $(ndbtools_PROGRAMS)
@$(top_srcdir)/ndb/config/win-includes $@ $(INCLUDES)
@$(top_srcdir)/ndb/config/win-sources $@ $(ndb_mgm_SOURCES)
@$(top_srcdir)/ndb/config/win-libraries $@ LINK $(LDADD)
libndbmgmclient.dsp: Makefile \
$(top_srcdir)/ndb/config/win-lib.am \
$(top_srcdir)/ndb/config/win-name \
$(top_srcdir)/ndb/config/win-includes \
$(top_srcdir)/ndb/config/win-sources \
$(top_srcdir)/ndb/config/win-libraries
cat $(top_srcdir)/ndb/config/win-lib.am > $@
@$(top_srcdir)/ndb/config/win-name $@ $(noinst_LTLIBRARIES)
@$(top_srcdir)/ndb/config/win-includes $@ $(INCLUDES)
@$(top_srcdir)/ndb/config/win-sources $@ $(libndbmgmclient_la_SOURCES)
@$(top_srcdir)/ndb/config/win-libraries $@ LIB
......@@ -32,4 +32,4 @@ libNDBT.dsp: Makefile \
@$(top_srcdir)/ndb/config/win-name $@ $(noinst_LIBRARIES)
@$(top_srcdir)/ndb/config/win-includes $@ $(INCLUDES)
@$(top_srcdir)/ndb/config/win-sources $@ $(libNDBT_a_SOURCES)
@$(top_srcdir)/ndb/config/win-libraries $@ LIB $(LDADD)
@$(top_srcdir)/ndb/config/win-libraries $@ LIB
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment