0ad/source/lib/sysdep/os/win/wiocp.cpp
janwas 4663ac0fe7 split debug_assert into ENSURE and ASSERT as discussed in a previous meeting.
the old debug_assert always ran and tested the expression, which slows
down release builds. wrapping them in #ifndef NDEBUG is clumsy. the new
ASSERT behaves like assert and ENSURE like the old debug_assert. Let's
change any time-critical but not-super-important ENSURE to ASSERT to
speed up release builds. (already done in bits.h and unique_range.h)

This was SVN commit r9362.
2011-04-30 13:01:45 +00:00

32 lines
1,021 B
C++

#include "precompiled.h"
#include "lib/sysdep/os/win/wiocp.h"
#include "lib/file/file.h" // ERR::IO
#include "lib/sysdep/os/win/wutil.h"
void AttachToCompletionPort(HANDLE hFile, HANDLE& hIOCP, ULONG_PTR key, DWORD numConcurrentThreads)
{
WinScopedPreserveLastError s; // CreateIoCompletionPort
// (when called for the first time, ends up creating hIOCP)
hIOCP = CreateIoCompletionPort(hFile, hIOCP, key, numConcurrentThreads);
ENSURE(wutil_IsValidHandle(hIOCP));
}
LibError PollCompletionPort(HANDLE hIOCP, DWORD timeout, DWORD& bytesTransferred, ULONG_PTR& key, OVERLAPPED*& ovl)
{
if(hIOCP == 0)
return ERR::INVALID_HANDLE; // NOWARN (happens if called before the first Attach)
bytesTransferred = 0;
key = 0;
ovl = 0;
if(GetQueuedCompletionStatus(hIOCP, &bytesTransferred, &key, &ovl, timeout))
return INFO::OK;
if(GetLastError() == WAIT_TIMEOUT)
return ERR::AGAIN; // NOWARN (nothing pending)
else
return ERR::FAIL; // NOWARN (let caller decide what to do)
}