146 #define IO_OVERLAPPED io::Parameters(io::Parameters::OverlappedTag())
191 const bool temporaryBuffersRequested = (op.
buf == 0);
192 if(temporaryBuffersRequested)
201 if(temporaryBuffersRequested)
226 #ifndef ENABLE_IO_STATS
227 #define ENABLE_IO_STATS 0
232 template<
class CompletedHook,
class IssueHook>
246 for(
off_t blocksIssued = 0, blocksCompleted = 0; blocksCompleted < numBlocks; blocksCompleted++)
248 for(; blocksIssued != numBlocks && blocksIssued < blocksCompleted + (
off_t)p.queueDepth; blocksIssued++)
250 aiocb& cb = controlBlockRingBuffer[blocksIssued];
253 cb.
aio_buf = (
volatile void*)(uintptr_t(op.
buf) + blocksIssued * p.blockSize);
254 if(blocksIssued == numBlocks-1)
262 aiocb& cb = controlBlockRingBuffer[blocksCompleted];
271 const off_t totalSize = p.blockSize? numBlocks*p.blockSize : op.
size;
272 debug_printf(L
"IO: %.2f MB/s (%.2f)\n", totalSize/(t1-t0)/1e6, (t1-t0)*1e3);
279 template<
class CompletedHook>
297 template<
class CompletedHook,
class IssueHook>
298 static inline Status Store(
const OsPath& pathname,
const void* data,
size_t size,
const Parameters& p =
Parameters(),
const CompletedHook& completedHook = CompletedHook(),
const IssueHook& issueHook = IssueHook())
301 int oflag = O_WRONLY;
302 if(p.queueDepth != 1)
320 template<
class CompletedHook>
336 template<
class CompletedHook,
class IssueHook>
337 static inline Status Load(
const OsPath& pathname,
void* buf,
size_t size,
const Parameters& p =
Parameters(),
const CompletedHook& completedHook = CompletedHook(),
const IssueHook& issueHook = IssueHook())
340 int oflag = O_RDONLY;
341 if(p.queueDepth != 1)
345 return io::Run(op, p, completedHook, issueHook);
348 template<
class CompletedHook>
361 #endif // #ifndef INCLUDED_IO
#define RETURN_STATUS_FROM_CALLBACK(expression)
#define RVALUE(lvalue)
convert anything (lvalue or rvalue) to an rvalue
ControlBlockRingBuffer(const Operation &op, const Parameters &p)
static const size_t pageSize
#define UNUSED(param)
mark a function parameter as unused and avoid the corresponding compiler warning. ...
Status operator()(const u8 *block, size_t blockSize) const
called after a block I/O has completed.
#define COMPILER_FENCE
prevent the compiler from reordering loads or stores across this point.
Status waio_Preallocate(int fd, off_t size)
T DivideRoundUp(T dividend, T divisor)
static ICounter * counter
static const uintptr_t maxSectorSize
static Status Store(const OsPath &pathname, const void *data, size_t size, const Parameters &p=Parameters(), const CompletedHook &completedHook=CompletedHook(), const IssueHook &issueHook=IssueHook())
T round_up(T n, T multiple)
round number up/down to the next given multiple.
Status WaitUntilComplete(aiocb &cb, size_t queueDepth)
LIB_API int wtruncate(const OsPath &pathname, off_t length)
bool IsAligned(T t, uintptr_t multiple)
#define ENSURE(expr)
ensure the expression <expr> evaluates to non-zero.
Status Issue(aiocb &cb, size_t queueDepth)
INLINE aiocb & operator[](size_t counter)
static Status Load(const OsPath &pathname, void *buf, size_t size, const Parameters &p=Parameters(), const CompletedHook &completedHook=CompletedHook(), const IssueHook &issueHook=IssueHook())
static UniqueRange Allocate(size_t size, size_t alignment=maxSectorSize)
i64 Status
Error handling system.
Status Open(const OsPath &pathname, int oflag)
aiocb controlBlocks[Parameters::maxQueueDepth]
Parameters(OverlappedTag)
static Status AllocateAligned(shared_ptr< T > &p, size_t size, size_t alignment=cacheLineSize)
Parameters(size_t blockSize, size_t queueDepth, off_t alignment=maxSectorSize)
Operation(const File &file, void *buf, off_t size, off_t offset=0)
Status operator()(aiocb &cb) const
called before a block I/O is issued.
static const size_t maxQueueDepth
void Validate(const Operation &op) const
void debug_printf(const wchar_t *fmt,...)
write a formatted string to the debug channel, subject to filtering (see below).
#define RETURN_STATUS_IF_ERR(expression)
static Status Run(const Operation &op, const Parameters &p=Parameters(), const CompletedHook &completedHook=CompletedHook(), const IssueHook &issueHook=IssueHook())