Stxxl  1.3.2
disk_queues.h
1 /***************************************************************************
2  * include/stxxl/bits/io/disk_queues.h
3  *
4  * Part of the STXXL. See http://stxxl.sourceforge.net
5  *
6  * Copyright (C) 2002 Roman Dementiev <[email protected]>
7  * Copyright (C) 2008-2010 Andreas Beckmann <[email protected]>
8  * Copyright (C) 2009 Johannes Singler <[email protected]>
9  *
10  * Distributed under the Boost Software License, Version 1.0.
11  * (See accompanying file LICENSE_1_0.txt or copy at
12  * http://www.boost.org/LICENSE_1_0.txt)
13  **************************************************************************/
14 
15 #ifndef STXXL_IO_DISK_QUEUES_HEADER
16 #define STXXL_IO_DISK_QUEUES_HEADER
17 
18 #include <map>
19 
20 #include <stxxl/bits/namespace.h>
21 #include <stxxl/bits/singleton.h>
22 #include <stxxl/bits/io/iostats.h>
23 #include <stxxl/bits/io/request_queue_impl_qwqr.h>
24 
25 
26 __STXXL_BEGIN_NAMESPACE
27 
30 
31 class request_ptr;
32 
35 class disk_queues : public singleton<disk_queues>
36 {
37  friend class singleton<disk_queues>;
38 
39  // 2 queues: write queue and read queue
40  typedef request_queue_impl_qwqr request_queue_type;
41 
42  typedef stxxl::int64 DISKID;
43  typedef std::map<DISKID, request_queue_type *> request_queue_map;
44 
45 protected:
46  request_queue_map queues;
47  disk_queues()
48  {
49  stxxl::stats::get_instance(); // initialize stats before ourselves
50  }
51 
52 public:
53  void add_request(request_ptr & req, DISKID disk)
54  {
55 #ifdef STXXL_HACK_SINGLE_IO_THREAD
56  disk = 42;
57 #endif
58  if (queues.find(disk) == queues.end())
59  {
60  // create new request queue
61  queues[disk] = new request_queue_type();
62  }
63  queues[disk]->add_request(req);
64  }
65 
74  bool cancel_request(request_ptr & req, DISKID disk)
75  {
76 #ifdef STXXL_HACK_SINGLE_IO_THREAD
77  disk = 42;
78 #endif
79  if (queues.find(disk) != queues.end())
80  return queues[disk]->cancel_request(req);
81  else
82  return false;
83  }
84 
85  ~disk_queues()
86  {
87  // deallocate all queues
88  for (request_queue_map::iterator i = queues.begin(); i != queues.end(); i++)
89  delete (*i).second;
90  }
91 
97  void set_priority_op(request_queue::priority_op op)
98  {
99  for (request_queue_map::iterator i = queues.begin(); i != queues.end(); i++)
100  i->second->set_priority_op(op);
101  }
102 };
103 
105 
106 __STXXL_END_NAMESPACE
107 
108 #endif // !STXXL_IO_DISK_QUEUES_HEADER
109 // vim: et:ts=4:sw=4
void set_priority_op(request_queue::priority_op op)
Changes requests priorities.
Definition: disk_queues.h:97
bool cancel_request(request_ptr &req, DISKID disk)
Cancel a request The specified request is canceled unless already being processed. However, cancelation cannot be guaranteed. Cancelled requests must still be waited for in order to ensure correct operation.
Definition: disk_queues.h:74
Implemented as reference counting smart pointer.
Definition: request_ptr.h:34
Encapsulates disk queues.
Definition: disk_queues.h:35