Exemplo n.º 1
0
void CBNodeProcessMessages(void * node){
	CBNode * self = node;
	CBMutexLock(self->messageProcessMutex);
	for (;;) {
		if (self->messageQueue == NULL && !self->shutDownThread){
			// Wait for more messages
			CBConditionWait(self->messageProcessWaitCond, self->messageProcessMutex);
			CBLogVerbose("Process thread as been woken");
		}
		// Check to see if the thread should terminate
		if (self->shutDownThread){
			CBMutexUnlock(self->messageProcessMutex);
			return;
		}
		// Process next message on queue
		CBMessageQueue * toProcess = self->messageQueue;
		CBMutexUnlock(self->messageProcessMutex);
		// Handle alerts
		CBOnMessageReceivedAction action;
		if (toProcess->message->type == CB_MESSAGE_TYPE_ALERT)
			// The peer sent us an alert message
			action = CBNodeProcessAlert(self, toProcess->peer, CBGetAlert(toProcess->message));
		else
			action = self->onMessageReceived(self, toProcess->peer, toProcess->message);
		if (action == CB_MESSAGE_ACTION_DISCONNECT)
			// We need to disconnect the node
			CBNodeDisconnectPeer(toProcess->peer);
		CBMutexLock(self->messageProcessMutex);
		// Remove this from queue
		CBReleaseObject(toProcess->message);
		CBReleaseObject(toProcess->peer);
		self->messageQueue = toProcess->next;
		free(toProcess);
	}
}
Exemplo n.º 2
0
void CBStartEventLoop(void * vloop){
	CBEventLoop * loop = vloop;
	CBLogVerbose("Starting network event loop.");
	// Start event loop
	ev_run(loop->base, 0);
	// Break from loop. Free everything.
	ev_loop_destroy(loop->base);
	free(loop->userEvent);
	CBFreeCallbackQueue(&loop->queue);
	CBFreeThread(loop->loopThread);
	free(loop);
}