| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #ifndef NET_DISK_CACHE_BLOCKFILE_IN_FLIGHT_IO_H_ | 5 #ifndef NET_DISK_CACHE_BLOCKFILE_IN_FLIGHT_IO_H_ |
| 6 #define NET_DISK_CACHE_BLOCKFILE_IN_FLIGHT_IO_H_ | 6 #define NET_DISK_CACHE_BLOCKFILE_IN_FLIGHT_IO_H_ |
| 7 | 7 |
| 8 #include <set> | 8 #include <set> |
| 9 | 9 |
| 10 #include "base/message_loop/message_loop_proxy.h" | 10 #include "base/message_loop/message_loop_proxy.h" |
| (...skipping 23 matching lines...) Expand all Loading... |
| 34 // Allows the cancellation of the task to notify the controller (step number 8 | 34 // Allows the cancellation of the task to notify the controller (step number 8 |
| 35 // in the diagram below). In practice, if the controller waits for the | 35 // in the diagram below). In practice, if the controller waits for the |
| 36 // operation to finish it doesn't have to wait for the final task to be | 36 // operation to finish it doesn't have to wait for the final task to be |
| 37 // processed by the message loop so calling this method prevents its delivery. | 37 // processed by the message loop so calling this method prevents its delivery. |
| 38 // Note that this method is not intended to cancel the actual IO operation or | 38 // Note that this method is not intended to cancel the actual IO operation or |
| 39 // to prevent the first notification to take place (OnIOComplete). | 39 // to prevent the first notification to take place (OnIOComplete). |
| 40 void Cancel(); | 40 void Cancel(); |
| 41 | 41 |
| 42 int result() { return result_; } | 42 int result() { return result_; } |
| 43 | 43 |
| 44 base::WaitableEvent* io_completed() { | 44 base::WaitableEvent* io_completed() { return &io_completed_; } |
| 45 return &io_completed_; | |
| 46 } | |
| 47 | 45 |
| 48 protected: | 46 protected: |
| 49 virtual ~BackgroundIO(); | 47 virtual ~BackgroundIO(); |
| 50 | 48 |
| 51 // Notifies the controller about the end of the operation, from the background | 49 // Notifies the controller about the end of the operation, from the background |
| 52 // thread. | 50 // thread. |
| 53 void NotifyController(); | 51 void NotifyController(); |
| 54 | 52 |
| 55 int result_; // Final operation result. | 53 int result_; // Final operation result. |
| 56 | 54 |
| 57 private: | 55 private: |
| 58 friend class base::RefCountedThreadSafe<BackgroundIO>; | 56 friend class base::RefCountedThreadSafe<BackgroundIO>; |
| 59 | 57 |
| 60 // An event to signal when the operation completes. | 58 // An event to signal when the operation completes. |
| 61 base::WaitableEvent io_completed_; | 59 base::WaitableEvent io_completed_; |
| 62 InFlightIO* controller_; // The controller that tracks all operations. | 60 InFlightIO* controller_; // The controller that tracks all operations. |
| 63 base::Lock controller_lock_; // A lock protecting clearing of controller_. | 61 base::Lock controller_lock_; // A lock protecting clearing of controller_. |
| 64 | 62 |
| 65 DISALLOW_COPY_AND_ASSIGN(BackgroundIO); | 63 DISALLOW_COPY_AND_ASSIGN(BackgroundIO); |
| 66 }; | 64 }; |
| 67 | 65 |
| 68 // This class keeps track of asynchronous IO operations. A single instance | 66 // This class keeps track of asynchronous IO operations. A single instance |
| 69 // of this class is meant to be used to start an asynchronous operation (using | 67 // of this class is meant to be used to start an asynchronous operation (using |
| 70 // PostXX, exposed by a derived class). This class will post the operation to a | 68 // PostXX, exposed by a derived class). This class will post the operation to a |
| 71 // worker thread, hanlde the notification when the operation finishes and | 69 // worker thread, hanlde the notification when the operation finishes and |
| 72 // perform the callback on the same thread that was used to start the operation. | 70 // perform the callback on the same thread that was used to start the operation. |
| (...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 118 // be executed on a background thread. This method must be called on the same | 116 // be executed on a background thread. This method must be called on the same |
| 119 // thread used to create this object. | 117 // thread used to create this object. |
| 120 void OnOperationPosted(BackgroundIO* operation); | 118 void OnOperationPosted(BackgroundIO* operation); |
| 121 | 119 |
| 122 private: | 120 private: |
| 123 typedef std::set<scoped_refptr<BackgroundIO> > IOList; | 121 typedef std::set<scoped_refptr<BackgroundIO> > IOList; |
| 124 | 122 |
| 125 IOList io_list_; // List of pending, in-flight io operations. | 123 IOList io_list_; // List of pending, in-flight io operations. |
| 126 scoped_refptr<base::MessageLoopProxy> callback_thread_; | 124 scoped_refptr<base::MessageLoopProxy> callback_thread_; |
| 127 | 125 |
| 128 bool running_; // True after the first posted operation completes. | 126 bool running_; // True after the first posted operation completes. |
| 129 bool single_thread_; // True if we only have one thread. | 127 bool single_thread_; // True if we only have one thread. |
| 130 | 128 |
| 131 DISALLOW_COPY_AND_ASSIGN(InFlightIO); | 129 DISALLOW_COPY_AND_ASSIGN(InFlightIO); |
| 132 }; | 130 }; |
| 133 | 131 |
| 134 } // namespace disk_cache | 132 } // namespace disk_cache |
| 135 | 133 |
| 136 #endif // NET_DISK_CACHE_BLOCKFILE_IN_FLIGHT_IO_H_ | 134 #endif // NET_DISK_CACHE_BLOCKFILE_IN_FLIGHT_IO_H_ |
| OLD | NEW |