CAResult_t CAEDRInitializeReceiveHandler() { OIC_LOG(DEBUG, EDR_ADAPTER_TAG, "IN"); // Check if the message queue is already initialized if (g_recvQueueHandle) { OIC_LOG(DEBUG, EDR_ADAPTER_TAG, "Already queue is initialized!"); return CA_STATUS_OK; } g_recvQueueHandle = (CAQueueingThread_t *) OICMalloc(sizeof(CAQueueingThread_t)); if (!g_recvQueueHandle) { OIC_LOG(ERROR, EDR_ADAPTER_TAG, "Memory allocation failed!"); return CA_MEMORY_ALLOC_FAILED; } if (CA_STATUS_OK != CAQueueingThreadInitialize(g_recvQueueHandle, g_edrThreadPool, CAAdapterDataReceiverHandler, CAEDRDataDestroyer)) { OIC_LOG(ERROR, EDR_ADAPTER_TAG, "Failed to Initialize send queue thread"); return CA_STATUS_FAILED; } OIC_LOG(DEBUG, EDR_ADAPTER_TAG, "OUT"); return CA_STATUS_OK; }
CAResult_t CATCPInitializeQueueHandles() { // Check if the message queue is already initialized if (g_sendQueueHandle) { OIC_LOG(DEBUG, TAG, "send queue handle is already initialized!"); return CA_STATUS_OK; } // Create send message queue g_sendQueueHandle = OICMalloc(sizeof(CAQueueingThread_t)); if (!g_sendQueueHandle) { OIC_LOG(ERROR, TAG, "Memory allocation failed!"); return CA_MEMORY_ALLOC_FAILED; } if (CA_STATUS_OK != CAQueueingThreadInitialize(g_sendQueueHandle, (const ca_thread_pool_t)caglobals.tcp.threadpool, CATCPSendDataThread, CADataDestroyer)) { OIC_LOG(ERROR, TAG, "Failed to Initialize send queue thread"); OICFree(g_sendQueueHandle); g_sendQueueHandle = NULL; return CA_STATUS_FAILED; } return CA_STATUS_OK; }
CAResult_t CAInitializeMessageHandler() { CASetPacketReceivedCallback(CAReceivedPacketCallback); CASetNetworkChangeCallback(CANetworkChangedCallback); CASetErrorHandleCallback(CAErrorHandler); #ifndef SINGLE_THREAD // create thread pool CAResult_t res = ca_thread_pool_init(MAX_THREAD_POOL_SIZE, &g_threadPoolHandle); if (CA_STATUS_OK != res) { OIC_LOG(ERROR, TAG, "thread pool initialize error."); return res; } // send thread initialize if (CA_STATUS_OK != CAQueueingThreadInitialize(&g_sendThread, g_threadPoolHandle, CASendThreadProcess, CADestroyData)) { OIC_LOG(ERROR, TAG, "Failed to Initialize send queue thread"); return CA_STATUS_FAILED; } // start send thread res = CAQueueingThreadStart(&g_sendThread); if (CA_STATUS_OK != res) { OIC_LOG(ERROR, TAG, "thread start error(send thread)."); ca_thread_pool_free(g_threadPoolHandle); g_threadPoolHandle = NULL; return res; } // receive thread initialize if (CA_STATUS_OK != CAQueueingThreadInitialize(&g_receiveThread, g_threadPoolHandle, CAReceiveThreadProcess, CADestroyData)) { OIC_LOG(ERROR, TAG, "Failed to Initialize receive queue thread"); return CA_STATUS_FAILED; } #ifndef SINGLE_HANDLE // This will be enabled when RI supports multi threading // start receive thread res = CAQueueingThreadStart(&g_receiveThread); if (res != CA_STATUS_OK) { OIC_LOG(ERROR, TAG, "thread start error(receive thread)."); return res; } #endif /* SINGLE_HANDLE */ // retransmission initialize CARetransmissionInitialize(&g_retransmissionContext, g_threadPoolHandle, CASendUnicastData, CATimeoutCallback, NULL); #ifdef WITH_BWT // block-wise transfer initialize CAInitializeBlockWiseTransfer(CAAddDataToSendThread, CAAddDataToReceiveThread); #endif // start retransmission res = CARetransmissionStart(&g_retransmissionContext); if (CA_STATUS_OK != res) { OIC_LOG(ERROR, TAG, "thread start error(retransmission thread)."); return res; } // initialize interface adapters by controller CAInitializeAdapters(g_threadPoolHandle); #else // retransmission initialize CARetransmissionInitialize(&g_retransmissionContext, NULL, CASendUnicastData, CATimeoutCallback, NULL); CAInitializeAdapters(); #endif return CA_STATUS_OK; }