Browse Source

change src1/common/modulecomm. for use new logic.

yuchuli 3 years ago
parent
commit
05ed459cfc
2 changed files with 189 additions and 1 deletions
  1. 170 1
      src1/common/modulecomm/shm/procsm.cpp
  2. 19 0
      src1/common/modulecomm/shm/procsm.h

+ 170 - 1
src1/common/modulecomm/shm/procsm.cpp

@@ -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();
 

+ 19 - 0
src1/common/modulecomm/shm/procsm.h

@@ -15,6 +15,16 @@
 
 #include "ivmodulemsg_type.h"
 
+
+class ASM_PTR
+{
+public:
+    qint64 mnUpdateTime;
+    char mstrshmname[256];
+    unsigned int mnshmsize;
+    char mstrreserve[1000];
+};
+
 class procsm_info
 {
 public:
@@ -78,11 +88,13 @@ public:
 private:
     int MoveMem(const unsigned int nSize);
     QSharedMemory * mpASM;
+    QSharedMemory * mpASMPtr;
     unsigned int mnBufSize;
     unsigned int mnMaxPacCount;
     procsm_info * mpinfo;
     procsm_head * mphead;
 
+    ASM_PTR mASM_State;
     bool mbAttach;
 
     char * mstrtem;
@@ -105,6 +117,13 @@ private:
 
 #endif
 
+private:
+    void checkasm();
+    void recreateasm(int nbufsize);
+
+private:
+    char mstrsmname[256];
+
 
 
 };