simple_entry_operation.h revision bb1529ce867d8845a77ec7cdf3e3003ef1771a40
1bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch// Copyright 2013 The Chromium Authors. All rights reserved.
2bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch// Use of this source code is governed by a BSD-style license that can be
3bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch// found in the LICENSE file.
4bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch
5bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch#ifndef NET_DISK_CACHE_SIMPLE_SIMPLE_ENTRY_OPERATION_H_
6bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch#define NET_DISK_CACHE_SIMPLE_SIMPLE_ENTRY_OPERATION_H_
7bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch
8bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch#include "base/memory/ref_counted.h"
9bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch#include "net/base/completion_callback.h"
10bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch#include "net/base/net_log.h"
11bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch
12bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdochnamespace net {
13bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdochclass IOBuffer;
14bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch}
15bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch
16bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdochnamespace disk_cache {
17bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch
18bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdochclass Entry;
19bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdochclass SimpleEntryImpl;
20bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch
21bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch// SimpleEntryOperation stores the information regarding operations in
22bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch// SimpleEntryImpl, between the moment they are issued by users of the backend,
23bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch// and the moment when they are executed.
24bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdochclass SimpleEntryOperation {
25bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch public:
26bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch  typedef net::CompletionCallback CompletionCallback;
27bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch
28bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch  enum EntryOperationType {
29bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch    TYPE_OPEN = 0,
30bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch    TYPE_CREATE = 1,
31bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch    TYPE_CLOSE = 2,
32bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch    TYPE_READ = 3,
33bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch    TYPE_WRITE = 4,
34bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch  };
35bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch
36bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch  SimpleEntryOperation(const SimpleEntryOperation& other);
37bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch  ~SimpleEntryOperation();
38bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch
39bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch  static SimpleEntryOperation OpenOperation(SimpleEntryImpl* entry,
40bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch                                            bool have_index,
41bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch                                            const CompletionCallback& callback,
42bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch                                            Entry** out_entry);
43bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch  static SimpleEntryOperation CreateOperation(
44bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch      SimpleEntryImpl* entry,
45bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch      bool have_index,
46bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch      const CompletionCallback& callback,
47bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch      Entry** out_entry);
48bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch  static SimpleEntryOperation CloseOperation(SimpleEntryImpl* entry);
49bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch  static SimpleEntryOperation ReadOperation(SimpleEntryImpl* entry,
50bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch                                            int index,
51bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch                                            int offset,
52bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch                                            int length,
53bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch                                            net::IOBuffer* buf,
54bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch                                            const CompletionCallback& callback,
55bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch                                            bool alone_in_queue);
56bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch  static SimpleEntryOperation WriteOperation(
57bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch      SimpleEntryImpl* entry,
58bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch      int index,
59bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch      int offset,
60bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch      int length,
61bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch      net::IOBuffer* buf,
62bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch      bool truncate,
63bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch      bool optimistic,
64bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch      const CompletionCallback& callback);
65bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch
66bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch  bool ConflictsWith(const SimpleEntryOperation& other_op) const;
67bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch  // Releases all references. After calling this operation, SimpleEntryOperation
68bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch  // will only hold POD members.
69bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch  void ReleaseReferences();
70bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch
71bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch  EntryOperationType type() const {
72bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch    return static_cast<EntryOperationType>(type_);
73bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch  }
74bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch  const CompletionCallback& callback() const { return callback_; }
75bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch  Entry** out_entry() { return out_entry_; }
76bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch  bool have_index() const { return have_index_; }
77bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch  int index() const { return index_; }
78bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch  int offset() const { return offset_; }
79bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch  int length() const { return length_; }
80bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch  net::IOBuffer* buf() { return buf_.get(); }
81bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch  bool truncate() const { return truncate_; }
82bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch  bool optimistic() const { return optimistic_; }
83bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch  bool alone_in_queue() const { return alone_in_queue_; }
84bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch
85bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch private:
86bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch  SimpleEntryOperation(SimpleEntryImpl* entry,
87bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch                       net::IOBuffer* buf,
88bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch                       const CompletionCallback& callback,
89bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch                       Entry** out_entry,
90bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch                       int offset,
91bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch                       int length,
92bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch                       EntryOperationType type,
93bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch                       bool have_index,
94bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch                       int index,
95bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch                       bool truncate,
96bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch                       bool optimistic,
97bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch                       bool alone_in_queue);
98bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch
99bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch  // This ensures entry will not be deleted until the operation has ran.
100bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch  scoped_refptr<SimpleEntryImpl> entry_;
101bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch  scoped_refptr<net::IOBuffer> buf_;
102bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch  CompletionCallback callback_;
103bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch
104bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch  // Used in open and create operations.
105bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch  Entry** out_entry_;
106bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch
107bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch  // Used in write and read operations.
108bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch  const int offset_;
109bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch  const int length_;
110bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch
111bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch  const unsigned int type_ : 3;           /* 3 */
112bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch  // Used in open and create operations.
113bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch  const unsigned int have_index_ : 1;     /* 4 */
114bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch  // Used in write and read operations.
115bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch  const unsigned int index_ : 2;          /* 6 */
116bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch  // Used only in write operations.
117bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch  const unsigned int truncate_ : 1;       /* 7 */
118bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch  const unsigned int optimistic_ : 1;     /* 8 */
119bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch  // Used only in SimpleCache.ReadIsParallelizable histogram.
120bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch  const unsigned int alone_in_queue_ : 1; /* 9 */
121bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch};
122bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch
123bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch}  // namespace disk_cache
124bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch
125bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch#endif  // NET_DISK_CACHE_SIMPLE_SIMPLE_ENTRY_OPERATION_H_
126