//---------------------------------------------------------------------
//  Copyright (C)1998 Microsoft Corporation, All Rights Reserved.
//
//  iostatus.cpp
//
//  Author:
//
//    Edward Reus (edwardr)     02-28-98   Initial coding.
//
//---------------------------------------------------------------------

#include "precomp.h"

//---------------------------------------------------------------------
// CIOSTATUS::CIOSTATUS()
//
//---------------------------------------------------------------------
CIOSTATUS::CIOSTATUS()
    {
    m_dwMainThreadId = 0;
    m_hIoCompletionPort = INVALID_HANDLE_VALUE;
    m_lNumThreads = 0;
    m_lNumPendingThreads = 0;
    m_phRpcBinding = 0;
    }

//---------------------------------------------------------------------
// CIOSTATUS::~CIOSTATUS()
//
//---------------------------------------------------------------------
CIOSTATUS::~CIOSTATUS()
    {
    CloseHandle(m_hIoCompletionPort);
    }

//------------------------------------------------------------------------
//  CIOSTATUS::operator new()
//
//------------------------------------------------------------------------
void *CIOSTATUS::operator new( IN size_t Size )
    {
    void *pObj = AllocateMemory(Size);

    return pObj;
    }

//------------------------------------------------------------------------
//  CIOSTATUS::operator delete()
//
//------------------------------------------------------------------------
void CIOSTATUS::operator delete( IN void *pObj,
                                 IN size_t Size )
    {
    if (pObj)
        {
        DWORD dwStatus = FreeMemory(pObj);

        #ifdef DBG_MEM
        if (dwStatus)
            {
            DbgPrint("IrXfer: IrTran-P: CIOSTATUS::delete Failed: %d\n",
                     dwStatus );
            }
        #endif
        }
    }

//---------------------------------------------------------------------
// CIOSTATUS::Initialize();
//
//---------------------------------------------------------------------
DWORD CIOSTATUS::Initialize()
    {
    DWORD  dwStatus = NO_ERROR;

    m_dwMainThreadId = GetCurrentThreadId();

    // Create an IO completion port to use in our asynchronous IO.
    m_hIoCompletionPort = CreateIoCompletionPort( INVALID_HANDLE_VALUE,
                                                  0,
                                                  0,
                                                  0 );
    if (!m_hIoCompletionPort)
        {
        dwStatus = GetLastError();
        #ifdef DBG_ERROR
        DbgPrint("CreateIoCompletionPort(): Failed: %d\n",dwStatus);
        #endif
        return dwStatus;
        }

    return dwStatus;
    }