2 * Copyright (C) 1996-2016 The Squid Software Foundation and contributors
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.
9 #ifndef SQUID_FS_ROCK_IO_STATE_H
10 #define SQUID_FS_ROCK_IO_STATE_H
12 #include "fs/rock/RockSwapDir.h"
13 #include "sbuf/MemBlob.h"
24 class IoState
: public ::StoreIOState
26 MEMPROXY_CLASS(IoState
);
29 typedef RefCount
<IoState
> Pointer
;
31 IoState(Rock::SwapDir::Pointer
&aDir
, StoreEntry
*e
, StoreIOState::STFNCB
*cbFile
, StoreIOState::STIOCB
*cbIo
, void *data
);
34 void file(const RefCount
<DiskFile
> &aFile
);
37 virtual void read_(char *buf
, size_t size
, off_t offset
, STRCB
* callback
, void *callback_data
);
38 virtual bool write(char const *buf
, size_t size
, off_t offset
, FREE
* free_func
);
39 virtual void close(int how
);
41 /// whether we are still waiting for the I/O results (i.e., not closed)
42 bool stillWaiting() const { return theFile
!= NULL
; }
44 /// forwards read data to the reader that initiated this I/O
45 void callReaderBack(const char *buf
, int rlen
);
47 /// called by SwapDir::writeCompleted() after the last write and on error
48 void finishedWriting(const int errFlag
);
50 /* one and only one of these will be set and locked; access via *Anchor() */
51 const Ipc::StoreMapAnchor
*readableAnchor_
; ///< starting point for reading
52 Ipc::StoreMapAnchor
*writeableAnchor_
; ///< starting point for writing
54 /// the last db slot successfully read or written
56 /// when reading, this is the next slot we are going to read (if asked)
57 /// when writing, this is the next slot to use after the last fresh slot
58 SlotId staleSplicingPointNext
;
61 const Ipc::StoreMapAnchor
&readAnchor() const;
62 Ipc::StoreMapAnchor
&writeAnchor();
63 const Ipc::StoreMapSlice
¤tReadableSlice() const;
65 void tryWrite(char const *buf
, size_t size
, off_t offset
);
66 size_t writeToBuffer(char const *buf
, size_t size
);
67 void writeToDisk(const SlotId nextSlot
);
68 void writeBufToDisk(const SlotId nextSlot
, const bool eof
, const bool lastWrite
);
69 SlotId
reserveSlotForWriting();
71 void callBack(int errflag
);
73 Rock::SwapDir::Pointer dir
; ///< swap dir that initiated I/O
74 const size_t slotSize
; ///< db cell size
75 int64_t objOffset
; ///< object offset for current db slot
76 SlotId sidCurrent
; ///< ID of the db slot currently being read or written
78 RefCount
<DiskFile
> theFile
; // "file" responsible for this I/O
79 MemBlob theBuf
; // use for write content accumulation only
84 #endif /* SQUID_FS_ROCK_IO_STATE_H */