|
@@ -132,6 +132,8 @@ procsm::procsm(const char * strsmname,const unsigned int nBufSize,const unsigned
|
|
|
|
|
|
char strasmname[256];
|
|
|
|
|
|
+ bool bSMExit = false;
|
|
|
+
|
|
|
if(nMode == ModeWrite)
|
|
|
{
|
|
|
bool bres;
|
|
@@ -159,6 +161,7 @@ procsm::procsm(const char * strsmname,const unsigned int nBufSize,const unsigned
|
|
|
bres = mpASMPtr->attach();
|
|
|
if(bres == true)
|
|
|
{
|
|
|
+ bSMExit = true;
|
|
|
std::cout<<"\033[1m\033[32m"<<mstrsmname<<" exist. attach successfully."<<"\033[0m"<<std::endl;
|
|
|
}
|
|
|
else
|
|
@@ -173,10 +176,23 @@ procsm::procsm(const char * strsmname,const unsigned int nBufSize,const unsigned
|
|
|
qDebug("ASM_PTR is NULL.");
|
|
|
return;
|
|
|
}
|
|
|
- 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);
|
|
|
+ if(bSMExit == false)
|
|
|
+ {
|
|
|
+ qint64 uptime = std::chrono::system_clock::now().time_since_epoch().count();
|
|
|
+ snprintf(strasmname,256,"%s_%lld",strsmname,uptime);
|
|
|
+ mpASMPtr->lock();
|
|
|
+ pasm->mnshmsize = sizeof(procsm_info)+nMaxPacCount*sizeof(procsm_head) + nBufSize;
|
|
|
+ pasm->mnUpdateTime = uptime;
|
|
|
+ strncpy(pasm->mstrshmname,strasmname,256);
|
|
|
+ mpASMPtr->unlock();
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ mpASMPtr->lock();
|
|
|
+ pasm->mnUpdateTime = std::chrono::system_clock::now().time_since_epoch().count();
|
|
|
+ strncpy(strasmname,pasm->mstrshmname,256);
|
|
|
+ mpASMPtr->unlock();
|
|
|
+ }
|
|
|
mASM_State = *pasm;
|
|
|
}
|
|
|
else
|
|
@@ -203,7 +219,7 @@ procsm::procsm(const char * strsmname,const unsigned int nBufSize,const unsigned
|
|
|
mmsg<<1;
|
|
|
#endif
|
|
|
|
|
|
- bool bAttach = mpASM->attach();
|
|
|
+ bool bAttach= true;
|
|
|
// AttachThread AT(mpASM,bAttach);
|
|
|
// AT.start();
|
|
|
// QTime xTime;
|
|
@@ -225,16 +241,40 @@ procsm::procsm(const char * strsmname,const unsigned int nBufSize,const unsigned
|
|
|
// }
|
|
|
|
|
|
// if(!mpASM->attach())
|
|
|
- if(!bAttach)
|
|
|
+
|
|
|
+ bool bares = mpASM->create(sizeof(procsm_info)+nMaxPacCount*sizeof(procsm_head) + nBufSize);
|
|
|
+ if(bares == false) //Exist.
|
|
|
{
|
|
|
+ bAttach = mpASM->attach();
|
|
|
+
|
|
|
+ if(bAttach)
|
|
|
+ {
|
|
|
+ char * p = (char *)mpASM->data();
|
|
|
+ if(p == NULL)
|
|
|
+ {
|
|
|
+ qDebug("Create SharedMemory Fail.");
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ mpinfo = (procsm_info *)p;
|
|
|
+ mphead = (procsm_head *)(p+sizeof(procsm_info));
|
|
|
+
|
|
|
|
|
|
- mpASM->create(sizeof(procsm_info)+nMaxPacCount*sizeof(procsm_head) + nBufSize);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ std::cout<<" Exist,But Fail Attach."<<std::endl;
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
char * p = (char *)mpASM->data();
|
|
|
if(p == NULL)
|
|
|
{
|
|
|
qDebug("Create SharedMemory Fail.");
|
|
|
return;
|
|
|
}
|
|
|
+ mpASM->lock();
|
|
|
mpinfo = (procsm_info *)p;
|
|
|
mphead = (procsm_head *)(p+sizeof(procsm_info));
|
|
|
mpinfo->mCap = nMaxPacCount;
|
|
@@ -242,11 +282,10 @@ procsm::procsm(const char * strsmname,const unsigned int nBufSize,const unsigned
|
|
|
mpinfo->mFirst = 0;
|
|
|
mpinfo->mNext = 0;
|
|
|
mpinfo->mLock = 0;
|
|
|
+ mpASM->unlock();
|
|
|
}
|
|
|
|
|
|
|
|
|
-
|
|
|
-
|
|
|
if(mpASM->isAttached())
|
|
|
{
|
|
|
|
|
@@ -254,8 +293,10 @@ procsm::procsm(const char * strsmname,const unsigned int nBufSize,const unsigned
|
|
|
char * p = (char *)mpASM->data();
|
|
|
mpinfo = (procsm_info *)p;
|
|
|
mphead = (procsm_head *)(p+sizeof(procsm_info));
|
|
|
+ mpASM->lock();
|
|
|
mnMaxPacCount = mpinfo->mCap;
|
|
|
mnBufSize = mpinfo->mnBufSize;
|
|
|
+ mpASM->unlock();
|
|
|
// qDebug("attach successful");
|
|
|
mstrtem = new char[mnBufSize];
|
|
|
|
|
@@ -321,9 +362,9 @@ 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());
|
|
|
+ snprintf(strasmname,256,"%s_%lld",mstrsmname,std::chrono::system_clock::now().time_since_epoch().count());//QDateTime::currentMSecsSinceEpoch());
|
|
|
pasm->mnshmsize = sizeof(procsm_info)+mnMaxPacCount*sizeof(procsm_head) + mnBufSize;
|
|
|
- pasm->mnUpdateTime = QDateTime::currentMSecsSinceEpoch();
|
|
|
+ pasm->mnUpdateTime = std::chrono::system_clock::now().time_since_epoch().count();
|
|
|
strncpy(pasm->mstrshmname,strasmname,256);
|
|
|
mASM_State = *pasm;
|
|
|
|
|
@@ -429,7 +470,7 @@ bool procsm::AttachMem()
|
|
|
if(mpASMPtr->isAttached())
|
|
|
{
|
|
|
ASM_PTR * pasmptr = (ASM_PTR *)(mpASMPtr->data());
|
|
|
- mASM_State = * pasmptr;
|
|
|
+ mASM_State = *pasmptr;
|
|
|
|
|
|
if(mpASM != 0)
|
|
|
{
|
|
@@ -531,21 +572,22 @@ int procsm::MoveMem(const unsigned int nSize)
|
|
|
}
|
|
|
|
|
|
|
|
|
-void procsm::checkasm()
|
|
|
+int procsm::checkasm()
|
|
|
{
|
|
|
|
|
|
mpASMPtr->lock();
|
|
|
ASM_PTR * pASM_PTR = (ASM_PTR * )mpASMPtr->data();
|
|
|
- if(pASM_PTR->mnUpdateTime == mASM_State.mnUpdateTime)
|
|
|
+ if((pASM_PTR->mnUpdateTime == mASM_State.mnUpdateTime) && (mbAttach == true) )
|
|
|
{
|
|
|
|
|
|
mpASMPtr->unlock();
|
|
|
- return;
|
|
|
+ return 0;
|
|
|
}
|
|
|
qDebug("reattch mem.");
|
|
|
mbAttach = false;
|
|
|
AttachMem();
|
|
|
mpASMPtr->unlock();
|
|
|
+ return 1;
|
|
|
}
|
|
|
|
|
|
int procsm::writemsg(const char *str, const unsigned int nSize)
|
|
@@ -653,6 +695,7 @@ WRITEMSG:
|
|
|
#ifdef USEDBUS
|
|
|
QDBusConnection::sessionBus().send(mmsg);
|
|
|
#endif
|
|
|
+// std::cout<<"write msg."<<std::endl;
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
@@ -674,7 +717,11 @@ unsigned int procsm::getcurrentnext()
|
|
|
//if return > 0 readdata
|
|
|
int procsm::readmsg(unsigned int index, char *str, unsigned int nMaxSize,unsigned int * nRead,QDateTime * pdt)
|
|
|
{
|
|
|
- checkasm();
|
|
|
+ int ncheck = checkasm();
|
|
|
+// if(ncheck == 1)
|
|
|
+// {
|
|
|
+// return -100;
|
|
|
+// }
|
|
|
if(mbAttach == false)
|
|
|
{
|
|
|
std::cout<<mstrsmname<<"ShareMemory Attach fail."<<std::endl;
|
|
@@ -683,6 +730,22 @@ int procsm::readmsg(unsigned int index, char *str, unsigned int nMaxSize,unsigne
|
|
|
int nRtn = 0;
|
|
|
mpASM->lock();
|
|
|
|
|
|
+// if check is 1, maybe sharemem change. Read New Message.
|
|
|
+ if(ncheck == 1)
|
|
|
+ {
|
|
|
+
|
|
|
+ if(mpinfo->mFirst < mpinfo->mNext)
|
|
|
+ {
|
|
|
+ std::cout<<" ShareMemroy Change. Read the newest."<<std::endl;
|
|
|
+ mpASM->unlock();
|
|
|
+ return -100;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ mpASM->unlock();
|
|
|
+ return -101;
|
|
|
+ }
|
|
|
+ }
|
|
|
if((index< mpinfo->mFirst)||(index > mpinfo->mNext))
|
|
|
{
|
|
|
nRtn = -2;
|
|
@@ -729,6 +792,7 @@ int procsm::readmsg(unsigned int index, char *str, unsigned int nMaxSize,unsigne
|
|
|
}
|
|
|
}
|
|
|
mpASM->unlock();
|
|
|
+
|
|
|
return nRtn;
|
|
|
}
|
|
|
|