#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
+#if HAVE_BACKTRACE
+#include <execinfo.h>
+#endif
#include <libcitadel.h>
ev_async_send (event_db, &DBAddJob);
pthread_mutex_unlock(&DBEventExitQueueMutex);
- EVM_syslog(LOG_DEBUG, "DBEVENT Q Done.\n");
+ EVQM_syslog(LOG_DEBUG, "DBEVENT Q Done.\n");
return eDBQuery;
}
return eSendReply;
}
-eNextState EventQueueDBOperation(AsyncIO *IO, IO_CallBack CB)
+eNextState EventQueueDBOperation(AsyncIO *IO, IO_CallBack CB, int CloseFDs)
{
- StopClientWatchers(IO, 0);
+ StopClientWatchers(IO, CloseFDs);
return QueueDBOperation(IO, CB);
}
eNextState DBQueueEventContext(AsyncIO *IO, IO_CallBack CB)
}
-void DestructCAres(AsyncIO *IO);
void FreeAsyncIOContents(AsyncIO *IO)
{
CitContext *Ctx = IO->CitContext;
FreeStrBuf(&IO->SendBuf.Buf);
FreeStrBuf(&IO->RecvBuf.Buf);
- DestructCAres(IO);
-
FreeURL(&IO->ConnectMe);
FreeStrBuf(&IO->HttpReq.ReplyData);
}
+void DestructCAres(AsyncIO *IO);
void StopClientWatchers(AsyncIO *IO, int CloseFD)
{
+ EVM_syslog(LOG_DEBUG, "EVENT StopClientWatchers");
+
+ DestructCAres(IO);
+
ev_timer_stop (event_base, &IO->rw_timeout);
ev_timer_stop(event_base, &IO->conn_fail);
ev_idle_stop(event_base, &IO->unwind_stack);
}
if (Finished != eMustReadMore) {
+ eNextState rc;
assert(IO->ReadDone);
ev_io_stop(event_base, &IO->recv_event);
- IO->NextState = IO->ReadDone(IO);
- Finished = StrBufCheckBuffer(&IO->RecvBuf);
+ rc = IO->ReadDone(IO);
+ if (rc != eDBQuery) {
+ IO->NextState = rc;
+ Finished = StrBufCheckBuffer(&IO->RecvBuf);
+ }
+ else {
+ return rc;
+
+ }
}
}