//-------------------------------------------------------------------------------------------------- LE_SHARED le_result_t le_comm_Delete (void* handle) { HandleRecord_t* connectionRecordPtr = (HandleRecord_t*) handle; LE_INFO("Deleting AF_INET socket, fd %d .........", connectionRecordPtr->fd); if (FdMonitorRef != NULL) { // Delete FD monitor le_fdMonitor_Delete(FdMonitorRef); FdMonitorRef = NULL; } // Remove the Handle record le_hashmap_Remove(HandleRecordByFileDescriptor, (void*)(intptr_t) connectionRecordPtr->fd); // Shut-down the open socket shutdown(connectionRecordPtr->fd, SHUT_RDWR); // Close Socket Handle close(connectionRecordPtr->fd); connectionRecordPtr->fd = -1; // Free the Handle Record memory le_mem_Release(connectionRecordPtr); connectionRecordPtr = NULL; // Reset the Network IP Address and TCP Port memset(NetworkSocketIpAddress, 0, sizeof(NetworkSocketIpAddress)); NetworkSocketTCPListeningPort = 0; return LE_OK; }
//-------------------------------------------------------------------------------------------------- static void ServiceDestructor ( void* objPtr ) //-------------------------------------------------------------------------------------------------- { Service_t* servicePtr = objPtr; le_hashmap_Remove(ServiceMapRef, &servicePtr->id); }
//-------------------------------------------------------------------------------------------------- static void OnClientDisconnect ( le_msg_SessionRef_t sessionRef, void *contextPtr ) { Client_t *c; WakeupSource_t *ws; le_hashmap_It_Ref_t iter; // Find and remove client record from table c = to_Client_t(le_hashmap_Remove(PowerManager.clients, sessionRef)); LE_INFO("Client pid %d disconnected.", c->pid); // Find and remove all wakeup sources held for this client iter = le_hashmap_GetIterator(PowerManager.locks); while (LE_OK == le_hashmap_NextNode(iter)) { ws = (WakeupSource_t*)le_hashmap_GetValue(iter); if (ws->pid != c->pid) // Does not belong to this client, skip continue; // Release wakeup source if taken if (ws->taken) { LE_WARN("Releasing wakeup source '%s' on behalf of pid %d.", ws->name, ws->pid); le_pm_Relax((le_pm_WakeupSourceRef_t)ws->wsref); } // Delete wakeup source record, free memory LE_INFO("Deleting wakeup source '%s' on behalf of pid %d.", ws->name, ws->pid); le_hashmap_Remove(PowerManager.locks, ws->name); le_ref_DeleteRef(PowerManager.refs, ws->wsref); le_mem_Release(ws); } // Free client record le_mem_Release(c); return; }
//-------------------------------------------------------------------------------------------------- static void UserDestructor ( void* objectPtr ///< [IN] The memory object to destroy. ) //-------------------------------------------------------------------------------------------------- { tu_UserRef_t userRef = (tu_UserRef_t)objectPtr; le_hashmap_Remove(UserCollectionRef, &userRef->userId); memset(userRef, 0, sizeof(User_t)); }
//-------------------------------------------------------------------------------------------------- LE_SHARED le_result_t le_comm_Disconnect (void* handle) { HandleRecord_t* connectionRecordPtr = (HandleRecord_t*) handle; if (FdMonitorRef != NULL) { // Disable FD Monitoring le_fdMonitor_Disable(FdMonitorRef, PollingEvents); } le_hashmap_Remove(HandleRecordByFileDescriptor, (void*)(intptr_t) connectionRecordPtr->fd); close(connectionRecordPtr->fd); connectionRecordPtr->fd = -1; return LE_OK; }
//-------------------------------------------------------------------------------------------------- static void ServiceDestructor ( void* objPtr ) //-------------------------------------------------------------------------------------------------- { le_dls_Link_t* linkPtr = NULL; Service_t* servicePtr = objPtr; le_hashmap_Remove(ServiceMapRef, &servicePtr->id); /* Release the close handlers dls */ do { linkPtr = le_dls_PopTail(&servicePtr->closeListPtr); if (linkPtr) { SessionEventHandler_t* closeEventPtr = CONTAINER_OF(linkPtr, SessionEventHandler_t, link); /* Delete the reference */ le_ref_DeleteRef(HandlersRefMap, closeEventPtr->ref); /* Release the memory */ le_mem_Release(closeEventPtr); } } while (linkPtr); /* Release the open handlers dls */ do { linkPtr = le_dls_PopTail(&servicePtr->openListPtr); if (linkPtr) { SessionEventHandler_t* openEventPtr = CONTAINER_OF(linkPtr, SessionEventHandler_t, link); /* Delete the reference */ le_ref_DeleteRef(HandlersRefMap, openEventPtr->ref); le_mem_Release(openEventPtr); } } while (linkPtr); }
//-------------------------------------------------------------------------------------------------- static void DeleteWatchdog ( pid_t dogOwner ///< The client (hash key) of the Watchdog that we want to dispose of ) { WatchdogObj_t* deadDogPtr = le_hashmap_Remove(WatchdogRefsContainer, &dogOwner); if (deadDogPtr != NULL) { // All good. The dog was in the hash LE_DEBUG("Cleaning up watchdog resources for %d", deadDogPtr->procId); le_timer_Delete(deadDogPtr->timer); le_mem_Release(deadDogPtr); } else { // else the dog MUST already be deleted. LE_DEBUG("Cleaning up watchdog resources for %d but already freed.", dogOwner); } }