Commit cf194d4b authored by mysqldev@mysql.com's avatar mysqldev@mysql.com

Merge mysql.com:/home/bk/mysql-4.1-ndb

into mysql.com:/home/mysqldev/tulin/mysql-4.1-ndb
parents 7d6b9880 2c2d70a2
...@@ -113,6 +113,7 @@ mwagner@work.mysql.com ...@@ -113,6 +113,7 @@ mwagner@work.mysql.com
mydev@mysql.com mydev@mysql.com
mysql@home.(none) mysql@home.(none)
mysqldev@build.mysql2.com mysqldev@build.mysql2.com
mysqldev@mysql.com
ndbdev@ndbmaster.mysql.com ndbdev@ndbmaster.mysql.com
nick@mysql.com nick@mysql.com
nick@nick.leippe.com nick@nick.leippe.com
......
...@@ -105,6 +105,7 @@ parse_arguments "$@" ...@@ -105,6 +105,7 @@ parse_arguments "$@"
echo "NDB_COMPILER := $NDB_COMPILER" echo "NDB_COMPILER := $NDB_COMPILER"
echo "NDB_VERSION := $NDB_VERSION" echo "NDB_VERSION := $NDB_VERSION"
echo "NDB_SCI := $NDB_SCI" echo "NDB_SCI := $NDB_SCI"
echo "NDB_SHM := $NDB_SHM"
echo "NDB_ODBC := $NDB_ODBC" echo "NDB_ODBC := $NDB_ODBC"
echo "TERMCAP_LIB := $TERMCAP_LIB" echo "TERMCAP_LIB := $TERMCAP_LIB"
echo "PACKAGE := $PACKAGE" echo "PACKAGE := $PACKAGE"
......
...@@ -250,7 +250,7 @@ struct CreateEvntReq { ...@@ -250,7 +250,7 @@ struct CreateEvntReq {
return tmp; return tmp;
} }
void setAttrListBitmask(const AttributeMask & val) { void setAttrListBitmask(const AttributeMask & val) {
m_attrListBitmask = val; AttributeMask::assign(m_attrListBitmask.data, val);
} }
Uint32 getEventType() const { Uint32 getEventType() const {
return m_eventType; return m_eventType;
......
...@@ -17,6 +17,7 @@ ...@@ -17,6 +17,7 @@
#ifndef NDB_TRIGGER_DEFINITIONS_H #ifndef NDB_TRIGGER_DEFINITIONS_H
#define NDB_TRIGGER_DEFINITIONS_H #define NDB_TRIGGER_DEFINITIONS_H
#include <ndb_global.h>
#include "ndb_limits.h" #include "ndb_limits.h"
#ifndef MIN #ifndef MIN
......
...@@ -331,11 +331,12 @@ public: ...@@ -331,11 +331,12 @@ public:
*/ */
struct Data { struct Data {
Uint32 data[size]; Uint32 data[size];
#if 0
Data & operator=(const Bitmask<size> & src) { Data & operator=(const Bitmask<size> & src) {
src.assign(size, data); src.assign(size, data);
return *this; return *this;
} }
#endif
}; };
private: private:
...@@ -348,12 +349,13 @@ public: ...@@ -348,12 +349,13 @@ public:
/** /**
* assign - Set all bits in <em>dst</em> to corresponding in <em>src/<em> * assign - Set all bits in <em>dst</em> to corresponding in <em>src/<em>
*/ */
void assign(const Bitmask<size>::Data & src); void assign(const typename Bitmask<size>::Data & src);
/** /**
* assign - Set all bits in <em>dst</em> to corresponding in <em>src/<em> * assign - Set all bits in <em>dst</em> to corresponding in <em>src/<em>
*/ */
static void assign(Uint32 dst[], const Uint32 src[]); static void assign(Uint32 dst[], const Uint32 src[]);
static void assign(Uint32 dst[], const Bitmask<size> & src);
void assign(const Bitmask<size> & src); void assign(const Bitmask<size> & src);
/** /**
...@@ -480,7 +482,14 @@ Bitmask<size>::assign(Uint32 dst[], const Uint32 src[]) ...@@ -480,7 +482,14 @@ Bitmask<size>::assign(Uint32 dst[], const Uint32 src[])
template <unsigned size> template <unsigned size>
inline void inline void
Bitmask<size>::assign(const Bitmask<size>::Data & src) Bitmask<size>::assign(Uint32 dst[], const Bitmask<size> & src)
{
BitmaskImpl::assign(size, dst, src.rep.data);
}
template <unsigned size>
inline void
Bitmask<size>::assign(const typename Bitmask<size>::Data & src)
{ {
assign(rep.data, src.data); assign(rep.data, src.data);
} }
......
...@@ -48,7 +48,7 @@ void byteReverse(unsigned char *buf, unsigned longs); ...@@ -48,7 +48,7 @@ void byteReverse(unsigned char *buf, unsigned longs);
*/ */
void byteReverse(unsigned char *buf, unsigned longs) void byteReverse(unsigned char *buf, unsigned longs)
{ {
uint32 t; Uint32 t;
do { do {
t = (Uint32) ((unsigned) buf[3] << 8 | buf[2]) << 16 | t = (Uint32) ((unsigned) buf[3] << 8 | buf[2]) << 16 |
((unsigned) buf[1] << 8 | buf[0]); ((unsigned) buf[1] << 8 | buf[0]);
......
...@@ -7762,8 +7762,9 @@ Dbdict::createEventComplete_RT_USER_GET(Signal* signal, ...@@ -7762,8 +7762,9 @@ Dbdict::createEventComplete_RT_USER_GET(Signal* signal,
#endif #endif
NodeReceiverGroup rg(DBDICT, c_aliveNodes); NodeReceiverGroup rg(DBDICT, c_aliveNodes);
evntRecPtr.p->m_reqTracker.init<CreateEvntRef> RequestTracker & p = evntRecPtr.p->m_reqTracker;
(c_counterMgr, rg, GSN_CREATE_EVNT_REF, evntRecPtr.i); p.init<CreateEvntRef>(c_counterMgr, rg, GSN_CREATE_EVNT_REF, evntRecPtr.i);
sendSignal(rg, GSN_CREATE_EVNT_REQ, signal, CreateEvntReq::SignalLength, JBB); sendSignal(rg, GSN_CREATE_EVNT_REQ, signal, CreateEvntReq::SignalLength, JBB);
} }
...@@ -8111,7 +8112,8 @@ void Dbdict::execSUB_START_REQ(Signal* signal) ...@@ -8111,7 +8112,8 @@ void Dbdict::execSUB_START_REQ(Signal* signal)
subbPtr.p->m_senderRef = origSenderRef; // not sure if API sets correctly subbPtr.p->m_senderRef = origSenderRef; // not sure if API sets correctly
NodeReceiverGroup rg(DBDICT, c_aliveNodes); NodeReceiverGroup rg(DBDICT, c_aliveNodes);
subbPtr.p->m_reqTracker.init<SubStartRef>(c_counterMgr, rg, GSN_SUB_START_REF, subbPtr.i); RequestTracker & p = subbPtr.p->m_reqTracker;
p.init<SubStartRef>(c_counterMgr, rg, GSN_SUB_START_REF, subbPtr.i);
SubStartReq* req = (SubStartReq*) signal->getDataPtrSend(); SubStartReq* req = (SubStartReq*) signal->getDataPtrSend();
...@@ -8324,7 +8326,8 @@ void Dbdict::execSUB_STOP_REQ(Signal* signal) ...@@ -8324,7 +8326,8 @@ void Dbdict::execSUB_STOP_REQ(Signal* signal)
#endif #endif
subbPtr.p->m_senderRef = origSenderRef; // not sure if API sets correctly subbPtr.p->m_senderRef = origSenderRef; // not sure if API sets correctly
NodeReceiverGroup rg(DBDICT, c_aliveNodes); NodeReceiverGroup rg(DBDICT, c_aliveNodes);
subbPtr.p->m_reqTracker.init<SubStopRef>(c_counterMgr, rg, GSN_SUB_STOP_REF, subbPtr.i); RequestTracker & p = subbPtr.p->m_reqTracker;
p.init<SubStopRef>(c_counterMgr, rg, GSN_SUB_STOP_REF, subbPtr.i);
SubStopReq* req = (SubStopReq*) signal->getDataPtrSend(); SubStopReq* req = (SubStopReq*) signal->getDataPtrSend();
...@@ -8611,7 +8614,8 @@ Dbdict::dropEventUTIL_EXECUTE_READ(Signal* signal, ...@@ -8611,7 +8614,8 @@ Dbdict::dropEventUTIL_EXECUTE_READ(Signal* signal,
parseReadEventSys(signal, evntRecPtr.p->m_eventRec); parseReadEventSys(signal, evntRecPtr.p->m_eventRec);
NodeReceiverGroup rg(DBDICT, c_aliveNodes); NodeReceiverGroup rg(DBDICT, c_aliveNodes);
evntRecPtr.p->m_reqTracker.init<SubRemoveRef>(c_counterMgr, rg, GSN_SUB_REMOVE_REF, RequestTracker & p = evntRecPtr.p->m_reqTracker;
p.init<SubRemoveRef>(c_counterMgr, rg, GSN_SUB_REMOVE_REF,
evntRecPtr.i); evntRecPtr.i);
SubRemoveReq* req = (SubRemoveReq*) signal->getDataPtrSend(); SubRemoveReq* req = (SubRemoveReq*) signal->getDataPtrSend();
......
...@@ -101,6 +101,22 @@ ...@@ -101,6 +101,22 @@
#define ZNODE_FAILURE_ERROR 704 #define ZNODE_FAILURE_ERROR 704
#endif #endif
/**
* Systable NDB$EVENTS_0
*/
#define EVENT_SYSTEM_TABLE_NAME "sys/def/NDB$EVENTS_0"
#define EVENT_SYSTEM_TABLE_LENGTH 6
struct sysTab_NDBEVENTS_0 {
char NAME[MAX_TAB_NAME_SIZE];
Uint32 EVENT_TYPE;
char TABLE_NAME[MAX_TAB_NAME_SIZE];
Uint32 ATTRIBUTE_MASK[MAXNROFATTRIBUTESINWORDS];
Uint32 SUBID;
Uint32 SUBKEY;
};
/** /**
* DICT - This blocks handles all metadata * DICT - This blocks handles all metadata
*/ */
...@@ -1227,22 +1243,6 @@ private: ...@@ -1227,22 +1243,6 @@ private:
}; };
typedef Ptr<OpSubEvent> OpSubEventPtr; typedef Ptr<OpSubEvent> OpSubEventPtr;
/**
* Systable NDB$EVENTS_0
*/
#define EVENT_SYSTEM_TABLE_NAME "sys/def/NDB$EVENTS_0"
#define EVENT_SYSTEM_TABLE_LENGTH 6
struct sysTab_NDBEVENTS_0 {
char NAME[MAX_TAB_NAME_SIZE];
Uint32 EVENT_TYPE;
char TABLE_NAME[MAX_TAB_NAME_SIZE];
Uint32 ATTRIBUTE_MASK[MAXNROFATTRIBUTESINWORDS];
Uint32 SUBID;
Uint32 SUBKEY;
};
static const Uint32 sysTab_NDBEVENTS_0_szs[]; static const Uint32 sysTab_NDBEVENTS_0_szs[];
/** /**
......
...@@ -103,7 +103,9 @@ private: ...@@ -103,7 +103,9 @@ private:
static const unsigned MaxNodeHandles = 128; // enough for 1 operation static const unsigned MaxNodeHandles = 128; // enough for 1 operation
#endif #endif
static const unsigned MaxAttrDataSize = 2048; static const unsigned MaxAttrDataSize = 2048;
public:
static const unsigned DescPageSize = 256; static const unsigned DescPageSize = 256;
private:
static const unsigned MaxTreeNodeSize = MAX_TTREE_NODE_SIZE; static const unsigned MaxTreeNodeSize = MAX_TTREE_NODE_SIZE;
static const unsigned ScanBoundSegmentSize = 7; static const unsigned ScanBoundSegmentSize = 7;
static const unsigned MaxAccLockOps = MAX_PARALLEL_OP_PER_SCAN; static const unsigned MaxAccLockOps = MAX_PARALLEL_OP_PER_SCAN;
...@@ -126,10 +128,13 @@ private: ...@@ -126,10 +128,13 @@ private:
Data& operator+=(size_t n); Data& operator+=(size_t n);
AttributeHeader& ah() const; AttributeHeader& ah() const;
}; };
friend class Data;
/* /*
* Pointer to constant Uint32 data. * Pointer to constant Uint32 data.
*/ */
struct ConstData;
friend struct ConstData;
struct ConstData { struct ConstData {
private: private:
const Uint32* m_data; const Uint32* m_data;
...@@ -173,6 +178,8 @@ private: ...@@ -173,6 +178,8 @@ private:
* of "original" tuple and tuple version. Uses 2 words to get correct * of "original" tuple and tuple version. Uses 2 words to get correct
* aligment (one byte is wasted currently). * aligment (one byte is wasted currently).
*/ */
struct TreeEnt;
friend struct TreeEnt;
struct TreeEnt { struct TreeEnt {
TupAddr m_tupAddr; // address of original tuple TupAddr m_tupAddr; // address of original tuple
Uint16 m_tupVersion; // version Uint16 m_tupVersion; // version
...@@ -202,6 +209,8 @@ private: ...@@ -202,6 +209,8 @@ private:
* a node is about to be removed. If occupancy is 1, only max entry * a node is about to be removed. If occupancy is 1, only max entry
* is present but both min and max prefixes are set. * is present but both min and max prefixes are set.
*/ */
struct TreeNode;
friend struct TreeNode;
struct TreeNode { struct TreeNode {
TupAddr m_link[3]; // link to 0-left child 1-right child 2-parent TupAddr m_link[3]; // link to 0-left child 1-right child 2-parent
Uint8 m_side; // we are 0-left child 1-right child 2-root Uint8 m_side; // we are 0-left child 1-right child 2-root
...@@ -228,6 +237,8 @@ private: ...@@ -228,6 +237,8 @@ private:
* Tree header. There is one in each fragment. Contains tree * Tree header. There is one in each fragment. Contains tree
* parameters and address of root node. * parameters and address of root node.
*/ */
struct TreeHead;
friend struct TreeHead;
struct TreeHead { struct TreeHead {
Uint8 m_nodeSize; // words in tree node Uint8 m_nodeSize; // words in tree node
Uint8 m_prefSize; // words in min/max prefix each Uint8 m_prefSize; // words in min/max prefix each
...@@ -248,6 +259,8 @@ private: ...@@ -248,6 +259,8 @@ private:
* also represented by position 0 of next node. Includes direction * also represented by position 0 of next node. Includes direction
* and copy of entry used by scan. * and copy of entry used by scan.
*/ */
struct TreePos;
friend struct TreePos;
struct TreePos { struct TreePos {
TupAddr m_addr; // logical node address TupAddr m_addr; // logical node address
TupLoc m_loc; // physical address TupLoc m_loc; // physical address
...@@ -264,6 +277,8 @@ private: ...@@ -264,6 +277,8 @@ private:
* Descriptor page. The "hot" metadata for an index is stored as * Descriptor page. The "hot" metadata for an index is stored as
* a contiguous array of words on some page. * a contiguous array of words on some page.
*/ */
struct DescPage;
friend struct DescPage;
struct DescPage { struct DescPage {
Uint32 m_nextPage; Uint32 m_nextPage;
Uint32 m_numFree; // number of free words Uint32 m_numFree; // number of free words
...@@ -301,6 +316,8 @@ private: ...@@ -301,6 +316,8 @@ private:
* Complete metadata for one index. The array of attributes has * Complete metadata for one index. The array of attributes has
* variable size. * variable size.
*/ */
struct DescEnt;
friend struct DescEnt;
struct DescEnt { struct DescEnt {
DescHead m_descHead; DescHead m_descHead;
DescAttr m_descAttr[1]; // variable size data DescAttr m_descAttr[1]; // variable size data
...@@ -329,6 +346,8 @@ private: ...@@ -329,6 +346,8 @@ private:
* be for an entry we were moved away from. In any case nothing * be for an entry we were moved away from. In any case nothing
* happens with current entry before lock wait flag is cleared. * happens with current entry before lock wait flag is cleared.
*/ */
struct ScanOp;
friend struct ScanOp;
struct ScanOp { struct ScanOp {
enum { enum {
Undef = 0, Undef = 0,
...@@ -382,6 +401,8 @@ private: ...@@ -382,6 +401,8 @@ private:
* Ordered index. Top level data structure. The primary table (table * Ordered index. Top level data structure. The primary table (table
* being indexed) lives in TUP. * being indexed) lives in TUP.
*/ */
struct Index;
friend struct Index;
struct Index { struct Index {
enum State { enum State {
NotDefined = 0, NotDefined = 0,
...@@ -412,6 +433,8 @@ private: ...@@ -412,6 +433,8 @@ private:
* duplicate fragments known to LQH/ACC/TUP. Includes tree header. * duplicate fragments known to LQH/ACC/TUP. Includes tree header.
* There are no maintenance operation records yet. * There are no maintenance operation records yet.
*/ */
struct Frag;
friend struct Frag;
struct Frag { struct Frag {
Uint32 m_tableId; // copy from index level Uint32 m_tableId; // copy from index level
Uint32 m_indexId; Uint32 m_indexId;
...@@ -458,6 +481,8 @@ private: ...@@ -458,6 +481,8 @@ private:
* different implementations of index memory access. The cache is * different implementations of index memory access. The cache is
* committed and released at the end of the operation. * committed and released at the end of the operation.
*/ */
struct NodeHandle;
friend struct NodeHandle;
struct NodeHandle { struct NodeHandle {
enum Flags { enum Flags {
// bits 0,1 mark need for left,right prefix // bits 0,1 mark need for left,right prefix
...@@ -508,7 +533,6 @@ private: ...@@ -508,7 +533,6 @@ private:
}; };
typedef Ptr<NodeHandle> NodeHandlePtr; typedef Ptr<NodeHandle> NodeHandlePtr;
ArrayPool<NodeHandle> c_nodeHandlePool; ArrayPool<NodeHandle> c_nodeHandlePool;
friend class NodeHandle;
// parameters for methods // parameters for methods
...@@ -528,6 +552,8 @@ private: ...@@ -528,6 +552,8 @@ private:
/* /*
* Read index key attributes. * Read index key attributes.
*/ */
struct ReadPar;
friend struct ReadPar;
struct ReadPar { struct ReadPar {
TreeEnt m_ent; // tuple to read TreeEnt m_ent; // tuple to read
unsigned m_first; // first index attribute unsigned m_first; // first index attribute
...@@ -551,6 +577,8 @@ private: ...@@ -551,6 +577,8 @@ private:
/* /*
* Tree search for entry. * Tree search for entry.
*/ */
struct SearchPar;
friend struct SearchPar;
struct SearchPar { struct SearchPar {
ConstData m_data; // input index key values ConstData m_data; // input index key values
TreeEnt m_ent; // input tuple and version TreeEnt m_ent; // input tuple and version
...@@ -560,6 +588,8 @@ private: ...@@ -560,6 +588,8 @@ private:
/* /*
* Attribute data comparison. * Attribute data comparison.
*/ */
struct CmpPar;
friend struct CmpPar;
struct CmpPar { struct CmpPar {
ConstData m_data1; // full search key ConstData m_data1; // full search key
ConstData m_data2; // full or prefix data ConstData m_data2; // full or prefix data
...@@ -572,6 +602,8 @@ private: ...@@ -572,6 +602,8 @@ private:
/* /*
* Scan bound comparison. * Scan bound comparison.
*/ */
struct BoundPar;
friend struct BoundPar;
struct BoundPar { struct BoundPar {
ConstData m_data1; // full bound data ConstData m_data1; // full bound data
ConstData m_data2; // full or prefix data ConstData m_data2; // full or prefix data
......
...@@ -39,6 +39,15 @@ public: ...@@ -39,6 +39,15 @@ public:
Trix(const class Configuration & conf); Trix(const class Configuration & conf);
virtual ~Trix(); virtual ~Trix();
public:
// Subscription data, when communicating with SUMA
enum RequestType {
TABLE_REORG = 0,
INDEX_BUILD = 1
};
typedef DataBuffer<11> AttrOrderBuffer;
private: private:
// Private attributes // Private attributes
...@@ -87,14 +96,6 @@ private: ...@@ -87,14 +96,6 @@ private:
Uint16 c_noNodesFailed; Uint16 c_noNodesFailed;
Uint16 c_noActiveNodes; Uint16 c_noActiveNodes;
// Subscription data, when communicating with SUMA
enum RequestType {
TABLE_REORG = 0,
INDEX_BUILD = 1
};
typedef DataBuffer<11> AttrOrderBuffer;
AttrOrderBuffer::DataBufferPool c_theAttrOrderBufferPool; AttrOrderBuffer::DataBufferPool c_theAttrOrderBufferPool;
struct SubscriptionRecord { struct SubscriptionRecord {
......
...@@ -56,13 +56,14 @@ public: ...@@ -56,13 +56,14 @@ public:
NdbTableImpl* put(const char * name, NdbTableImpl *); NdbTableImpl* put(const char * name, NdbTableImpl *);
void drop(NdbTableImpl *); void drop(NdbTableImpl *);
void release(NdbTableImpl *); void release(NdbTableImpl *);
private: public:
enum Status { enum Status {
OK = 0, OK = 0,
DROPPED = 1, DROPPED = 1,
RETREIVING = 2 RETREIVING = 2
}; };
private:
struct TableVersion { struct TableVersion {
Uint32 m_version; Uint32 m_version;
Uint32 m_refCount; Uint32 m_refCount;
......
...@@ -234,7 +234,7 @@ NdbDictionary::Table::~Table(){ ...@@ -234,7 +234,7 @@ NdbDictionary::Table::~Table(){
} }
NdbDictionary::Table& NdbDictionary::Table&
NdbDictionary::Table::operator=(const NdbDictionary::Table::Table& table) NdbDictionary::Table::operator=(const NdbDictionary::Table& table)
{ {
m_impl.assign(table.m_impl); m_impl.assign(table.m_impl);
......
...@@ -56,8 +56,8 @@ NdbColumnImpl::NdbColumnImpl(NdbDictionary::Column & f) ...@@ -56,8 +56,8 @@ NdbColumnImpl::NdbColumnImpl(NdbDictionary::Column & f)
init(); init();
} }
NdbColumnImpl::NdbColumnImpl& NdbColumnImpl&
NdbColumnImpl::operator=(const NdbColumnImpl::NdbColumnImpl& col) NdbColumnImpl::operator=(const NdbColumnImpl& col)
{ {
m_attrId = col.m_attrId; m_attrId = col.m_attrId;
m_name = col.m_name; m_name = col.m_name;
......
...@@ -53,7 +53,7 @@ public: ...@@ -53,7 +53,7 @@ public:
template<class T> bool waitFor(Vector<T> &t, template<class T> bool waitFor(Vector<T> &t,
T *&handler, T *&handler,
NdbApiSignal *&signal, NdbApiSignal *&signal,
Uint32 timeout = DEFAULT_TIMEOUT); Uint32 timeout);
/** /**
* size() * size()
......
...@@ -186,8 +186,8 @@ public: ...@@ -186,8 +186,8 @@ public:
}; };
}; };
void * extern "C"
ExtNDB::signalExecThread_C(void *r) void *signalExecThread_C(void *r)
{ {
ExtNDB *grepps = (ExtNDB*)r; ExtNDB *grepps = (ExtNDB*)r;
...@@ -198,6 +198,7 @@ ExtNDB::signalExecThread_C(void *r) ...@@ -198,6 +198,7 @@ ExtNDB::signalExecThread_C(void *r)
return 0; return 0;
} }
void void
ExtNDB::signalExecThreadRun() ExtNDB::signalExecThreadRun()
{ {
...@@ -233,10 +234,12 @@ ExtNDB::signalExecThreadRun() ...@@ -233,10 +234,12 @@ ExtNDB::signalExecThreadRun()
sl.push_back(SigMatch(GSN_GREP_SUB_START_REF, &ExtNDB::sendSignalRep)); sl.push_back(SigMatch(GSN_GREP_SUB_START_REF, &ExtNDB::sendSignalRep));
sl.push_back(SigMatch(GSN_GREP_SUB_CREATE_REF, &ExtNDB::sendSignalRep)); sl.push_back(SigMatch(GSN_GREP_SUB_CREATE_REF, &ExtNDB::sendSignalRep));
while(1) { while(1) {
SigMatch *handler = NULL; SigMatch *handler = NULL;
NdbApiSignal *signal = NULL; NdbApiSignal *signal = NULL;
if(m_signalRecvQueue.waitFor(sl, handler, signal)) {
if(m_signalRecvQueue.waitFor(sl, handler, signal, DEFAULT_TIMEOUT)) {
#if 0 #if 0
RLOG(("Removed signal from queue (GSN: %d, QSize: %d)", RLOG(("Removed signal from queue (GSN: %d, QSize: %d)",
signal->readSignalNumber(), m_signalRecvQueue.size())); signal->readSignalNumber(), m_signalRecvQueue.size()));
......
...@@ -34,6 +34,10 @@ ...@@ -34,6 +34,10 @@
#include <rep/storage/GCIContainerPS.hpp> #include <rep/storage/GCIContainerPS.hpp>
#include "ExtAPI.hpp" #include "ExtAPI.hpp"
extern "C" {
static void * signalExecThread_C(void *);
}
/** /**
* @class ExtNDB * @class ExtNDB
* @brief Class responsible for connection to primary system GREP * @brief Class responsible for connection to primary system GREP
...@@ -58,15 +62,15 @@ public: ...@@ -58,15 +62,15 @@ public:
void signalErrorHandler(NdbApiSignal * s, Uint32 nodeId); void signalErrorHandler(NdbApiSignal * s, Uint32 nodeId);
private: private:
friend void * signalExecThread_C(void *);
void signalExecThreadRun();
static void execSignal(void* signalSender, NdbApiSignal* signal, static void execSignal(void* signalSender, NdbApiSignal* signal,
class LinearSectionPtr ptr[3]); class LinearSectionPtr ptr[3]);
static void execNodeStatus(void* signalSender, NodeId, static void execNodeStatus(void* signalSender, NodeId,
bool alive, bool nfCompleted); bool alive, bool nfCompleted);
void signalExecThreadRun();
static void * signalExecThread_C(void *);
void sendSignalRep(NdbApiSignal *); void sendSignalRep(NdbApiSignal *);
void sendDisconnectRep(Uint32 nodeId); void sendDisconnectRep(Uint32 nodeId);
......
...@@ -153,8 +153,9 @@ public: ...@@ -153,8 +153,9 @@ public:
}; };
}; };
extern "C"
void * void *
TransPS::signalExecThread_C(void *r) signalExecThread_C(void *r)
{ {
TransPS *repps = (TransPS*)r; TransPS *repps = (TransPS*)r;
...@@ -196,7 +197,7 @@ TransPS::signalExecThreadRun() ...@@ -196,7 +197,7 @@ TransPS::signalExecThreadRun()
while(1) { while(1) {
SigMatch *handler = NULL; SigMatch *handler = NULL;
NdbApiSignal *signal = NULL; NdbApiSignal *signal = NULL;
if(m_signalRecvQueue.waitFor(sl, handler, signal)) { if(m_signalRecvQueue.waitFor(sl, handler, signal, DEFAULT_TIMEOUT)) {
#if 0 #if 0
ndbout_c("TransPS: Removed signal from queue (GSN: %d, QSize: %d)", ndbout_c("TransPS: Removed signal from queue (GSN: %d, QSize: %d)",
signal->readSignalNumber(), m_signalRecvQueue.size()); signal->readSignalNumber(), m_signalRecvQueue.size());
......
...@@ -35,6 +35,10 @@ ...@@ -35,6 +35,10 @@
#include <rep/rep_version.hpp> #include <rep/rep_version.hpp>
extern "C" {
static void * signalExecThread_C(void *);
}
/** /**
* @class TransPS * @class TransPS
* @brief Responsible for REP-REP interface in Primary System role * @brief Responsible for REP-REP interface in Primary System role
...@@ -62,8 +66,10 @@ private: ...@@ -62,8 +66,10 @@ private:
/** /**
* SignalQueue executor thread * SignalQueue executor thread
*/ */
friend void * signalExecThread_C(void *);
void signalExecThreadRun(); void signalExecThreadRun();
static void * signalExecThread_C(void *);
static void execSignal(void* signalSender, NdbApiSignal* signal, static void execSignal(void* signalSender, NdbApiSignal* signal,
class LinearSectionPtr ptr[3]); class LinearSectionPtr ptr[3]);
......
...@@ -165,8 +165,9 @@ public: ...@@ -165,8 +165,9 @@ public:
}; };
}; };
extern "C"
void * void *
TransSS::signalExecThread_C(void *r) signalExecThread_C(void *r)
{ {
TransSS *transss = (TransSS*)r; TransSS *transss = (TransSS*)r;
...@@ -243,7 +244,7 @@ TransSS::signalExecThreadRun() ...@@ -243,7 +244,7 @@ TransSS::signalExecThreadRun()
while(1) { while(1) {
SigMatch *handler = NULL; SigMatch *handler = NULL;
NdbApiSignal *signal = NULL; NdbApiSignal *signal = NULL;
if(m_signalRecvQueue.waitFor(sl, handler, signal)) if(m_signalRecvQueue.waitFor(sl, handler, signal, DEFAULT_TIMEOUT))
{ {
#if 0 #if 0
ndbout_c("TransSS: Removed signal from queue (GSN: %d, QSize: %d)", ndbout_c("TransSS: Removed signal from queue (GSN: %d, QSize: %d)",
......
...@@ -34,6 +34,10 @@ ...@@ -34,6 +34,10 @@
#include <rep/state/RepState.hpp> #include <rep/state/RepState.hpp>
extern "C" {
static void * signalExecThread_C(void *);
}
/** /**
* @class TransSS * @class TransSS
* @brief Responsible for REP-REP interface in Standby System role * @brief Responsible for REP-REP interface in Standby System role
...@@ -57,8 +61,8 @@ private: ...@@ -57,8 +61,8 @@ private:
/*************************************************************************** /***************************************************************************
* Private Methods * Private Methods
***************************************************************************/ ***************************************************************************/
friend void * signalExecThread_C(void *);
void signalExecThreadRun(); ///< SignalQueue executor thread void signalExecThreadRun(); ///< SignalQueue executor thread
static void * signalExecThread_C(void *);
static void execSignal(void* executorObj, NdbApiSignal* signal, static void execSignal(void* executorObj, NdbApiSignal* signal,
class LinearSectionPtr ptr[3]); class LinearSectionPtr ptr[3]);
......
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