00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015 #ifndef STXXL_IO_DISK_QUEUES_HEADER
00016 #define STXXL_IO_DISK_QUEUES_HEADER
00017
00018 #include <map>
00019
00020 #include <stxxl/bits/namespace.h>
00021 #include <stxxl/bits/singleton.h>
00022 #include <stxxl/bits/io/iostats.h>
00023 #include <stxxl/bits/io/request_queue_impl_qwqr.h>
00024
00025
00026 __STXXL_BEGIN_NAMESPACE
00027
00030
00031 class request_ptr;
00032
00035 class disk_queues : public singleton<disk_queues>
00036 {
00037 friend class singleton<disk_queues>;
00038
00039
00040 typedef request_queue_impl_qwqr request_queue_type;
00041
00042 typedef stxxl::int64 DISKID;
00043 typedef std::map<DISKID, request_queue_type *> request_queue_map;
00044
00045 protected:
00046 request_queue_map queues;
00047 disk_queues()
00048 {
00049 stxxl::stats::get_instance();
00050 }
00051
00052 public:
00053 void add_request(request_ptr & req, DISKID disk)
00054 {
00055 #ifdef STXXL_HACK_SINGLE_IO_THREAD
00056 disk = 42;
00057 #endif
00058 if (queues.find(disk) == queues.end())
00059 {
00060
00061 queues[disk] = new request_queue_type();
00062 }
00063 queues[disk]->add_request(req);
00064 }
00065
00074 bool cancel_request(request_ptr & req, DISKID disk)
00075 {
00076 #ifdef STXXL_HACK_SINGLE_IO_THREAD
00077 disk = 42;
00078 #endif
00079 if (queues.find(disk) != queues.end())
00080 return queues[disk]->cancel_request(req);
00081 else
00082 return false;
00083 }
00084
00085 ~disk_queues()
00086 {
00087
00088 for (request_queue_map::iterator i = queues.begin(); i != queues.end(); i++)
00089 delete (*i).second;
00090 }
00091
00097 void set_priority_op(request_queue::priority_op op)
00098 {
00099 for (request_queue_map::iterator i = queues.begin(); i != queues.end(); i++)
00100 i->second->set_priority_op(op);
00101 }
00102 };
00103
00105
00106 __STXXL_END_NAMESPACE
00107
00108 #endif // !STXXL_IO_DISK_QUEUES_HEADER
00109