http://stxxl.sourceforge.net
<dementiev@mpi-sb.mpg.de>
<beckmann@cs.uni-frankfurt.de>
<singler@ira.uka.de>
http://www.boost.org/LICENSE_1_0.txt
#ifndef STXXL_IO_DISK_QUEUES_HEADER
#define STXXL_IO_DISK_QUEUES_HEADER
#include <map>
#include <stxxl/bits/namespace.h>
#include <stxxl/bits/singleton.h>
#include <stxxl/bits/io/iostats.h>
#include <stxxl/bits/io/request_queue_impl_qwqr.h>
__STXXL_BEGIN_NAMESPACE
class request_ptr;
class disk_queues : public singleton<disk_queues>
{
friend class singleton<disk_queues>;
typedef request_queue_impl_qwqr request_queue_type;
typedef stxxl::int64 DISKID;
typedef std::map<DISKID, request_queue_type *> request_queue_map;
protected:
request_queue_map queues;
disk_queues()
{
stxxl::stats::get_instance();
}
public:
void add_request(request_ptr & req, DISKID disk)
{
#ifdef STXXL_HACK_SINGLE_IO_THREAD
disk = 42;
#endif
if (queues.find(disk) == queues.end())
{
queues[disk] = new request_queue_type();
}
queues[disk]->add_request(req);
}
bool cancel_request(request_ptr & req, DISKID disk)
{
#ifdef STXXL_HACK_SINGLE_IO_THREAD
disk = 42;
#endif
if (queues.find(disk) != queues.end())
return queues[disk]->cancel_request(req);
else
return false;
}
~disk_queues()
{
for (request_queue_map::iterator i = queues.begin(); i != queues.end(); i++)
delete (*i).second;
}
void set_priority_op(request_queue::priority_op op)
{
for (request_queue_map::iterator i = queues.begin(); i != queues.end(); i++)
i->second->set_priority_op(op);
}
};
__STXXL_END_NAMESPACE
#endif