• Main Page
  • Related Pages
  • Modules
  • Namespaces
  • Classes
  • Files
  • Examples
  • File List

disk_queues.h

00001 /***************************************************************************
00002  *  include/stxxl/bits/io/disk_queues.h
00003  *
00004  *  Part of the STXXL. See http://stxxl.sourceforge.net
00005  *
00006  *  Copyright (C) 2002 Roman Dementiev <[email protected]>
00007  *  Copyright (C) 2008 Andreas Beckmann <[email protected]>
00008  *
00009  *  Distributed under the Boost Software License, Version 1.0.
00010  *  (See accompanying file LICENSE_1_0.txt or copy at
00011  *  http://www.boost.org/LICENSE_1_0.txt)
00012  **************************************************************************/
00013 
00014 #ifndef STXXL_IO_DISK_QUEUES_HEADER
00015 #define STXXL_IO_DISK_QUEUES_HEADER
00016 
00017 #include <map>
00018 
00019 #include <stxxl/bits/namespace.h>
00020 #include <stxxl/bits/singleton.h>
00021 #include <stxxl/bits/io/iostats.h>
00022 #include <stxxl/bits/io/request_queue_impl_qwqr.h>
00023 
00024 
00025 __STXXL_BEGIN_NAMESPACE
00026 
00029 
00030 class request_ptr;
00031 
00034 class disk_queues : public singleton<disk_queues>
00035 {
00036     friend class singleton<disk_queues>;
00037 
00038     // 2 queues: write queue and read queue
00039     typedef request_queue_impl_qwqr request_queue_type;
00040 
00041     typedef stxxl::int64 DISKID;
00042     typedef std::map<DISKID, request_queue_type *> request_queue_map;
00043 
00044 protected:
00045     request_queue_map queues;
00046     disk_queues()
00047     {
00048         stxxl::stats::get_instance(); // initialize stats before ourselves
00049     }
00050 
00051 public:
00052     void add_request(request_ptr & req, DISKID disk)
00053     {
00054         if (queues.find(disk) == queues.end())
00055         {
00056             // create new request queue
00057             queues[disk] = new request_queue_type();
00058         }
00059         queues[disk]->add_request(req);
00060     }
00061 
00070     bool cancel_request(request_ptr & req, DISKID disk)
00071     {
00072         if (queues.find(disk) != queues.end())
00073             return queues[disk]->cancel_request(req);
00074         else
00075             return false;
00076     }
00077 
00078     ~disk_queues()
00079     {
00080         // deallocate all queues
00081         for (request_queue_map::iterator i = queues.begin(); i != queues.end(); i++)
00082             delete (*i).second;
00083     }
00084 
00090     void set_priority_op(disk_queue::priority_op op)
00091     {
00092         for (request_queue_map::iterator i = queues.begin(); i != queues.end(); i++)
00093             i->second->set_priority_op(op);
00094     }
00095 };
00096 
00098 
00099 __STXXL_END_NAMESPACE
00100 
00101 #endif // !STXXL_IO_DISK_QUEUES_HEADER
00102 // vim: et:ts=4:sw=4

Generated by  doxygen 1.7.1