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;
		}
	}
Exemplo n.º 2
0
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;
}