int DebugEventLoop = 0;
int DebugEventLoopBacktrace = 0;
int DebugCurl = 0;
+pthread_key_t evConKey;
long EvIDSource = 1;
/*****************************************************************************
#define DBGLOG(LEVEL) if ((LEVEL != LOG_DEBUG) || (DebugCurl != 0))
#define EVCURL_syslog(LEVEL, FORMAT, ...) \
- DBGLOG (LEVEL) syslog(LEVEL, "EVCURL:IO[%ld]CC[%d] " FORMAT, \
- IO->ID, CCID, __VA_ARGS__)
+ DBGLOG (LEVEL) syslog(LEVEL, "EVCURL:%s[%ld]CC[%d] " FORMAT, \
+ IOSTR, IO->ID, CCID, __VA_ARGS__)
#define EVCURLM_syslog(LEVEL, FORMAT) \
- DBGLOG (LEVEL) syslog(LEVEL, "EVCURL:IO[%ld]CC[%d] " FORMAT, \
- IO->ID, CCID)
+ DBGLOG (LEVEL) syslog(LEVEL, "EVCURL:%s[%ld]CC[%d] " FORMAT, \
+ IOSTR, IO->ID, CCID)
#define CURL_syslog(LEVEL, FORMAT, ...) \
DBGLOG (LEVEL) syslog(LEVEL, "CURL: " FORMAT, __VA_ARGS__)
IO);
continue;
}
+ SetEVState(IO, eCurlGotStatus);
EVCURLM_syslog(LOG_DEBUG, "request complete\n");
EVCURL_syslog(LOG_ERR,
"error description: %s\n",
IO->HttpReq.errdesc);
+ IO->HttpReq.CurlError = curl_easy_strerror(sta);
EVCURL_syslog(LOG_ERR,
"error performing request: %s\n",
- curl_easy_strerror(sta));
+ IO->HttpReq.CurlError);
+ if (sta == CURLE_OPERATION_TIMEDOUT)
+ {
+ IO->SendBuf.fd = 0;
+ IO->RecvBuf.fd = 0;
+ }
}
sta = curl_easy_getinfo(chnd,
CURLINFO_RESPONSE_CODE,
"%s\n",
curl_multi_strerror(msta));
- ev_cleanup_stop(event_base, &IO->abort_by_shutdown);
+ ev_cleanup_stop(event_base, &IO->abort_by_shutdown);
IO->HttpReq.attached = 0;
switch(IO->SendDone(IO))
{
case eDBQuery:
- curl_easy_cleanup(IO->HttpReq.chnd);
- IO->HttpReq.chnd = NULL;
- break;
case eSendDNSQuery:
case eReadDNSReply:
case eConnect:
case eReadMore:
case eReadPayload:
case eReadFile:
- curl_easy_cleanup(IO->HttpReq.chnd);
- IO->HttpReq.chnd = NULL;
break;
case eTerminateConnection:
case eAbort:
}
static size_t
-gotdata(void *data, size_t size, size_t nmemb, void *cglobal) {
+gotdata(void *data, size_t size, size_t nmemb, void *cglobal)
+{
AsyncIO *IO = (AsyncIO*) cglobal;
+ SetEVState(IO, eCurlGotData);
if (IO->HttpReq.ReplyData == NULL)
{
IO->HttpReq.ReplyData = NewStrBufPlain(NULL, SIZ);
return -1;
}
IO = (AsyncIO *) f;
+ SetEVState(IO, eCurlNewIO);
EVCURL_syslog(LOG_DEBUG,
"EVCURL: got socket for URL: %s\n",
IO->ConnectMe->PlainUrl);
curl_multi_assign(mhnd, fd, IO);
}
+ SetEVState(IO, eCurlGotIO);
IO->Now = ev_now(event_base);
Action = "";
if (IO == NULL)
return;
+
+ SetEVState(IO, eCurlShutdown);
IO->Now = ev_now(event_base);
EVCURL_syslog(LOG_DEBUG, "EVENT Curl: %s\n", __FUNCTION__);
CURLcode sta;
CURL *chnd;
+ SetEVState(IO, eCurlStart);
chnd = IO->HttpReq.chnd;
EVCURL_syslog(LOG_DEBUG,
"EVCURL: Loading URL: %s\n", IO->ConnectMe->PlainUrl);
if (h->IO->StartIO == 0.0)
h->IO->StartIO = Now;
+ SetEVState(h->IO, eIOAttach);
+
Ctx = h->IO->CitContext;
become_session(Ctx);
extern void CtdlDestroyEVCleanupHooks(void);
extern int EVQShutDown;
+const char *IOLog = "IO";
/*
* this thread operates the select() etc. via libev.
*/
struct CitContext libev_client_CC;
CtdlFillSystemContext(&libev_client_CC, "LibEv Thread");
-// citthread_setspecific(MyConKey, (void *)&smtp_queue_CC);
+
+ pthread_setspecific(evConKey, IOLog);
+
EVQM_syslog(LOG_DEBUG, "client_event_thread() initializing\n");
event_base = ev_default_loop (EVFLAG_AUTO);
h->IO->StartDB = Now;
h->IO->Now = Now;
+ SetEVState(h->IO, eDBAttach);
Ctx = h->IO->CitContext;
become_session(Ctx);
ev_cleanup_start(event_db, &h->IO->db_abort_by_shutdown);
DBInboundEventQueue = DBInboundEventQueues[0];
}
+const char *DBLog = "BD";
+
/*
* this thread operates writing to the message database via libev.
*/
ev_loop *tmp;
struct CitContext libev_msg_CC;
+ pthread_setspecific(evConKey, DBLog);
+
CtdlFillSystemContext(&libev_msg_CC, "LibEv DB IO Thread");
EVQM_syslog(LOG_DEBUG, "dbevent_thread() initializing\n");
DebugCurl = n;
}
+const char *WLog = "WX";
CTDL_MODULE_INIT(event_client)
{
if (!threading)
{
+ if (pthread_key_create(&evConKey, NULL) != 0) {
+ syslog(LOG_CRIT, "Can't create TSD key: %s", strerror(errno));
+ }
+ pthread_setspecific(evConKey, WLog);
+
CtdlRegisterDebugFlagHook(HKEY("eventloop"), DebugEventloopEnable, &DebugEventLoop);
CtdlRegisterDebugFlagHook(HKEY("eventloopbacktrace"), DebugEventloopBacktraceEnable, &DebugEventLoopBacktrace);
CtdlRegisterDebugFlagHook(HKEY("curl"), DebugCurlEnable, &DebugCurl);