|
@@ -31,7 +31,39 @@ procsm::procsm(const char * strsmname,const unsigned int nBufSize,const unsigned
|
|
|
|
|
|
// qDebug("create dbus");
|
|
|
|
|
|
- mpASM = new QSharedMemory(strsmname);
|
|
|
+ strncpy(mstrsmname,strsmname,256);
|
|
|
+
|
|
|
+ mpASMPtr = new QSharedMemory(strsmname);
|
|
|
+
|
|
|
+
|
|
|
+ char strasmname[256];
|
|
|
+
|
|
|
+ if(nMode == ModeWrite)
|
|
|
+ {
|
|
|
+ bool bres = mpASMPtr->attach();
|
|
|
+ if(bres == false)
|
|
|
+ {
|
|
|
+ mpASMPtr->create(sizeof(ASM_PTR));
|
|
|
+ ASM_PTR * pasm = (ASM_PTR *)mpASMPtr->data();
|
|
|
+ snprintf(strasmname,256,"%s_%lld",strsmname,QDateTime::currentMSecsSinceEpoch());
|
|
|
+ pasm->mnshmsize = sizeof(procsm_info)+nMaxPacCount*sizeof(procsm_head) + nBufSize;
|
|
|
+ pasm->mnUpdateTime = QDateTime::currentMSecsSinceEpoch();
|
|
|
+ strncpy(pasm->mstrshmname,strasmname,256);
|
|
|
+ mASM_State = *pasm;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ ASM_PTR * pasm = (ASM_PTR *)mpASMPtr->data();
|
|
|
+ mASM_State = *pasm;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+// mpASM = new QSharedMemory(strsmname);
|
|
|
+ mpASM = new QSharedMemory(strasmname);
|
|
|
|
|
|
if(nMode == ModeWrite)
|
|
|
{
|
|
@@ -114,6 +146,88 @@ procsm::procsm(const char * strsmname,const unsigned int nBufSize,const unsigned
|
|
|
|
|
|
|
|
|
}
|
|
|
+}
|
|
|
+
|
|
|
+void procsm::recreateasm(int nbufsize)
|
|
|
+{
|
|
|
+
|
|
|
+ mnBufSize = nbufsize+100;
|
|
|
+ char strasmname[256];
|
|
|
+ ASM_PTR * pasm = (ASM_PTR *)mpASMPtr->data();
|
|
|
+ snprintf(strasmname,256,"%s_%lld",mstrsmname,QDateTime::currentMSecsSinceEpoch());
|
|
|
+ pasm->mnshmsize = sizeof(procsm_info)+mnMaxPacCount*sizeof(procsm_head) + mnBufSize;
|
|
|
+ pasm->mnUpdateTime = QDateTime::currentMSecsSinceEpoch();
|
|
|
+ strncpy(pasm->mstrshmname,strasmname,256);
|
|
|
+ mASM_State = *pasm;
|
|
|
+
|
|
|
+ mmodulemsg_type.mnBufSize = mnBufSize;
|
|
|
+ mmodulemsg_type.mnMsgBufCount = mnMaxPacCount;
|
|
|
+ strncpy(mmodulemsg_type.mstrmsgname,mASM_State.mstrshmname,255);
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ mpASM = new QSharedMemory(mASM_State.mstrshmname);
|
|
|
+
|
|
|
+ bool bAttach = false;
|
|
|
+ AttachThread AT(mpASM,bAttach);
|
|
|
+ AT.start();
|
|
|
+ QTime xTime;
|
|
|
+ xTime.start();
|
|
|
+ while(xTime.elapsed()<100)
|
|
|
+ {
|
|
|
+ if(AT.mbrun == false)
|
|
|
+ {
|
|
|
+ bAttach = AT.mbAttach;
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ // qDebug("time is %d",xTime.elapsed());
|
|
|
+ if(xTime.elapsed()>= 1000)
|
|
|
+ {
|
|
|
+ qDebug("in 1000ms Attach fail.terminate it .");
|
|
|
+ AT.terminate();
|
|
|
+ bAttach = false;
|
|
|
+ }
|
|
|
+
|
|
|
+ // if(!mpASM->attach())
|
|
|
+ if(!bAttach)
|
|
|
+ {
|
|
|
+
|
|
|
+ mpASM->create(sizeof(procsm_info)+mnMaxPacCount*sizeof(procsm_head) + mnBufSize);
|
|
|
+ char * p = (char *)mpASM->data();
|
|
|
+ mpinfo = (procsm_info *)p;
|
|
|
+ mphead = (procsm_head *)(p+sizeof(procsm_info));
|
|
|
+ mpinfo->mCap = mnMaxPacCount;
|
|
|
+ mpinfo->mnBufSize = mnBufSize;
|
|
|
+ mpinfo->mFirst = 0;
|
|
|
+ mpinfo->mNext = 0;
|
|
|
+ mpinfo->mLock = 0;
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ if(mpASM->isAttached())
|
|
|
+ {
|
|
|
+
|
|
|
+ mbAttach = true;
|
|
|
+ char * p = (char *)mpASM->data();
|
|
|
+ mpinfo = (procsm_info *)p;
|
|
|
+ mphead = (procsm_head *)(p+sizeof(procsm_info));
|
|
|
+ mnMaxPacCount = mpinfo->mCap;
|
|
|
+ mnBufSize = mpinfo->mnBufSize;
|
|
|
+ // qDebug("attach successful");
|
|
|
+ mstrtem = new char[mnBufSize];
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ mbAttach = false;
|
|
|
+ qDebug("Share Memory Error.");
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
}
|
|
|
|
|
|
#ifdef USEDBUS
|
|
@@ -132,6 +246,37 @@ procsm::procsm(const char * strsmname,const unsigned int nBufSize,const unsigned
|
|
|
|
|
|
bool procsm::AttachMem()
|
|
|
{
|
|
|
+
|
|
|
+ mpASMPtr->attach();
|
|
|
+ if(mpASMPtr->isAttached())
|
|
|
+ {
|
|
|
+ ASM_PTR * pasmptr = (ASM_PTR *)(mpASMPtr->data());
|
|
|
+ mASM_State = * pasmptr;
|
|
|
+
|
|
|
+ mpASM = new QSharedMemory(mASM_State.mstrshmname);
|
|
|
+
|
|
|
+ mpASM->attach();
|
|
|
+ if(mpASM->isAttached())
|
|
|
+ {
|
|
|
+ mbAttach = true;
|
|
|
+ char * p = (char *)mpASM->data();
|
|
|
+ mpinfo = (procsm_info *)p;
|
|
|
+ mphead = (procsm_head *)(p+sizeof(procsm_info));
|
|
|
+ mnMaxPacCount = mpinfo->mCap;
|
|
|
+ mnBufSize = mpinfo->mnBufSize;
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+
|
|
|
+ return false;
|
|
|
mpASM->attach();
|
|
|
if(mpASM->isAttached())
|
|
|
{
|
|
@@ -202,12 +347,35 @@ int procsm::MoveMem(const unsigned int nSize)
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
+
|
|
|
+void procsm::checkasm()
|
|
|
+{
|
|
|
+
|
|
|
+ ASM_PTR * pASM_PTR = (ASM_PTR * )mpASMPtr->data();
|
|
|
+ if(pASM_PTR->mnUpdateTime == mASM_State.mnUpdateTime)
|
|
|
+ {
|
|
|
+
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ mbAttach = false;
|
|
|
+ AttachMem();
|
|
|
+}
|
|
|
+
|
|
|
int procsm::writemsg(const char *str, const unsigned int nSize)
|
|
|
{
|
|
|
+ checkasm();
|
|
|
if(nSize > mnBufSize)
|
|
|
{
|
|
|
+ if(nSize<1000000000)
|
|
|
+ {
|
|
|
+ recreateasm(nSize);
|
|
|
+ checkasm();
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
qDebug("procsm::writemsg message size is very big");
|
|
|
return -1;
|
|
|
+ }
|
|
|
}
|
|
|
if(mbAttach == false)
|
|
|
{
|
|
@@ -324,6 +492,7 @@ int procsm::readmsg(unsigned int index, char *str, unsigned int nMaxSize,unsigne
|
|
|
std::cout<<"ShareMemory Attach fail."<<std::endl;
|
|
|
return -1;
|
|
|
}
|
|
|
+ checkasm();
|
|
|
int nRtn = 0;
|
|
|
mpASM->lock();
|
|
|
|