procsm.cpp 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798
  1. #include <iostream>
  2. #include <thread>
  3. #include <QTime>
  4. #include <QThread>
  5. #include <algorithm>
  6. #include "procsm.h"
  7. #ifdef Q_OS_LINUX
  8. #include <unistd.h>
  9. #endif
  10. #include <QFile>
  11. #include <QDir>
  12. //#define RESET "\033[0m"
  13. //#define BLACK "\033[30m" /* Black */
  14. //#define RED "\033[31m" /* Red */
  15. //#define GREEN "\033[32m" /* Green */
  16. //#define YELLOW "\033[33m" /* Yellow */
  17. //#define BLUE "\033[34m" /* Blue */
  18. //#define MAGENTA "\033[35m" /* Magenta */
  19. //#define CYAN "\033[36m" /* Cyan */
  20. //#define WHITE "\033[37m" /* White */
  21. //#define BOLDBLACK "\033[1m\033[30m" /* Bold Black */
  22. //#define BOLDRED "\033[1m\033[31m" /* Bold Red */
  23. //#define BOLDGREEN "\033[1m\033[32m" /* Bold Green */
  24. //#define BOLDYELLOW "\033[1m\033[33m" /* Bold Yellow */
  25. //#define BOLDBLUE "\033[1m\033[34m" /* Bold Blue */
  26. //#define BOLDMAGENTA "\033[1m\033[35m" /* Bold Magenta */
  27. //#define BOLDCYAN "\033[1m\033[36m" /* Bold Cyan */
  28. //#define BOLDWHITE "\033[1m\033[37m" /* Bold White */
  29. class AttachThread : public QThread
  30. {
  31. public:
  32. AttachThread(QSharedMemory * pa,bool & bAttach)
  33. {
  34. mbAttach = bAttach;
  35. mpa = pa;
  36. mbrun = true;
  37. }
  38. QSharedMemory * mpa;
  39. bool mbAttach = false;
  40. bool mbrun = true;
  41. void run()
  42. {
  43. mbAttach = mpa->attach();
  44. mbrun = false;
  45. }
  46. };
  47. void procsm::threadAttachMon()
  48. {
  49. std::cout<<"\033[1m\033[32m"<<mstrsmname<<" threadAttachMon run."<<"\033[0m"<<std::endl;
  50. int nCount = 0;
  51. while(mbAttachRun)
  52. {
  53. if(mbInitComplete)
  54. {
  55. std::cout<<"\033[1m\033[32m"<<mstrsmname<<" Init Succesffuly."<<"\033[0m"<<std::endl;
  56. break;
  57. }
  58. std::this_thread::sleep_for(std::chrono::milliseconds(10));
  59. nCount++;
  60. if(nCount>300)
  61. {
  62. setfailmark();
  63. std::cerr<<"\033[1m\033[31m"<<" modulecomm msg "<<mstrsmname<<" Attach Fail."<<" Now Exit."<<"\033[0m"<<std::endl;
  64. std::this_thread::sleep_for(std::chrono::milliseconds(10));
  65. exit(-1);
  66. }
  67. }
  68. mbAttachThreadComplete = true;
  69. }
  70. void procsm::setfailmark()
  71. {
  72. char strfailpath[300];
  73. QDateTime xdt = QDateTime::currentDateTime();
  74. snprintf(strfailpath,300,"/dev/shm/%04d%02d%02d-%s",xdt.date().year(),
  75. xdt.date().month(),xdt.date().day(),mstrsmname);
  76. std::cerr<<"\033[1m\033[31m"<<" modulecomm msg "<<mstrsmname<<" fail. set mark file"<<strfailpath<<"\033[0m"<<std::endl;
  77. QFile xFile;
  78. xFile.setFileName(strfailpath);
  79. if(xFile.open(QIODevice::ReadWrite))
  80. {
  81. xFile.write(strfailpath,strnlen(strfailpath,256));
  82. xFile.close();
  83. std::cerr<<"\033[1m\033[31m"<<" modulecomm msg "<<mstrsmname<<" had save mark"<<"\033[0m"<<std::endl;
  84. }
  85. else
  86. {
  87. std::cerr<<"\033[1m\033[31m"<<" modulecomm msg "<<mstrsmname<<" save mark fail."<<"\033[0m"<<std::endl;
  88. }
  89. }
  90. bool procsm::checkfailmark()
  91. {
  92. char strfailpath[300];
  93. QDateTime xdt = QDateTime::currentDateTime();
  94. snprintf(strfailpath,300,"/dev/shm/%04d%02d%02d-%s",xdt.date().year(),
  95. xdt.date().month(),xdt.date().day(),mstrsmname);
  96. QFile xFile;
  97. xFile.setFileName(strfailpath);
  98. if(xFile.exists())
  99. {
  100. QDir xDir("/dev/shm");
  101. xDir.remove(strfailpath);
  102. std::cout<<"\033[1m\033[32m"<<" Last Time Attach Fail. Now Direct Create."<<"\033[0m"<<std::endl;
  103. return true;
  104. }
  105. return false;
  106. }
  107. procsm::procsm(const char * strsmname,const unsigned int nBufSize,const unsigned int nMaxPacCount,const int nMode)
  108. {
  109. // mnBufSize = nBufSize;
  110. // qDebug("create dbus");
  111. strncpy(mstrsmname,strsmname,256);
  112. mpASMPtr = new QSharedMemory(strsmname);
  113. mpthreadattmon = new std::thread(&procsm::threadAttachMon,this);
  114. char strasmname[256];
  115. bool bSMExit = false;
  116. if(nMode == ModeWrite)
  117. {
  118. bool bres;
  119. // if(checkfailmark())
  120. // {
  121. // bres = false;
  122. // }
  123. // else
  124. // {
  125. // bres = mpASMPtr->attach();
  126. // }
  127. // if(bres == false)
  128. // {
  129. // mpASMPtr->create(sizeof(ASM_PTR));
  130. // }
  131. bres = mpASMPtr->create(sizeof(ASM_PTR));
  132. if(bres == true)
  133. {
  134. std::cout<<"\033[1m\033[32m"<<mstrsmname<<" create successfully."<<"\033[0m"<<std::endl;
  135. }
  136. else
  137. {
  138. bres = mpASMPtr->attach();
  139. if(bres == true)
  140. {
  141. bSMExit = true;
  142. std::cout<<"\033[1m\033[32m"<<mstrsmname<<" exist. attach successfully."<<"\033[0m"<<std::endl;
  143. }
  144. else
  145. {
  146. return;
  147. }
  148. }
  149. ASM_PTR * pasm = (ASM_PTR *)mpASMPtr->data();
  150. if(pasm == NULL)
  151. {
  152. qDebug("ASM_PTR is NULL.");
  153. return;
  154. }
  155. if(bSMExit == false)
  156. {
  157. qint64 uptime = std::chrono::system_clock::now().time_since_epoch().count();
  158. snprintf(strasmname,256,"%s_%lld",strsmname,uptime);
  159. mpASMPtr->lock();
  160. pasm->mnshmsize = sizeof(procsm_info)+nMaxPacCount*sizeof(procsm_head) + nBufSize;
  161. pasm->mnUpdateTime = uptime;
  162. strncpy(pasm->mstrshmname,strasmname,256);
  163. mpASMPtr->unlock();
  164. }
  165. else
  166. {
  167. mpASMPtr->lock();
  168. pasm->mnUpdateTime = std::chrono::system_clock::now().time_since_epoch().count();
  169. strncpy(strasmname,pasm->mstrshmname,256);
  170. mpASMPtr->unlock();
  171. }
  172. mASM_State = *pasm;
  173. }
  174. else
  175. {
  176. mbInitComplete = true;
  177. return;
  178. }
  179. // mpASM = new QSharedMemory(strsmname);
  180. mpASM = new QSharedMemory(strasmname);
  181. if(nMode == ModeWrite)
  182. {
  183. strncpy(mmodulemsg_type.mstrmsgidname,strsmname,255);
  184. mmodulemsg_type.mnBufSize = nBufSize;
  185. mmodulemsg_type.mnMsgBufCount = nMaxPacCount;
  186. strncpy(mmodulemsg_type.mstrmsgname,strasmname,255);
  187. #ifdef Q_OS_LINUX
  188. mmodulemsg_type.mnPID = getpid();
  189. #endif
  190. #ifdef USEDBUS
  191. mmsg = QDBusMessage::createSignal("/catarc/adc", "adc.adciv.modulecomm", strsmname);
  192. mmsg<<1;
  193. #endif
  194. bool bAttach= true;
  195. // AttachThread AT(mpASM,bAttach);
  196. // AT.start();
  197. // QTime xTime;
  198. // xTime.start();
  199. // while(xTime.elapsed()<100)
  200. // {
  201. // if(AT.mbrun == false)
  202. // {
  203. // bAttach = AT.mbAttach;
  204. // break;
  205. // }
  206. // }
  207. // // qDebug("time is %d",xTime.elapsed());
  208. // if(xTime.elapsed()>= 1000)
  209. // {
  210. // qDebug("in 1000ms Attach fail.terminate it .");
  211. // AT.terminate();
  212. // bAttach = false;
  213. // }
  214. // if(!mpASM->attach())
  215. bool bares = mpASM->create(sizeof(procsm_info)+nMaxPacCount*sizeof(procsm_head) + nBufSize);
  216. if(bares == false) //Exist.
  217. {
  218. bAttach = mpASM->attach();
  219. if(bAttach)
  220. {
  221. char * p = (char *)mpASM->data();
  222. if(p == NULL)
  223. {
  224. qDebug("Create SharedMemory Fail.");
  225. return;
  226. }
  227. mpinfo = (procsm_info *)p;
  228. mphead = (procsm_head *)(p+sizeof(procsm_info));
  229. }
  230. else
  231. {
  232. std::cout<<" Exist,But Fail Attach."<<std::endl;
  233. }
  234. }
  235. else
  236. {
  237. char * p = (char *)mpASM->data();
  238. if(p == NULL)
  239. {
  240. qDebug("Create SharedMemory Fail.");
  241. return;
  242. }
  243. mpASM->lock();
  244. mpinfo = (procsm_info *)p;
  245. mphead = (procsm_head *)(p+sizeof(procsm_info));
  246. mpinfo->mCap = nMaxPacCount;
  247. mpinfo->mnBufSize = nBufSize;
  248. mpinfo->mFirst = 0;
  249. mpinfo->mNext = 0;
  250. mpinfo->mLock = 0;
  251. mpASM->unlock();
  252. }
  253. if(mpASM->isAttached())
  254. {
  255. mbAttach = true;
  256. char * p = (char *)mpASM->data();
  257. mpinfo = (procsm_info *)p;
  258. mphead = (procsm_head *)(p+sizeof(procsm_info));
  259. mpASM->lock();
  260. mnMaxPacCount = mpinfo->mCap;
  261. mnBufSize = mpinfo->mnBufSize;
  262. mpASM->unlock();
  263. // qDebug("attach successful");
  264. mstrtem = new char[mnBufSize];
  265. #ifdef USEDBUS
  266. mmsgres = QDBusMessage::createSignal("/catarc/adc", "adciv.interface", "modulemsgres");
  267. mmsgres<<1;
  268. bool bconnect = QDBusConnection::sessionBus().connect(QString(),"/catarc/adc", "adciv.interface", "modulemsgquery",this,SLOT(onQuery()));
  269. if(bconnect == false)
  270. {
  271. std::cout<<"procsm_if_readthread::procsm_if_readthread bconect is false"<<std::endl;
  272. }
  273. #endif
  274. }
  275. else
  276. {
  277. mbAttach = false;
  278. qDebug("Share Memory Error.");
  279. }
  280. }
  281. mbInitComplete = true;
  282. }
  283. procsm::~procsm()
  284. {
  285. if(mbAttachThreadComplete == false)
  286. {
  287. std::cout<<" Try to end Attach Monitor Thread."<<std::endl;
  288. mbAttachRun = false;
  289. mpthreadattmon->join();
  290. }
  291. if(mpASMPtr->isAttached())
  292. {
  293. std::cout<<"\033[32m"<<mstrsmname<<" detach ASMPtr "<<"\033[0m"<<std::endl;
  294. mpASMPtr->lock();
  295. if(mpASM->isAttached())
  296. {
  297. std::cout<<"\033[32m"<<mstrsmname<<" detach ASM "<<"\033[0m"<<std::endl;
  298. mpASM->detach();
  299. }
  300. mpASMPtr->unlock();
  301. delete mpASM;
  302. mpASMPtr->detach();
  303. }
  304. delete mpASMPtr;
  305. std::cout<<"\033[32m"<<mstrsmname<<" ~procsm() "<<"\033[0m"<<std::endl;
  306. }
  307. void procsm::recreateasm(int nbufsize)
  308. {
  309. mpASMPtr->lock();
  310. qDebug("recreate asms");
  311. mnBufSize = std::max(nbufsize*11/10,nbufsize+1000);
  312. // mnBufSize = nbufsize+100;
  313. char strasmname[256];
  314. ASM_PTR * pasm = (ASM_PTR *)mpASMPtr->data();
  315. snprintf(strasmname,256,"%s_%lld",mstrsmname,std::chrono::system_clock::now().time_since_epoch().count());//QDateTime::currentMSecsSinceEpoch());
  316. pasm->mnshmsize = sizeof(procsm_info)+mnMaxPacCount*sizeof(procsm_head) + mnBufSize;
  317. pasm->mnUpdateTime = std::chrono::system_clock::now().time_since_epoch().count();
  318. strncpy(pasm->mstrshmname,strasmname,256);
  319. mASM_State = *pasm;
  320. mmodulemsg_type.mnBufSize = mnBufSize;
  321. mmodulemsg_type.mnMsgBufCount = mnMaxPacCount;
  322. strncpy(mmodulemsg_type.mstrmsgname,mASM_State.mstrshmname,255);
  323. mpASM->lock();
  324. int noldmemsize = mpASM->size();
  325. char * px = new char[mpASM->size()];
  326. memcpy(px,mpASM->data(),noldmemsize);
  327. mpASM->unlock();
  328. mpASM->detach();
  329. qDebug("new asm name is %s,buffer size is %d ",mASM_State.mstrshmname,mnBufSize);
  330. mpASM = new QSharedMemory(mASM_State.mstrshmname);
  331. bool bAttach = false;
  332. AttachThread AT(mpASM,bAttach);
  333. AT.start();
  334. QTime xTime;
  335. xTime.start();
  336. while(xTime.elapsed()<100)
  337. {
  338. if(AT.mbrun == false)
  339. {
  340. bAttach = AT.mbAttach;
  341. break;
  342. }
  343. }
  344. // qDebug("time is %d",xTime.elapsed());
  345. if(xTime.elapsed()>= 1000)
  346. {
  347. qDebug("in 1000ms Attach fail.terminate it .");
  348. AT.terminate();
  349. bAttach = false;
  350. }
  351. // if(!mpASM->attach())
  352. if(!bAttach)
  353. {
  354. mpASM->create(sizeof(procsm_info)+mnMaxPacCount*sizeof(procsm_head) + mnBufSize);
  355. memcpy(mpASM->data(),px,noldmemsize);
  356. char * p = (char *)mpASM->data();
  357. mpinfo = (procsm_info *)p;
  358. mphead = (procsm_head *)(p+sizeof(procsm_info));
  359. mpinfo->mCap = mnMaxPacCount;
  360. mpinfo->mnBufSize = mnBufSize;
  361. // mpinfo->mFirst = nfirst;
  362. // mpinfo->mNext = nnext;
  363. // mpinfo->mLock = 0;
  364. }
  365. if(mpASM->isAttached())
  366. {
  367. mbAttach = true;
  368. char * p = (char *)mpASM->data();
  369. mpinfo = (procsm_info *)p;
  370. mphead = (procsm_head *)(p+sizeof(procsm_info));
  371. mnMaxPacCount = mpinfo->mCap;
  372. mnBufSize = mpinfo->mnBufSize;
  373. // qDebug("attach successful");
  374. // mstrtem = new char[mnBufSize];
  375. }
  376. else
  377. {
  378. mbAttach = false;
  379. qDebug("Share Memory Error.");
  380. }
  381. mpASMPtr->unlock();
  382. delete px;
  383. }
  384. #ifdef USEDBUS
  385. void procsm::onQuery()
  386. {
  387. QByteArray ba;
  388. ba.append((char *)&mmodulemsg_type,sizeof(iv::modulemsg_type));
  389. QList<QVariant> x;
  390. x<<ba;
  391. mmsgres.setArguments(x);
  392. QDBusConnection::sessionBus().send(mmsgres);
  393. }
  394. #endif
  395. bool procsm::AttachMem()
  396. {
  397. if(!mpASMPtr->isAttached())mpASMPtr->attach();
  398. if(mpASMPtr->isAttached())
  399. {
  400. ASM_PTR * pasmptr = (ASM_PTR *)(mpASMPtr->data());
  401. mASM_State = *pasmptr;
  402. if(mpASM != 0)
  403. {
  404. if(mpASM->isAttached())mpASM->detach();
  405. delete mpASM;
  406. }
  407. mpASM = new QSharedMemory(mASM_State.mstrshmname);
  408. mpASM->attach();
  409. if(mpASM->isAttached())
  410. {
  411. mbAttach = true;
  412. char * p = (char *)mpASM->data();
  413. mpinfo = (procsm_info *)p;
  414. mphead = (procsm_head *)(p+sizeof(procsm_info));
  415. mnMaxPacCount = mpinfo->mCap;
  416. mnBufSize = mpinfo->mnBufSize;
  417. return true;
  418. }
  419. else
  420. {
  421. return false;
  422. }
  423. }
  424. else
  425. {
  426. return false;
  427. }
  428. return false;
  429. mpASM->attach();
  430. if(mpASM->isAttached())
  431. {
  432. mbAttach = true;
  433. char * p = (char *)mpASM->data();
  434. mpinfo = (procsm_info *)p;
  435. mphead = (procsm_head *)(p+sizeof(procsm_info));
  436. mnMaxPacCount = mpinfo->mCap;
  437. mnBufSize = mpinfo->mnBufSize;
  438. return true;
  439. }
  440. else
  441. {
  442. return false;
  443. }
  444. }
  445. int procsm::MoveMem(const unsigned int nSize)
  446. {
  447. // qDebug("move mem");
  448. unsigned int nRemove = nSize;
  449. if(nRemove == 0)return -1;
  450. // unsigned int * pIndexFirst = (unsigned int *)mpASM->data();
  451. // unsigned int * pIndexNext = pIndexFirst+1;
  452. // qDebug("first = %d next = %d",*pIndexFirst,*pIndexNext);
  453. // unsigned int * pIndexNext = pIndexFirst;
  454. char * pH,*pD;
  455. pH = (char *)mpASM->data();pH = pH + sizeof(procsm_info);
  456. pD = (char *)mpASM->data();pD = pD + sizeof(procsm_info) + mnMaxPacCount * sizeof(procsm_head);
  457. procsm_head * phh = (procsm_head *)pH;
  458. unsigned int nPac = mpinfo->mNext - mpinfo->mFirst;
  459. if(nRemove >nPac)
  460. {
  461. // qDebug("procsm::MoveMem nRemove > nPac nRemove = %d",nRemove);
  462. nRemove = nPac;
  463. }
  464. if(nRemove == nPac)
  465. {
  466. mpinfo->mFirst = mpinfo->mFirst + (unsigned int)nRemove;
  467. return 0;
  468. }
  469. unsigned int i;
  470. int nDataMove = 0;
  471. for(i=0;i<nRemove;i++)
  472. {
  473. procsm_head * phd = phh+i;
  474. nDataMove = nDataMove + phd->mnLen;
  475. }
  476. unsigned int nDataTotal;
  477. for(i=0;i<(nPac - nRemove);i++)
  478. {
  479. memcpy(phh+i,phh+i+nRemove,sizeof(procsm_head));
  480. (phh+i)->mnPos = (phh+i)->mnPos - nDataMove;
  481. }
  482. nDataTotal = (phh + nPac-nRemove-1)->mnPos + (phh+nPac-nRemove-1)->mnLen;
  483. memcpy(mstrtem,pD+nDataMove,nDataTotal);
  484. memcpy(pD,mstrtem,nDataTotal);
  485. // for(i=0;i<nDataTotal;i++)
  486. // {
  487. // *(pD+i) = *(pD+i+nDataMove);
  488. // }
  489. mpinfo->mFirst = mpinfo->mFirst + (unsigned int)nRemove;
  490. return 0;
  491. }
  492. int procsm::checkasm()
  493. {
  494. mpASMPtr->lock();
  495. ASM_PTR * pASM_PTR = (ASM_PTR * )mpASMPtr->data();
  496. if((pASM_PTR->mnUpdateTime == mASM_State.mnUpdateTime) && (mbAttach == true) )
  497. {
  498. mpASMPtr->unlock();
  499. return 0;
  500. }
  501. qDebug("reattch mem.");
  502. mbAttach = false;
  503. AttachMem();
  504. mpASMPtr->unlock();
  505. return 1;
  506. }
  507. int procsm::writemsg(const char *str, const unsigned int nSize)
  508. {
  509. checkasm();
  510. if(nSize > mnBufSize)
  511. {
  512. if(nSize<1000000000)
  513. {
  514. recreateasm(nSize);
  515. checkasm();
  516. }
  517. else
  518. {
  519. qDebug("procsm::writemsg message size is very big");
  520. return -1;
  521. }
  522. }
  523. if(mbAttach == false)
  524. {
  525. std::cout<<mstrsmname<<"ShareMemory Attach fail."<<std::endl;
  526. return -1;
  527. }
  528. mpASM->lock();
  529. // unsigned int * pIndexFirst = (unsigned int *)mpASM->data();
  530. // unsigned int * pIndexNext = pIndexFirst+1;
  531. if(mpinfo->mLock == 1)
  532. {
  533. std::cout<<"ShareMemory have lock.Init."<<std::endl;
  534. mpinfo->mLock = 0;
  535. mpinfo->mFirst = 0;
  536. mpinfo->mNext = 0;
  537. }
  538. mpinfo->mLock =1;
  539. WRITEMSG:
  540. char * pH,*pD;
  541. QDateTime dt;
  542. pH = (char *)mpASM->data();pH = pH + sizeof(procsm_info);
  543. pD = (char *)mpASM->data();pD = pD + sizeof(procsm_info) + mnMaxPacCount * sizeof(procsm_head);
  544. procsm_head * phh = (procsm_head *)pH;
  545. unsigned int nPac = mpinfo->mNext - mpinfo->mFirst;
  546. if(nPac>=mnMaxPacCount)
  547. {
  548. unsigned int nRemove = mnMaxPacCount/3;
  549. if(nRemove == 0)nRemove = 1;
  550. MoveMem(nRemove);
  551. goto WRITEMSG;
  552. }
  553. if(nPac == 0)
  554. {
  555. memcpy(pD,str,nSize);
  556. dt = QDateTime::currentDateTime();
  557. // phh->mdt = dt;
  558. phh->SetDate(dt);
  559. // memcpy(&phh->mdt,&dt,sizeof(QDateTime));
  560. // phh->mdt = QDateTime::currentDateTime();
  561. phh->mindex = mpinfo->mNext;
  562. phh->mnPos = 0;
  563. phh->mnLen = nSize;
  564. mpinfo->mNext = mpinfo->mNext+1;
  565. }
  566. else
  567. {
  568. if(((phh+nPac-1)->mnPos+(phh+nPac-1)->mnLen + nSize)>=mnBufSize)
  569. {
  570. unsigned int nRemove = mnMaxPacCount/2;
  571. if(nRemove == 0)nRemove = 1;
  572. MoveMem(nRemove);
  573. goto WRITEMSG;
  574. }
  575. else
  576. {
  577. unsigned int nPos = (phh+nPac-1)->mnPos + (phh+nPac-1)->mnLen;
  578. // qDebug("write pos = %d",nPos);
  579. memcpy(pD+nPos,str,nSize);
  580. dt = QDateTime::currentDateTime();
  581. (phh+nPac)->SetDate(dt);
  582. // memcpy(&(phh+nPac)->mdt,&dt,sizeof(QDateTime));
  583. // (phh+nPac)->mdt = QDateTime::currentDateTime();
  584. (phh+nPac)->mindex = mpinfo->mNext;
  585. (phh+nPac)->mnPos = nPos;
  586. (phh+nPac)->mnLen = nSize;
  587. mpinfo->mNext = mpinfo->mNext+1;
  588. }
  589. }
  590. const unsigned int nTM = 0x6fffffff;
  591. if((mpinfo->mNext >nTM)&&(mpinfo->mFirst>nTM))
  592. {
  593. nPac = mpinfo->mNext - mpinfo->mFirst;
  594. unsigned int i;
  595. for(i=0;i<nPac;i++)
  596. {
  597. (phh+i)->mindex = (phh+i)->mindex-nTM;
  598. }
  599. mpinfo->mFirst = mpinfo->mFirst-nTM;
  600. mpinfo->mNext = mpinfo->mNext - nTM;
  601. }
  602. mpinfo->mLock = 0;
  603. mpASM->unlock();
  604. #ifdef USEDBUS
  605. QDBusConnection::sessionBus().send(mmsg);
  606. #endif
  607. // std::cout<<"write msg."<<std::endl;
  608. return 0;
  609. }
  610. unsigned int procsm::getcurrentnext()
  611. {
  612. checkasm();
  613. unsigned int nNext;
  614. mpASM->lock();
  615. nNext = mpinfo->mNext;
  616. mpASM->unlock();
  617. return nNext;
  618. }
  619. //if return 0 No Data.
  620. //if return -1 nMaxSize is small
  621. //if retrun -2 index is not in range,call getcurrentnext get position
  622. //if return > 0 readdata
  623. int procsm::readmsg(unsigned int index, char *str, unsigned int nMaxSize,unsigned int * nRead,QDateTime * pdt)
  624. {
  625. int ncheck = checkasm();
  626. // if(ncheck == 1)
  627. // {
  628. // return -100;
  629. // }
  630. if(mbAttach == false)
  631. {
  632. std::cout<<mstrsmname<<"ShareMemory Attach fail."<<std::endl;
  633. return -3;
  634. }
  635. int nRtn = 0;
  636. mpASM->lock();
  637. // if check is 1, maybe sharemem change. Read New Message.
  638. if(ncheck == 1)
  639. {
  640. if(mpinfo->mFirst < mpinfo->mNext)
  641. {
  642. std::cout<<" ShareMemroy Change. Read the newest."<<std::endl;
  643. mpASM->unlock();
  644. return -100;
  645. }
  646. else
  647. {
  648. mpASM->unlock();
  649. return -101;
  650. }
  651. }
  652. if((index< mpinfo->mFirst)||(index > mpinfo->mNext))
  653. {
  654. nRtn = -2;
  655. }
  656. if(nRtn != (-2))
  657. {
  658. if(index == mpinfo->mNext)
  659. {
  660. nRtn = 0;
  661. }
  662. else
  663. {
  664. char * pH,*pD;
  665. // pH = (char *)mpASM->data();pH = pH + 2*sizeof(unsigned int);
  666. // pD = (char *)mpASM->data();pD = pD + 2*sizeof(unsigned int) + mnMaxPacCount * sizeof(procsm_head);
  667. pD = (char *)mpASM->data();pD = pD+ sizeof(procsm_info) + mpinfo->mCap*sizeof(procsm_head);
  668. pH = (char *)mpASM->data();pH = pH+sizeof(procsm_info);
  669. procsm_head * phh = (procsm_head *)pH;
  670. unsigned int nPac = mpinfo->mNext - mpinfo->mFirst;
  671. if(nPac == 0)
  672. {
  673. nRtn = 0;
  674. }
  675. else
  676. {
  677. unsigned int nPos = index - mpinfo->mFirst;
  678. *nRead = (phh+nPos)->mnLen;
  679. if((phh+nPos)->mnLen > nMaxSize)
  680. {
  681. nRtn = -1;
  682. }
  683. else
  684. {
  685. // qDebug("read pos = %d",(phh+nPos)->mnPos);
  686. memcpy(str,pD + (phh+nPos)->mnPos,(phh+nPos)->mnLen);
  687. // qDebug("read pos = %d",(phh+nPos)->mnPos);
  688. nRtn = (phh+nPos)->mnLen;
  689. (phh+nPos)->GetDate(pdt);
  690. // memcpy(pdt,&((phh+nPos)->mdt),sizeof(QDateTime));
  691. }
  692. }
  693. }
  694. }
  695. mpASM->unlock();
  696. return nRtn;
  697. }