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); }