]>
Commit | Line | Data |
---|---|---|
d3b3ab85 | 1 | /* |
4ac4a490 | 2 | * Copyright (C) 1996-2017 The Squid Software Foundation and contributors |
d3b3ab85 | 3 | * |
bbc27441 AJ |
4 | * Squid software is distributed under GPLv2+ license and includes |
5 | * contributions from numerous individuals and organizations. | |
6 | * Please see the COPYING and CONTRIBUTORS files for details. | |
d3b3ab85 | 7 | */ |
8 | ||
9 | #ifndef SQUID_STOREIOSTATE_H | |
10 | #define SQUID_STOREIOSTATE_H | |
11 | ||
8bf217bd | 12 | #include "base/RefCount.h" |
aa839030 | 13 | #include "cbdata.h" |
effdd841 | 14 | #include "mem/forward.h" |
2745fea5 | 15 | #include "store/forward.h" |
62e76326 | 16 | |
e877aaac | 17 | class StoreIOState : public RefCountable |
62e76326 | 18 | { |
19 | ||
d3b3ab85 | 20 | public: |
e877aaac | 21 | typedef RefCount<StoreIOState> Pointer; |
d3b3ab85 | 22 | |
4fcc8876 | 23 | /* |
24 | * STRCB is the "store read callback". STRCB functions are | |
25 | * passed to storeRead(). Examples of STRCB callbacks are: | |
26 | * storeClientReadBody | |
27 | * storeClientReadHeader | |
28 | */ | |
e5de8b13 | 29 | typedef void STRCB(void *their_data, const char *buf, ssize_t len, StoreIOState::Pointer self); |
4fcc8876 | 30 | |
31 | /* | |
32 | * STFNCB is the "store file number callback." It is called | |
33 | * when an underlying storage module has allocated the swap | |
34 | * file number and also indicates that the swap file has been | |
35 | * opened for reading or writing. STFNCB functions are passed | |
36 | * to storeCreate() and storeOpen(). Examples of STFNCB callbacks | |
37 | * are: | |
38 | * storeSwapInFileNotify | |
39 | * storeSwapOutFileNotify | |
40 | */ | |
e5de8b13 | 41 | typedef void STFNCB(void *their_data, int errflag, StoreIOState::Pointer self); |
4fcc8876 | 42 | |
43 | /* | |
44 | * STIOCB is the "store close callback" for store files. It | |
45 | * is called when the store file is closed. STIOCB functions | |
46 | * are passed to storeCreate() and storeOpen(). Examples of | |
47 | * STIOCB callbacks are: | |
48 | * storeSwapOutFileClosed | |
49 | * storeSwapInFileClosed | |
50 | */ | |
e5de8b13 | 51 | typedef void STIOCB(void *their_data, int errflag, StoreIOState::Pointer self); |
4fcc8876 | 52 | |
e877aaac | 53 | /* StoreIOState does not get mempooled - it's children do */ |
d3b3ab85 | 54 | void *operator new (size_t amount); |
55 | void operator delete (void *address); | |
d3b3ab85 | 56 | |
cc8c4af2 AJ |
57 | StoreIOState(StoreIOState::STFNCB *cbFile, StoreIOState::STIOCB *cbIo, void *data); |
58 | virtual ~StoreIOState(); | |
d3b3ab85 | 59 | |
cc8c4af2 | 60 | off_t offset() const {return offset_;} |
d3b3ab85 | 61 | |
62 | virtual void read_(char *buf, size_t size, off_t offset, STRCB * callback, void *callback_data) = 0; | |
90e8b325 AR |
63 | /** write the given buffer and free it when it is no longer needed |
64 | * \param offset zero for the very first write and -1 for all other writes | |
65 | * \retval false if write failed (callback has been or will be called) | |
66 | */ | |
67 | virtual bool write(char const *buf, size_t size, off_t offset, FREE * free_func) = 0; | |
aa1a691e AR |
68 | |
69 | typedef enum { | |
9199139f AR |
70 | wroteAll, ///< success: caller supplied all data it wanted to swap out |
71 | writerGone, ///< failure: caller left before swapping out everything | |
72 | readerDone ///< success or failure: either way, stop swapping in | |
aa1a691e AR |
73 | } CloseHow; |
74 | virtual void close(int how) = 0; ///< finish or abort swapping per CloseHow | |
62e76326 | 75 | |
abf396ec AR |
76 | // Tests whether we are working with the primary/public StoreEntry chain. |
77 | // Reads start reading the primary chain, but it may become secondary. | |
78 | // There are two store write kinds: | |
79 | // * regular writes that change (usually append) the entry visible to all and | |
80 | // * header updates that create a fresh chain (while keeping the stale one usable). | |
81 | bool touchingStoreEntry() const; | |
82 | ||
d3b3ab85 | 83 | sdirno swap_dirn; |
84 | sfileno swap_filen; | |
f53969cc | 85 | StoreEntry *e; /* Need this so the FS layers can play god */ |
d3b3ab85 | 86 | mode_t mode; |
aa1a691e | 87 | off_t offset_; ///< number of bytes written or read for this entry so far |
abf396ec | 88 | STFNCB *file_callback; // XXX: Unused. TODO: Remove. |
d3b3ab85 | 89 | STIOCB *callback; |
90 | void *callback_data; | |
62e76326 | 91 | |
26ac0430 | 92 | struct { |
62e76326 | 93 | STRCB *callback; |
94 | void *callback_data; | |
2fadd50d | 95 | } read; |
62e76326 | 96 | |
26ac0430 | 97 | struct { |
f53969cc | 98 | bool closing; /* debugging aid */ |
2fadd50d | 99 | } flags; |
d3b3ab85 | 100 | }; |
101 | ||
4fcc8876 | 102 | StoreIOState::Pointer storeCreate(StoreEntry *, StoreIOState::STFNCB *, StoreIOState::STIOCB *, void *); |
103 | StoreIOState::Pointer storeOpen(StoreEntry *, StoreIOState::STFNCB *, StoreIOState::STIOCB *, void *); | |
d9c252f2 FC |
104 | void storeClose(StoreIOState::Pointer, int how); |
105 | void storeRead(StoreIOState::Pointer, char *, size_t, off_t, StoreIOState::STRCB *, void *); | |
106 | void storeIOWrite(StoreIOState::Pointer, char const *, size_t, off_t, FREE *); | |
d3b3ab85 | 107 | |
108 | #endif /* SQUID_STOREIOSTATE_H */ | |
f53969cc | 109 |