ROSCore/src/PCMemoryDataChannel.cpp BUG
在if语句外定义了ed,赋值为m_eventInputManager->getById(ticket)的返回值,如果未找到对应的Event Descriptor,
则返回EventInputManager::EIM_MAYCOME或者EventInputManager::EIM_NEVERTOCOME。
在if语句内也定义了ed, 赋值为m_eventInputManager->getEventDescriptor(mem_page)返回值,这是根据造的空数据的
内存内存地址得到对应的event descriptor,并修改该ED的值为ticket,然后根据ticket将该ed放进对应的List。
但是if语句里有对丢失数据的状态判断,这应该是用到的if外的ed值。在if语句重新定义ed后,覆盖了该if外的ed值,???此处是
不是有bug?
178 /**************************************************************/ 179 ROS::EventFragment* PCMemoryDataChannel::getFragment(int ticket) 180 /**************************************************************/ 181 { 182 evDesc_t *ed; 183 MemoryPage *mem_page; 184 EventFragment *fragment=0; 185 186 DEBUG_TEXT(DFDB_ROSFM, 10, "PCMemoryDataChannel::getFragment: fragment with L1ID " << ticket << " requested"); 187 // protect EIM and fast allocate with same mutex 188 m_mutex->lock(); 189 190 //Find the requested event 191 ed = m_eventInputManager->getById(ticket); 192 193 if (m_fragType == 0) 194 { 195 DEBUG_TEXT(DFDB_ROSFM, 10, "PCMemoryDataChannel::getFragment: processing ROB fragment"); 196 if((intptr_t)ed == EventInputManager::EIM_MAYCOME || (intptr_t)ed == EventInputManager::EIM_NEVERTOCOME) 197 { 198 DEBUG_TEXT(DFDB_ROSFM, 8, "EIM_MAYCOME || EIM_NEVERTOCOME " << ticket << "ed:" << ed <<std::endl); 199 try 200 { 201 fragment = new ROBFragment(m_memoryPool, ticket, m_sourceIdentifier, 0); //create an empty ROB fragment 202 Buffer *mem_buffer = fragment->buffer(); //get the Buffer of the ROB fragment 203 Buffer::page_iterator mem_page_i = mem_buffer->begin(); 204 MemoryPage *mem_page = const_cast<MemoryPage *>(*mem_page_i); //get the memory page of the buffer 205 mem_page->lock(); 206 207 evDesc_t *ed = m_eventInputManager->getEventDescriptor(mem_page); //get a pointer to the event descriptor 208 ed->L1id = ticket; //set the L1ID 209 m_eventInputManager->createEvent(ed); //Insert the event into the Event Input Manager 210 211 if ((intptr_t)ed == EventInputManager::EIM_MAYCOME) 212 { 213 m_statistics->fragmentsMissed++; 214 fragment->setStatus(EventFragment::STATUS_MAYCOME); 215 DEBUG_TEXT(DFDB_ROSFM, 8, "PCMemoryDataChannel::getFragment: Fragment for L1ID " << ticket << " has not yet arrived"); 216 } 217 218 if ((intptr_t)ed == EventInputManager::EIM_NEVERTOCOME) 219 { 220 m_statistics->fragmentsLost++; 221 fragment->setStatus(EventFragment::STATUS_LOST); 222 DEBUG_TEXT(DFDB_ROSFM, 8, "PCMemoryDataChannel::getFragment: Fragment for L1ID " << ticket << " does not exist"); 223 CREATE_ROS_EXCEPTION(ex1, CoreException, PCMEMCHAN_LOST, "\n L1ID = " << ticket << ", ROL physical addr = " << physicalAddr ess()); 224 ers::warning(ex1); 225 } 226 } 227 catch (EventFragmentException& e) 228 { 229 DEBUG_TEXT(DFDB_ROSFM, 8, "PCMemoryDataChannel::getFragment:EventFragmentException"); 230 DEBUG_TEXT(DFDB_ROSFM, 5, e); 231 m_mutex->unlock(); 232 throw e; 233 } 234 m_mutex->unlock(); 235 return(fragment); 236 } 237 } 238 239 if (m_fragType == 1) 240 { 241 DEBUG_TEXT(DFDB_ROSFM, 10, "PCMemoryDataChannel::getFragment: processing full fragment"); 242 if ((intptr_t)ed == EventInputManager::EIM_MAYCOME || (intptr_t)ed == EventInputManager::EIM_NEVERTOCOME) 243 { 244 DEBUG_TEXT(DFDB_ROSFM, 5, "PCMemoryDataChannel::getFragment: Fragment for L1ID " << ticket << " is not available"); 245 CREATE_ROS_EXCEPTION(ex1, CoreException, NODATA, "L1ID = " << ticket << ", ROL physical addr = " << physicalAddress()); 246 throw(ex1); 247 } 248 } 249 250 m_statistics->fragmentsServed++; 251 DEBUG_TEXT(DFDB_ROSFM, 20, "PCMemoryDataChannel::getFragment: getById returns " << HEX(ed)); 252 mem_page = ed->myPage; 253 254 DEBUG_TEXT(DFDB_ROSFM, 20, "PCMemoryDataChannel::getFragment: Dumping fields of this event descriptor:"); 255 DEBUG_TEXT(DFDB_ROSFM, 20, "PCMemoryDataChannel::getFragment: Address of memory page = " << std::hex << mem_page << std::dec); 256 DEBUG_TEXT(DFDB_ROSFM, 20, "PCMemoryDataChannel::getFragment: Fragment size (bytes) = " << ed->RODFragmentSize); 257 DEBUG_TEXT(DFDB_ROSFM, 20, "PCMemoryDataChannel::getFragment: Fragment status = " << ed->RODFragmentStatus); 258 259 if (m_fragType == 0) 260 { 261 //<+gumh: add time 262 //u_long base = (u_long)(mem_page->address()) ; 263 //u_int *ptr = (u_int *)(base + sizeof(ROBFragment::ROBHeader) + sizeof(RODFragment::RODHeader) + 4 + sizeof(timeval)); // 4 -> status element 264 //struct timeval tv ; 265 //gettimeofday(&tv, NULL) ; 266 //memcpy(ptr, &tv, sizeof(timeval)) ; 267 268 //u_int *ptr = (u_int *)(base + sizeof(ROBFragment::ROBHeader) + sizeof(RODFragment::RODHeader) + 4 + sizeof(timeval)); // 4 -> status element 269 //+> 270 271 //Create a ROB Fragment in the Buffer and initialize it 272 fragment = new ROBFragment(mem_page, ed->RODFragmentSize, 0, m_sourceIdentifier); 273 } 274 275 if (m_fragType == 1) 276 { 277 //Create a Full Fragment in the Buffer 278 fragment = new FullFragment(mem_page); 279 DEBUG_TEXT(DFDB_ROSFM, 20, "PCMemoryDataChannel::getFragment: Full fragment is at " << HEX(fragment)); 280 } 281 282 m_mutex->unlock(); 283 284 DEBUG_TEXT(DFDB_ROSFM, 10, "PCMemoryDataChannel::getFragment: PCMemoryDataChannel:: got fragment with L1ID " << ticket); 285 DEBUG_TEXT(DFDB_ROSFM, 15, "PCMemoryDataChannel::getFragment: done"); 286 287 return(fragment); 288 }