提交 6b813b73 编写于 作者: 丁劲犇's avatar 丁劲犇 😸

It is very strange, that in GNU C++ in Ubuntu, inline-member funcs called by...

It is very strange, that in GNU C++ in Ubuntu, inline-member funcs called by different thread will return zero values.
上级 5df4abe6
......@@ -12,6 +12,28 @@ namespace ZP_Cluster{
m_nPortPublish = 0;
m_last_Report = QDateTime::currentDateTime();
}
QDateTime zp_ClusterNode::lastActiveTime()
{
return m_last_Report;
}
QString zp_ClusterNode::termName()
{
return m_strTermName;
}
QHostAddress zp_ClusterNode::addrPublish()
{
return m_addrPublish;
}
int zp_ClusterNode::portPublish()
{
return m_nPortPublish;
}
QObject * zp_ClusterNode::sock()
{
return m_pSock;
}
int zp_ClusterNode::run()
{
if (bTermSet==true)
......@@ -173,6 +195,14 @@ namespace ZP_Cluster{
{
qint32 bytesLeft = m_currentHeader.data_length + sizeof(CROSS_SVR_MSG::tag_header)
-m_currentMessageSize ;
if (bytesLeft==0 && m_currentMessageSize>0)
{
if (m_currentBlock.length()>=64)
emit evt_Message(this,"Debug:" + m_currentBlock.toHex().left(64) + "..." + m_currentBlock.toHex().right(64));
else
emit evt_Message(this,"Debug:" + m_currentBlock.toHex());
}
const CROSS_SVR_MSG * pMsg =(const CROSS_SVR_MSG *) m_currentBlock.constData();
switch(m_currentHeader.messagetype)
{
......@@ -192,8 +222,8 @@ namespace ZP_Cluster{
emit evt_Message(this,tr("Info: New Svr already regisited. Ignored."));
emit evt_close_client(this->sock());
}
else
m_pTerm->BroadcastServers();
//else
//m_pTerm->BroadcastServers();
}
else
{
......@@ -220,6 +250,8 @@ namespace ZP_Cluster{
}
break;
default:
emit evt_Message(this,tr("Info:Unknown Msg Type got."));
emit evt_close_client(this->sock());
break;
};
......@@ -244,13 +276,16 @@ namespace ZP_Cluster{
pMsg->hearder.Mark = 0x1234;
pMsg->hearder.data_length = sizeof (CROSS_SVR_MSG::uni_payload::tag_CSM_BasicInfo);
pMsg->hearder.messagetype = 0x01;
strncpy((char *)pMsg->payload.basicInfo.name,
strncpy((char *)(pMsg->payload.basicInfo.name),
m_pTerm->name().toStdString().c_str(),
sizeof(pMsg->payload.basicInfo.name)-1);
strncpy((char *)pMsg->payload.basicInfo.Address,
strncpy((char *)(pMsg->payload.basicInfo.Address),
m_pTerm->publishAddr().toString().toStdString().c_str(),
sizeof(pMsg->payload.basicInfo.Address)-1);
pMsg->payload.basicInfo.port = m_pTerm->publishPort();
emit evt_SendDataToClient(sock(),array);
}
}
......@@ -30,14 +30,14 @@ namespace ZP_Cluster{
//!in Trans-Layer, it does nothing.
int deal_current_message_block();
QDateTime lastActiveTime(){ return m_last_Report;}
QDateTime lastActiveTime();
void CheckHeartBeating();
public:
QString termName(){return m_strTermName;}
QHostAddress addrPublish(){return m_addrPublish;}
int portPublish() {return m_nPortPublish;}
QObject * sock() { return m_pSock;}
QString termName();
QHostAddress addrPublish();
int portPublish() ;
QObject * sock() ;
//!Messages
public:
void SendHelloPackage();
......
......@@ -8,17 +8,57 @@ namespace ZP_Cluster{
{
m_pClusterEng = new ZPTaskEngine::zp_pipeline(this);
m_pClusterNet = new ZPNetwork::zp_net_Engine(8192,this);
connect(m_pClusterNet,&ZPNetwork::zp_net_Engine::evt_Message, this,&zp_ClusterTerm::evt_Message);
connect(m_pClusterNet,&ZPNetwork::zp_net_Engine::evt_SocketError, this,&zp_ClusterTerm::evt_SocketError);
connect(m_pClusterNet,&ZPNetwork::zp_net_Engine::evt_Data_recieved, this,&zp_ClusterTerm::on_evt_Data_recieved);
connect(m_pClusterNet,&ZPNetwork::zp_net_Engine::evt_Data_transferred, this,&zp_ClusterTerm::on_evt_Data_transferred);
connect(m_pClusterNet,&ZPNetwork::zp_net_Engine::evt_ClientDisconnected, this,&zp_ClusterTerm::on_evt_ClientDisconnected);
connect(m_pClusterNet,&ZPNetwork::zp_net_Engine::evt_NewClientConnected, this,&zp_ClusterTerm::on_evt_NewClientConnected);
connect(m_pClusterNet,&ZPNetwork::zp_net_Engine::evt_Message, this,&zp_ClusterTerm::evt_Message,Qt::QueuedConnection);
connect(m_pClusterNet,&ZPNetwork::zp_net_Engine::evt_SocketError, this,&zp_ClusterTerm::evt_SocketError,Qt::QueuedConnection);
connect(m_pClusterNet,&ZPNetwork::zp_net_Engine::evt_Data_recieved, this,&zp_ClusterTerm::on_evt_Data_recieved,Qt::QueuedConnection);
connect(m_pClusterNet,&ZPNetwork::zp_net_Engine::evt_Data_transferred, this,&zp_ClusterTerm::on_evt_Data_transferred,Qt::QueuedConnection);
connect(m_pClusterNet,&ZPNetwork::zp_net_Engine::evt_ClientDisconnected, this,&zp_ClusterTerm::on_evt_ClientDisconnected,Qt::QueuedConnection);
connect(m_pClusterNet,&ZPNetwork::zp_net_Engine::evt_NewClientConnected, this,&zp_ClusterTerm::on_evt_NewClientConnected,Qt::QueuedConnection);
//connect(m_pClusterNet,&ZPNetwork::zp_net_Engine::evt_ClientEncrypted, this,&zp_ClusterTerm::on_evt_ClientEncrypted);
m_nPortPublish = 0;
m_nHeartBeatingTime = 20;
}
int zp_ClusterTerm::publishPort(){
return m_nPortPublish;
}
ZPNetwork::zp_net_Engine * zp_ClusterTerm::netEng()
{
return m_pClusterNet;
}
ZPTaskEngine::zp_pipeline * zp_ClusterTerm::taskEng()
{
return m_pClusterEng;
}
QString zp_ClusterTerm::setName(const QString & s)
{
return m_strTermName = s;
}
QString zp_ClusterTerm::name()
{
return m_strTermName;
}
QHostAddress zp_ClusterTerm::publishAddr()
{
return m_addrPublish;
}
QHostAddress zp_ClusterTerm::setPublishAddr(QHostAddress addr)
{
return m_addrPublish = addr;
}
int zp_ClusterTerm::setPublishPort(int port)
{
return m_nPortPublish = port;
}
int zp_ClusterTerm::heartBeatingThrdHold()
{
return m_nHeartBeatingTime;
}
void zp_ClusterTerm::setHeartBeatingThrd(const int n)
{
m_nHeartBeatingTime = n;
}
void zp_ClusterTerm::StartListen(const QHostAddress &addr, int nPort)
{
m_pClusterNet->AddListeningAddress(m_strTermName,addr,nPort,false);
......@@ -265,7 +305,6 @@ namespace ZP_Cluster{
void zp_ClusterTerm::SendHeartBeatings()
{
//Msgs
int nMsgLen = sizeof(CROSS_SVR_MSG::tag_header);
QByteArray array(nMsgLen,0);
CROSS_SVR_MSG * pMsg =(CROSS_SVR_MSG *) array.data();
......@@ -273,5 +312,6 @@ namespace ZP_Cluster{
pMsg->hearder.data_length = 0;
pMsg->hearder.messagetype = 0x00;
m_pClusterNet->BroadcastData(0,array);
//BroadcastServers();
}
}
......@@ -20,21 +20,19 @@ namespace ZP_Cluster{
public:
explicit zp_ClusterTerm(const QString & name,QObject *parent = 0);
//cluster status
ZPNetwork::zp_net_Engine * netEng() {return m_pClusterNet;}
ZPTaskEngine::zp_pipeline * taskEng() {return m_pClusterEng;}
ZPNetwork::zp_net_Engine * netEng();
ZPTaskEngine::zp_pipeline * taskEng();
bool canExit();
//properties.
QString setName(const QString & s){ return m_strTermName = s;}
QString name(){return m_strTermName;}
QHostAddress publishAddr(){return m_addrPublish;}
int publishPort(){return m_nPortPublish;}
QHostAddress setPublishAddr(QHostAddress addr){return m_addrPublish = addr;}
int setPublishPort(int port){return m_nPortPublish = port;}
int heartBeatingThrdHold() {
return m_nHeartBeatingTime;
}
void setHeartBeatingThrd(const int n){m_nHeartBeatingTime = n;}
QString setName(const QString & s);
QString name();
QHostAddress publishAddr();
int publishPort();
QHostAddress setPublishAddr(QHostAddress addr);
int setPublishPort(int port);
int heartBeatingThrdHold() ;
void setHeartBeatingThrd(const int n);
bool regisitNewServer(zp_ClusterNode *);
void BroadcastServers();
void SendHeartBeatings();
......@@ -45,19 +43,17 @@ namespace ZP_Cluster{
int m_nPortPublish;//The publish port for other terms to connect to
ZPNetwork::zp_net_Engine * m_pClusterNet;
ZPTaskEngine::zp_pipeline * m_pClusterEng;
//Server Group Mapping
public:
zp_ClusterNode * SvrNodeFromName(const QString &);
zp_ClusterNode * SvrNodeFromSocket(QObject *);
protected:
//This list hold dead nodes that still in task queue,avoiding crash
QList<zp_ClusterNode *> m_nodeToBeDel;
//important hashes. server name to socket, socket to server name
QMutex m_hash_mutex;
QMap<QString , zp_ClusterNode *> m_hash_Name2node;
QMap<QObject *,zp_ClusterNode *> m_hash_sock2node;
//Server Group Mapping
public:
zp_ClusterNode * SvrNodeFromName(const QString &);
zp_ClusterNode * SvrNodeFromSocket(QObject *);
signals:
void evt_Message(QObject * ,const QString &);
......
......@@ -10,6 +10,12 @@ namespace ZPNetwork{
{
}
bool zp_netListenThread::bSSLConn()
{
return m_bSSLConn;
}
/**
* @brief The slot recieves startListen command from its parent
* zp_net_Engine object. the Qt's signal-and-slots system
......
......@@ -25,7 +25,7 @@ namespace ZPNetwork{
bool m_bSSLConn;
public:
explicit zp_netListenThread(const QString & id, QHostAddress address ,quint16 port,bool bSSL = true,QObject *parent = 0);
bool bSSLConn(){return m_bSSLConn;}
bool bSSLConn();
signals:
void evt_Message(QObject *,const QString &);
void evt_ListenClosed(const QString &);
......
......@@ -16,6 +16,23 @@ namespace ZPNetwork{
m_bSSLConnection = true;
assert(m_nPayLoad>=256 && m_nPayLoad<=16*1024*1024);
}
bool zp_netTransThread::isActive()
{
return m_bActivated;
}
bool zp_netTransThread::SSLConnection()
{
return m_bSSLConnection ;
}
void zp_netTransThread::SetSSLConnection(bool bssl)
{
m_bSSLConnection = bssl;
}
void zp_netTransThread::Deactivate()
{
m_bActivated = false;
}
/**
* @brief return a list contains all of online-clients objects.
*
......
......@@ -25,11 +25,11 @@ namespace ZPNetwork{
QList <QObject *> clientsList();
int CurrentClients();
void SetPayload(int nPayload);
bool isActive(){return m_bActivated;}
bool isActive();
bool CanExit();
bool SSLConnection(){return m_bSSLConnection ;}
void SetSSLConnection(bool bssl){ m_bSSLConnection = bssl;}
bool SSLConnection();
void SetSSLConnection(bool bssl);
private:
bool m_bActivated;
......@@ -53,7 +53,7 @@ namespace ZPNetwork{
//Broadcast dtarray to every client except objFromClient itself
void BroadcastData(QObject * objFromClient,const QByteArray & dtarray);
//Set terminate mark, the thread will quit after last client quit.
void Deactivate(){m_bActivated = false;}
void Deactivate();
//terminate this thread immediately
void DeactivateImmediately(zp_netTransThread *);
//Kick all clients .
......
......@@ -5,7 +5,10 @@ namespace ZPTaskEngine{
{
m_nExistingThreads = 0;
}
bool zp_pipeline::canClose()
{
return m_nExistingThreads==0?true:false;
}
/**
* @brief Add nThreads to the thread pool
*
......
......@@ -36,7 +36,7 @@ namespace ZPTaskEngine{
int payload();
int idleThreads();
bool canClose() {return m_nExistingThreads==0?true:false;}
bool canClose() ;
......
......@@ -5,5 +5,24 @@ namespace ZPTaskEngine{
{
refCount = 0;
}
int zp_plTaskBase::addRef()
{
QMutexLocker locker(&m_mutex_ref);
refCount++;
return refCount;
}
int zp_plTaskBase::delRef()
{
QMutexLocker locker(&m_mutex_ref);
refCount--;
return refCount;
}
int zp_plTaskBase::ref()
{
QMutexLocker locker(&m_mutex_ref);
return refCount;
}
}
......@@ -22,26 +22,10 @@ namespace ZPTaskEngine{
* when run() finished, the object will be re-injected into the tail of task-fifo.
*/
virtual int run() = 0;
int addRef()
{
QMutexLocker locker(&m_mutex_ref);
refCount++;
int addRef();
int delRef();
return refCount;
}
int delRef()
{
QMutexLocker locker(&m_mutex_ref);
refCount--;
return refCount;
}
int ref()
{
QMutexLocker locker(&m_mutex_ref);
return refCount;
}
int ref();
private:
int refCount;
......
......@@ -20,6 +20,47 @@ namespace SmartLink{
connect (m_pThreadPool,&ZPNetwork::zp_net_Engine::evt_Data_recieved,this,&st_client_table::on_evt_Data_recieved,Qt::QueuedConnection);
connect (m_pThreadPool,&ZPNetwork::zp_net_Engine::evt_Data_transferred,this,&st_client_table::on_evt_Data_transferred,Qt::QueuedConnection);
}
int st_client_table::heartBeatingThrd()
{
return m_nHeartBeatingDeadThrd;
}
void st_client_table::setHeartBeatingThrd(int h)
{
m_nHeartBeatingDeadThrd = h;
}
//Database and disk resources
QString st_client_table::Database_UserAcct()
{
return m_strDBName_useraccount;
}
void st_client_table::setDatabase_UserAcct(const QString & s)
{
m_strDBName_useraccount = s;
}
QString st_client_table::Database_Event()
{
return m_strDBName_event;
}
void st_client_table::setDatabase_Event(const QString & s)
{
m_strDBName_event = s;
}
QString st_client_table::largeFileFolder()
{
return m_largeFileFolder;
}
void st_client_table::setLargeFileFolder(const QString & s)
{
m_largeFileFolder = s;
}
ZPDatabase::DatabaseResource * st_client_table::dbRes()
{
return m_pDatabaseRes;
}
st_client_table::~st_client_table()
{
}
......
......@@ -24,18 +24,18 @@ namespace SmartLink{
//Heart beating and healthy
void KickDeadClients();
int heartBeatingThrd(){return m_nHeartBeatingDeadThrd;}
void setHeartBeatingThrd(int h) {m_nHeartBeatingDeadThrd = h;}
int heartBeatingThrd();
void setHeartBeatingThrd(int h) ;
//Database and disk resources
QString Database_UserAcct(){return m_strDBName_useraccount;}
void setDatabase_UserAcct(const QString & s){m_strDBName_useraccount = s;}
QString Database_Event(){return m_strDBName_event;}
void setDatabase_Event(const QString & s){m_strDBName_event = s;}
QString largeFileFolder(){return m_largeFileFolder;}
void setLargeFileFolder(const QString & s){m_largeFileFolder = s;}
QString Database_UserAcct();
void setDatabase_UserAcct(const QString & s);
QString Database_Event();
void setDatabase_Event(const QString & s);
QString largeFileFolder();
void setLargeFileFolder(const QString & s);
ZPDatabase::DatabaseResource * dbRes(){return m_pDatabaseRes;}
ZPDatabase::DatabaseResource * dbRes();
protected:
//This list hold dead nodes that still in task queue,avoiding crash
QList<st_clientNode_baseTrans *> m_nodeToBeDel;
......
......@@ -135,7 +135,10 @@ namespace SmartLink{
{
//then , Start deal to-server messages
//Server - deal messages
emit evt_Message(this,"Debug:" + m_currentBlock.toHex());
if (m_currentBlock.length()>=64)
emit evt_Message(this,"Debug:" + m_currentBlock.toHex().left(64) + "..." + m_currentBlock.toHex().right(64));
else
emit evt_Message(this,"Debug:" + m_currentBlock.toHex());
if (m_currentHeader.destin_id==0x00000001)
{
if (this->m_bLoggedIn==false || this->m_bUUIDRecieved==false)
......
......@@ -13,6 +13,37 @@ namespace SmartLink{
bTermSet = false;
m_last_Report = QDateTime::currentDateTime();
}
quint32 st_clientNode_baseTrans::uuid()
{
return m_uuid;
}
QObject * st_clientNode_baseTrans::sock()
{
return m_pClientSock;
}
bool st_clientNode_baseTrans::uuidValid()
{
return m_bUUIDRecieved;
}
QDateTime st_clientNode_baseTrans::lastActiveTime()
{
return m_last_Report;
}
qint32 st_clientNode_baseTrans::bytesLeft()
{
return m_currentHeader.data_length + sizeof(SMARTLINK_MSG) - 1
-m_currentMessageSize ;
}
//judge whether id is valid.
bool st_clientNode_baseTrans::bIsValidEquipId(quint32 id)
{
return id >=0x00010000 && id <=0x0FFFFFFF;
}
bool st_clientNode_baseTrans::bIsValidUserId(quint32 id)
{
return id >=(unsigned int)0x80000000 && id <=(unsigned int)0xAFFFFFFF;
}
//The main functional method, will run in thread pool
int st_clientNode_baseTrans::run()
{
......
......@@ -24,19 +24,14 @@ namespace SmartLink{
//push new binary data into queue
int push_new_data(const QByteArray & dtarray);
quint32 uuid(){return m_uuid;}
QObject * sock() {return m_pClientSock;}
bool uuidValid(){return m_bUUIDRecieved;}
bool bTermSet;
QDateTime lastActiveTime(){ return m_last_Report;}
qint32 bytesLeft()
{
return m_currentHeader.data_length + sizeof(SMARTLINK_MSG) - 1
-m_currentMessageSize ;
}
quint32 uuid();
QObject * sock();
bool uuidValid();
QDateTime lastActiveTime();
qint32 bytesLeft();
void CheckHeartBeating();
bool bTermSet;
protected:
//!deal one message, affect m_currentRedOffset,m_currentMessageSize,m_currentHeader
//!return bytes Used.
......@@ -45,8 +40,8 @@ namespace SmartLink{
virtual int deal_current_message_block();
//judge whether id is valid.
bool bIsValidEquipId(quint32 id){return id >=0x00010000 && id <=0x0FFFFFFF;}
bool bIsValidUserId(quint32 id){return id >=(unsigned int)0x80000000 && id <=(unsigned int)0xAFFFFFFF;}
bool bIsValidEquipId(quint32 id);
bool bIsValidUserId(quint32 id);
protected:
//The current Read Offset, from m_list_RawData's beginning
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册