void Device::Submit(const UrbPtr &urb, int timeout) { urb->Submit(); { scoped_mutex_lock l(_mutex); _urbs.insert(std::make_pair(&urb->KernelUrb, urb)); } try { while(true) { UrbPtr completedUrb; { void *completedKernelUrb = Reap(timeout); scoped_mutex_lock l(_mutex); auto urbIt = _urbs.find(completedKernelUrb); if (urbIt == _urbs.end()) { fprintf(stderr, "got unknown urb: %p\n", completedKernelUrb); continue; } completedUrb = urbIt->second; _urbs.erase(urbIt); } if (completedUrb == urb) break; } } catch(const TimeoutException &ex) { urb->Discard(); throw; } catch(const std::exception &ex) { fprintf(stderr, "error while submitting urb: %s\n", ex.what()); urb->Discard(); throw; } }
CEStat IO::SendAndReapCmd(string grpName, string testName, uint32_t ms, SharedSQPtr sq, SharedCQPtr cq, SharedCmdPtr cmd, string qualify, bool verbose, std::vector<CEStat> &status, CEStat (*Reap)(SharedCQPtr, uint32_t, uint32_t &, string, string, string, std::vector<CEStat> &, bool)) { uint32_t numCE; uint32_t isrCount; string work; SendCmd(grpName, testName, sq, cq, cmd, numCE, isrCount, qualify, verbose); WaitForReap(grpName, testName, ms, cq, cmd, numCE, isrCount, qualify, verbose); // throws if an error occurs CEStat retStat = Reap(cq, numCE, isrCount, grpName, testName, qualify, status, true); if (verbose) { cmd->Dump(FileSystem::PrepDumpFile(grpName, testName, cmd->GetName(), qualify), "A cmd's contents dumped"); } return retStat; }