- add the ev_now() timestamp to the contexts (just for measuring that precision should be ok...)
- output the time the DNS requests take
- output the time the whole SMTP delivery aproach took
int cs_pid; /* session ID */
int dont_term; /* for special activities like artv so we don't get killed */
+ double created; /* time of birth */
time_t lastcmd; /* time of last command executed */
time_t lastidle; /* For computing idle time */
CCState state; /* thread state (see CON_ values below) */
#include "ctdl_module.h"
static void IO_Timeout_callback(struct ev_loop *loop, ev_timer *watcher, int revents);
-
static void IO_abort_shutdown_callback(struct ev_loop *loop,
ev_cleanup *watcher,
- int revents)
-{
- AsyncIO *IO = watcher->data;
- EV_syslog(LOG_DEBUG, "EVENT Q: %s\n", __FUNCTION__);
-
- assert(IO->ShutdownAbort);
- IO->ShutdownAbort(IO);
-}
+ int revents);
/*------------------------------------------------------------------------------
DB_PerformNext(struct ev_loop *loop, ev_idle *watcher, int revents)
{
AsyncIO *IO = watcher->data;
+ IO->Now = ev_now(event_db);
EV_syslog(LOG_DEBUG, "%s()", __FUNCTION__);
become_session(IO->CitContext);
extern ev_async AddJob;
extern ev_async ExitEventLoop;
+static void IO_abort_shutdown_callback(struct ev_loop *loop,
+ ev_cleanup *watcher,
+ int revents)
+{
+ AsyncIO *IO = watcher->data;
+ EV_syslog(LOG_DEBUG, "EVENT Q: %s\n", __FUNCTION__);
+ IO->Now = ev_now(event_base);
+ assert(IO->ShutdownAbort);
+ IO->ShutdownAbort(IO);
+}
+
eNextState QueueEventContext(AsyncIO *IO, IO_CallBack CB)
{
AsyncIO *IO = watcher->data;
const char *errmsg = NULL;
+ IO->Now = ev_now(event_base);
become_session(IO->CitContext);
#ifdef BIGBAD_IODBG
{
{
AsyncIO *IO = watcher->data;
+ IO->Now = ev_now(event_base);
ev_timer_stop (event_base, &IO->rw_timeout);
become_session(IO->CitContext);
{
AsyncIO *IO = watcher->data;
+ IO->Now = ev_now(event_base);
ev_timer_stop (event_base, &IO->conn_fail);
if (IO->SendBuf.fd != 0)
{
AsyncIO *IO = watcher->data;
+ IO->Now = ev_now(event_base);
ev_idle_stop (event_base, &IO->conn_fail_immediate);
if (IO->SendBuf.fd != 0)
{
AsyncIO *IO = watcher->data;
+ IO->Now = ev_now(event_base);
ev_io_stop(loop, &IO->conn_event);
ev_timer_stop (event_base, &IO->conn_fail);
set_start_callback(loop, IO, revents);
ssize_t nbytes;
AsyncIO *IO = watcher->data;
+ IO->Now = ev_now(event_base);
switch (IO->NextState) {
case eReadFile:
nbytes = FileRecvChunked(&IO->IOB, &errmsg);
IO_postdns_callback(struct ev_loop *loop, ev_idle *watcher, int revents)
{
AsyncIO *IO = watcher->data;
+ IO->Now = ev_now(event_base);
EV_syslog(LOG_DEBUG, "event: %s\n", __FUNCTION__);
become_session(IO->CitContext);
assert(IO->DNS.Query->PostDNS);
/* DNS Related */
typedef struct __evcares_data {
+ ev_tstamp Start;
ev_io recv_event,
send_event;
ev_timer timeout; /* timeout while requesting ips */
struct AsyncIO {
long ID;
+ ev_tstamp Now;
+ ev_tstamp StartIO;
+ ev_tstamp StartDB;
eNextState NextState;
/* connection related */
IO->DNS.Query = QueryParts;
IO->DNS.Query->PostDNS = PostDNS;
+ IO->DNS.Start = IO->Now;
InitC_ares_dns(IO);
{
AsyncIO *IO = watcher->data;
+ IO->Now = ev_now(event_base);
#ifdef DEBUG_CARES
EV_syslog(LOG_DEBUG, "C-ARES: %s\n", __FUNCTION__);
#endif
{
AsyncIO *IO = watcher->data;
+ IO->Now = ev_now(event_base);
+
#ifdef DEBUG_CARES
EV_syslog(LOG_DEBUG, "C-ARES: %s\n", __FUNCTION__);
#endif
IO->DNS.SourcePort);
}
#endif
+ IO->Now = ev_now(event_base);
if (read) {
if ((IO->DNS.recv_event.fd != sock) &&
curl_easy_strerror(sta));
IO = (AsyncIO *)chandle;
+ IO->Now = ev_now(event_base);
+
ev_io_stop(event_base, &IO->recv_event);
ev_io_stop(event_base, &IO->send_event);
{
IO->HttpReq.ReplyData = NewStrBufPlain(NULL, SIZ);
}
+ IO->Now = ev_now(event_base);
return CurlFillStrBuf_callback(data,
size,
nmemb,
curl_multi_assign(mhnd, fd, IO);
}
+ IO->Now = ev_now(event_base);
+
Action = "";
switch (action)
{
{
CURLMcode msta;
AsyncIO *IO = watcher->data;
+ IO->Now = ev_now(event_base);
EV_syslog(LOG_DEBUG, "EVENT Curl: %s\n", __FUNCTION__);
curl_slist_free_all(IO->HttpReq.headers);
static void QueueEventAddCallback(EV_P_ ev_async *w, int revents)
{
+ ev_tstamp Now;
HashList *q;
void *v;
HashPos*It;
q = InboundEventQueues[1];
}
pthread_mutex_unlock(&EventQueueMutex);
-
+ Now = ev_now (event_base);
It = GetNewHashPos(q, 0);
while (GetNextHashPos(q, It, &len, &Key, &v))
{
IOAddHandler *h = v;
- if (h->IO->ID == 0)
+ if (h->IO->ID == 0) {
h->IO->ID = EvIDSource++;
+ }
+ if (h->IO->StartIO == 0.0)
+ h->IO->StartIO = Now;
+ h->IO->Now = Now;
h->EvAttch(h->IO);
}
DeleteHashPos(&It);
static void DBQueueEventAddCallback(EV_P_ ev_async *w, int revents)
{
+ ev_tstamp Now;
HashList *q;
void *v;
HashPos *It;
}
pthread_mutex_unlock(&DBEventQueueMutex);
+ Now = ev_now (event_db);
It = GetNewHashPos(q, 0);
while (GetNextHashPos(q, It, &len, &Key, &v))
{
eNextState rc;
if (h->IO->ID == 0)
h->IO->ID = EvIDSource++;
+ if (h->IO->StartDB == 0.0)
+ h->IO->StartDB = Now;
+ h->IO->Now = Now;
rc = h->EvAttch(h->IO);
switch (rc)
{
Status = "Delivery failed temporarily; will retry later.";
EVS_syslog(LOG_INFO,
- "SMTP: %s Recipient <%s> @ <%s> (%s) Statusmessage: %s\n",
+ "SMTP: %s Time[%fs] Recipient <%s> @ <%s> (%s) Statusmessage: %s\n",
Status,
+ Msg->IO.Now - Msg->IO.StartIO,
Msg->user,
Msg->node,
Msg->name,
struct hostent *hostent;
QueryCbDone(IO);
+ EVS_syslog(LOG_DEBUG, "SMTP: %s Time[%fs]\n",
+ __FUNCTION__,
+ IO->Now - IO->DNS.Start);
hostent = Msg->HostLookup.VParsedDNSReply;
if ((Msg->HostLookup.DNSStatus == ARES_SUCCESS) &&
QueryCbDone(IO);
- EVS_syslog(LOG_DEBUG, "SMTP: %s\n", __FUNCTION__);
+ EVS_syslog(LOG_DEBUG, "SMTP: %s Time[%fs]\n",
+ __FUNCTION__,
+ IO->Now - IO->DNS.Start);
pp = &Msg->Relay;
while ((pp != NULL) && (*pp != NULL) && ((*pp)->Next != NULL))