如何找到bug(7): 检查事例完整性的逻辑

在 SequentialInputHandler.cpp里,areFragmentsThere()函数用来检查L1id事例的数据片段有没有到齐。

305 /***************************************************************/
306 bool SequentialInputHandler::areFragmentsThere(unsigned int l1id)
307 /***************************************************************/
308 {
309 
310   std::map <unsigned int, int>::iterator it;
311 
312   DEBUG_TEXT(DFDB_ROSFM, 10, "SequentialInputHandler::areFragmentsThere. On entry:  l1id =  "
313                             << l1id << " Size of outstanding map = " << m_outStandingEvents.size());
314   //If there is a single data channel, every new incoming fragment shall generate a trigger
315   if (m_numberOfDataChannels==1)
316     return true;
317 
318   //IF in singleFragment mode every new incoming fragment shall generate a trigger
319   if (m_singleFragmentMode)
320     return true;
321 
322   // update map size histogram
323   int mapsize = m_outStandingEvents.size();
324   if (mapsize < (c_mapSizeBins - 1)) {
325     m_mapSizeHist[mapsize]++;
326   }
327   else {                            // overflow
328     DEBUG_TEXT(DFDB_ROSFM, 8, "mapsize:" << mapsize << std::endl);
329     m_mapSizeHist[c_mapSizeBins - 1]++;
330   }
331 
332   it = m_outStandingEvents.find(l1id);
333   if (it == m_outStandingEvents.end()) {  // add l1id to map, suggest at the end
334     m_outStandingEvents.insert(m_outStandingEvents.end(), std::pair<unsigned int, int>(l1id, 1));
335     return false;
336   }
337   else {  // l1id found
338     if (it->second == (m_numberOfDataChannels-1)) { // complete 
339 
340       for(std::map <u_int, int>::iterator iter = m_outStandingEvents.begin(); iter != m_outStandingEvents.end(); iter++)
341       {
342         DEBUG_TEXT(DFDB_ROSFM,8, "iter->first:" << iter->first << ", iter->second:" << iter->second <<  std::endl);
343       } //打印出来m_outStandingEvents的所有元素
344       m_outStandingEvents.erase(it);
345       DEBUG_TEXT(DFDB_ROSFM, 8, "areFragmentsThere: l1id complete " << l1id << " l1id erased and map size = " << m_outStandingEvent    s.size());
346       return true;
347     }
348     else {  // incomplete
349       (it->second)++;
350       return false;
351     }
352   }
353 }

 

查看头文件:

 72     std::map <u_int, int> m_outStandingEvents;              //u_int = L1ID, int = Number of fragments received for this L1ID
 73                                                        //Once each channel has sent a fragment for a given L1ID the event can be processed

81 static const int c_mapSizeBins = 100; //Histogram (see below)  常量静态数据成员
82 std::vector<int> m_mapSizeHist; //The histogram tells you how many events (in terms of L1IDs) the system was working on in parallel                       //at any moment in time

 

 

第331~347行是检查事例片段是否到齐的逻辑,m_outStandingEvents是一个map, map元素的key为已经接收的L1id, value为已经接收的L1id Fragment的个数。

每个dataChannel接收一个Fragment后,都会调用一次areFragmentsThere()来检查该L1id 的Fragment是否到齐。

检查逻辑是: 例如检查L1id=m的数据片段是否到齐: areFragmentsThere(m)

如果没有在m_outStandingEvents里找到m, 说明之前还没接收过L1id=m的数据片段,于是在m_outStandingEvents的最后插入<m, 1>,表示现在收到L1id=m的第一个数据片段;

如果在m_outStandingEvents里找到了key=m的元素,value < m_numberOfDataChannels-1, 说明之前就收到过L1id=m的数据片段,但是还没收齐,将value值加1, 表示又收到了一个;如果value =m_numberOfDataChannels-1,说明现在刚好收齐了所有L1id=m的数据片段。

 

log文件:

   3687 Debug(1,139760517510912): iter->first:0, iter->second:63
   3688 
   3689 Debug(1,139760517510912): iter->first:1, iter->second:22
   3690 
   3691 Debug(1,139760517510912): iter->first:2, iter->second:9
   3692 
   3693 Debug(1,139760517510912): iter->first:3, iter->second:8
   3694 
   3695 Debug(1,139760517510912): iter->first:4, iter->second:1
   3696 
   3697 Debug(1,139760517510912): iter->first:5, iter->second:1
   3698 
   3699 Debug(1,139760517510912): areFragmentsThere: l1id complete 0 l1id erased and map size = 5
   3700 InputHandler got first ROD: 0
   3701 now we are going to recv data!
   3702 Debug(1,139760517510912): iter->first:1, iter->second:42
   3703 
   3704 Debug(1,139760517510912): iter->first:2, iter->second:55
   3705 
   3706 Debug(1,139760517510912): iter->first:3, iter->second:56
   3707 
   3708 Debug(1,139760517510912): iter->first:4, iter->second:63
   3709 
   3710 Debug(1,139760517510912): iter->first:5, iter->second:63
   3711 
   3712 Debug(1,139760517510912): iter->first:6, iter->second:63
   3713 
   3714 Debug(1,139760517510912): iter->first:7, iter->second:22
   3715 
   3716 Debug(1,139760517510912): iter->first:8, iter->second:9
   3717 
   3718 Debug(1,139760517510912): iter->first:9, iter->second:8
   3719 
   3720 Debug(1,139760517510912): iter->first:10, iter->second:1
   3721 
   3722 Debug(1,139760517510912): iter->first:11, iter->second:1
   3723 
   3724 Debug(1,139760517510912): areFragmentsThere: l1id complete 6 l1id erased and map size = 10

为什么log文件里面L1id值大的Fragment收到的个数比L1id值小的Fragment收到的个数还多呢?按照这个检查逻辑,好像有哪里不对啊?

 

posted @ 2017-02-20 20:00  小荷才楼尖尖角  Views(166)  Comments(0Edit  收藏  举报