Beispiel #1
0
int IOCP_Remove(IOCP* iocp, IOCP_KEY key)
{
	IOCP_CONTEXT* context = (IOCP_CONTEXT*)(key);
	int isBusy = FALSE;

	if( !iocp->inited ) {
		return IOCP_UNINITIALIZED;
	}
	if(context->lockPtr) {
		Lock_Write(context->lockPtr);
	}
	if( context->readOlp.oppType != IOCP_NONE || context->writeOlp.oppType != IOCP_NONE )
	{
		isBusy = TRUE;
	}
	else
	{
		context->status |= IOCP_REMOVE;
	}
	if(context->lockPtr) {
		Lock_Unlock(context->lockPtr);
	}

	if(isBusy)
	{
		return IOCP_BUSY;
	}
	if(context->readOlp.timer != NULL)
	{
		TimerQueue_DeleteTimer(&iocp->timerQueue, context->readOlp.timer, TRUE);
		context->readOlp.timer = NULL;
	}
	if(context->writeOlp.timer != NULL)
	{
		TimerQueue_DeleteTimer(&iocp->timerQueue, context->writeOlp.timer, TRUE);
		context->writeOlp.timer = NULL;
	}

	if(!(context->status & IOCP_HANDLE_CLOSED))
	{
		//iocp->closeHandle(iocp, context);
		IOCP_CloseHandle(iocp, context);
		context->status |= IOCP_HANDLE_CLOSED;
	}
	EnterCriticalSection(&iocp->cs);
	Map_Remove(iocp->contextMap, context->handle);
	if(context->lockPtr)
	{
		LockPool_Recycle(context->lockPtr);
		context->lockPtr = NULL;
	}
	LeaveCriticalSection(&iocp->cs);
	//iocp->freeContext(iocp, context);
	IOCP_FreeContext(iocp , context);
	return IOCP_SUCESS;
}
static AwaError ClientSubscription_Free(AwaClientSubscription ** subscription)
{
    AwaError result = AwaError_SubscriptionInvalid;

    if ((subscription != NULL) && (*subscription != NULL))
    {
        List_ForEach((*subscription)->Operations, RemoveSubscriptionFromOperation, *subscription);
        List_Free(&(*subscription)->Operations);

        if ((*subscription)->Session != NULL)
        {
            Map_Remove(ClientSession_GetSubscribers((*subscription)->Session), (*subscription)->Path);
        }

        free((void *)(*subscription)->Path);
        Awa_MemSafeFree(*subscription);
        *subscription = NULL;

        result = AwaError_Success;
    }
    return result;
}
void RemoveSubscriptionFromOperation(size_t index, void * value, void * context)
{
    AwaClientSubscribeOperation * operation = (AwaClientSubscribeOperation *)value;
    AwaClientSubscription * subscription = (AwaClientSubscription *)context;
    Map_Remove(operation->Subscribers, subscription->Path);
}