libcruft-util/win32/handle.cpp
Danny Robson 058a86ba05 win32/handle: take ownership of any supplied fd
CloseHandle, close, and memory mapping interact poorly so it's a little safer
to dup the fd before taking ownership of it.
2018-08-22 21:34:02 +10:00

83 lines
1.7 KiB
C++

#include "handle.hpp"
#include "except.hpp"
using cruft::win32::handle;
///////////////////////////////////////////////////////////////////////////////
handle::handle ():
m_native (INVALID_HANDLE_VALUE)
{ ; }
//-----------------------------------------------------------------------------
handle::handle (HANDLE &&h):
m_native (h)
{ ; }
//-----------------------------------------------------------------------------
handle::handle (handle &&rhs):
m_native (rhs.m_native)
{
rhs.m_native = nullptr;
}
//-----------------------------------------------------------------------------
handle::handle (posix::fd &&rhs):
m_native (reinterpret_cast<HANDLE> (_get_osfhandle (rhs.release ())))
{
win32::error::try_value (m_native);
}
//-----------------------------------------------------------------------------
handle::~handle ()
{
if (m_native != INVALID_HANDLE_VALUE)
CloseHandle (m_native);
}
///////////////////////////////////////////////////////////////////////////////
handle::operator HANDLE& (void) &
{
return native ();
}
//-----------------------------------------------------------------------------
HANDLE&
handle::native (void) &
{
return m_native;
}
//-----------------------------------------------------------------------------
const HANDLE&
handle::native (void) const &
{
return m_native;
}
///////////////////////////////////////////////////////////////////////////////
void
handle::reset (HANDLE rhs)
{
if (m_native != INVALID_HANDLE_VALUE)
CloseHandle (m_native);
m_native = rhs;
}
///////////////////////////////////////////////////////////////////////////////
handle
handle::current_process (void)
{
return handle (GetCurrentProcess ());
}