int QueueEventContext(void *Ctx, AsyncIO *IO, EventContextAttach CB)
{
citthread_mutex_lock(&EventQueueMutex);
+ if (event_add_pipe[1] == -1) {
+ citthread_mutex_unlock(&EventQueueMutex);
+
+ return -1;
+ }
QueueEventAddPtr = Ctx;
EventContextAttachPtr = CB;
int ShutDownEventQueue(void)
{
+ citthread_mutex_lock(&EventQueueMutex);
+ if (event_add_pipe[1] == -1) {
+ citthread_mutex_unlock(&EventQueueMutex);
+
+ return -1;
+ }
write(event_add_pipe[1], "x_", 1);
close(event_add_pipe[1]);
+ event_add_pipe[1] = -1;
+ citthread_mutex_unlock(&EventQueueMutex);
return 0;
}
+void FreeAsyncIOContents(AsyncIO *IO)
+{
+ FreeStrBuf(&IO->IOBuf);
+ FreeStrBuf(&IO->SendBuf.Buf);
+ FreeStrBuf(&IO->RecvBuf.Buf);
+}
/*
static void
}
*/
+void ShutDownCLient(AsyncIO *IO)
+{
+ event_del(&IO->send_event);
+ event_del(&IO->recv_event);
+ IO->Terminate(IO->Data);
+
+// citthread_mutex_lock(&EventQueueMutex);
+
+///QueueEvents /// todo remove from hash.
+
+// citthread_mutex_unlock(&EventQueueMutex);
+}
+
eReadState HandleInbound(AsyncIO *IO)
{
eReadState Finished = eBufferNotEmpty;
event_add(&IO->send_event, NULL);
}
+ else if ((IO->NextState == eTerminateConnection) ||
+ (IO->NextState == eAbort) )
+ ShutDownCLient(IO);
return Finished;
}
break;
case eSendMore:
IO->NextState = IO->SendDone(IO->Data);
- event_add(&IO->send_event, NULL);
+
+ if ((IO->NextState == eTerminateConnection) ||
+ (IO->NextState == eAbort) )
+ ShutDownCLient(IO);
+ else
+ event_add(&IO->send_event, NULL);
break;
case eReadMessage:
if (StrBufCheckBuffer(&IO->RecvBuf) == eBufferNotEmpty) {
void *pData,
IO_CallBack ReadDone,
IO_CallBack SendDone,
+ IO_CallBack Terminate,
IO_LineReaderCallback LineReader,
int ReadFirst)
{
IO->Data = pData;
IO->SendDone = SendDone;
IO->ReadDone = ReadDone;
+ IO->Terminate = Terminate;
IO->LineReader = LineReader;
event_set(&IO->recv_event,