EVENT: we memset the context, remember & re-set the ID so we can find the earlier...
[citadel.git] / citadel / event_client.c
index eb8a682fcbad3c8586bad0d188e3193ac1331ab0..90c5e5dd986619f4f9f5426bea3393133a9cb7c1 100644 (file)
@@ -316,8 +316,8 @@ void StopClientWatchers(AsyncIO *IO, int CloseFD)
 
        if (CloseFD && (IO->SendBuf.fd > 0)) {
                close(IO->SendBuf.fd);
-               IO->SendBuf.fd = -1;
-               IO->RecvBuf.fd = -1;
+               IO->SendBuf.fd = 0;
+               IO->RecvBuf.fd = 0;
        }
 }
 
@@ -370,7 +370,22 @@ void PostInbound(AsyncIO *IO)
        case eSendMore:
                assert(IO->SendDone);
                IO->NextState = IO->SendDone(IO);
-               ev_io_start(event_base, &IO->send_event);
+               switch (IO->NextState)
+               {
+               case eSendFile:
+               case eSendReply:
+               case eSendMore:
+               case eReadMessage:
+               case eReadPayload:
+               case eReadMore:
+               case eReadFile:
+                       ev_io_start(event_base, &IO->send_event);
+                       break;
+               case eDBQuery:
+                       StopClientWatchers(IO, 0);
+               default:
+                       break;
+               }
                break;
        case eReadPayload:
        case eReadMore:
@@ -581,12 +596,12 @@ IO_send_callback(struct ev_loop *loop, ev_io *watcher, int revents)
                if (errno != EAGAIN) {
                        StopClientWatchers(IO, 1);
                        EV_syslog(LOG_DEBUG,
-                                 "EVENT: Socket Invalid! [%d] [%s] [%d]\n",
+                                 "IO_send_callback(): Socket Invalid! [%d] [%s] [%d]\n",
                                  errno, strerror(errno), IO->SendBuf.fd);
                        StrBufPrintf(IO->ErrMsg,
                                     "Socket Invalid! [%s]",
                                     strerror(errno));
-                       SetNextTimeout(IO, 0.0);
+                       SetNextTimeout(IO, 0.01);
                }
        }
        /* else : must write more. */
@@ -814,12 +829,12 @@ IO_recv_callback(struct ev_loop *loop, ev_io *watcher, int revents)
                        // FD is gone. kick it. 
                        StopClientWatchers(IO, 1);
                        EV_syslog(LOG_DEBUG,
-                                 "EVENT: Socket Invalid! [%d] [%s] [%d]\n",
+                                 "IO_recv_callback(): Socket Invalid! [%d] [%s] [%d]\n",
                                  errno, strerror(errno), IO->SendBuf.fd);
                        StrBufPrintf(IO->ErrMsg,
                                     "Socket Invalid! [%s]",
                                     strerror(errno));
-                       SetNextTimeout(IO, 0.0);
+                       SetNextTimeout(IO, 0.01);
                }
                return;
        }
@@ -888,10 +903,12 @@ eNextState EvConnectSock(AsyncIO *IO,
        fdflags = fcntl(IO->SendBuf.fd, F_GETFL);
        if (fdflags < 0) {
                EV_syslog(LOG_ERR,
-                         "EVENT: unable to get socket flags! %s \n",
+                         "EVENT: unable to get socket %d flags! %s \n",
+                         IO->SendBuf.fd,
                          strerror(errno));
                StrBufPrintf(IO->ErrMsg,
-                            "Failed to get socket flags: %s",
+                            "Failed to get socket %d flags: %s",
+                            IO->SendBuf.fd,
                             strerror(errno));
                close(IO->SendBuf.fd);
                IO->SendBuf.fd = IO->RecvBuf.fd = 0;
@@ -901,7 +918,8 @@ eNextState EvConnectSock(AsyncIO *IO,
        if (fcntl(IO->SendBuf.fd, F_SETFL, fdflags) < 0) {
                EV_syslog(
                        LOG_ERR,
-                       "EVENT: unable to set socket nonblocking flags! %s \n",
+                       "EVENT: unable to set socket %d nonblocking flags! %s \n",
+                       IO->SendBuf.fd,
                        strerror(errno));
                StrBufPrintf(IO->ErrMsg,
                             "Failed to set socket flags: %s",
@@ -958,12 +976,12 @@ eNextState EvConnectSock(AsyncIO *IO,
        }
 
        if (rc >= 0){
-               EVM_syslog(LOG_DEBUG, "connect() immediate success.\n");
+               EV_syslog(LOG_DEBUG, "connect() = %d immediate success.\n", IO->SendBuf.fd);
                set_start_callback(event_base, IO, 0);
                return IO->NextState;
        }
        else if (errno == EINPROGRESS) {
-               EVM_syslog(LOG_DEBUG, "connect() have to wait now.\n");
+               EV_syslog(LOG_DEBUG, "connect() = %d have to wait now.\n", IO->SendBuf.fd);
 
                ev_io_init(&IO->conn_event,
                           IO_connestd_callback,
@@ -982,7 +1000,11 @@ eNextState EvConnectSock(AsyncIO *IO,
                IO->conn_fail_immediate.data = IO;
                ev_idle_start(event_base, &IO->conn_fail_immediate);
 
-               EV_syslog(LOG_ERR, "connect() failed: %s\n", strerror(errno));
+               EV_syslog(LOG_ERR,
+                         "connect() = %d failed: %s\n",
+                         IO->SendBuf.fd,
+                         strerror(errno));
+
                StrBufPrintf(IO->ErrMsg,
                             "Failed to connect: %s",
                             strerror(errno));
@@ -1032,7 +1054,7 @@ void InitIOStruct(AsyncIO *IO,
        IO->Data          = Data;
 
        IO->CitContext    = CloneContext(CC);
-       IO->CitContext->session_specific_data = (char*) Data;
+       IO->CitContext->session_specific_data = Data;
        IO->CitContext->IO = IO;
 
        IO->NextState     = NextState;
@@ -1070,7 +1092,7 @@ int InitcURLIOStruct(AsyncIO *IO,
        IO->Data          = Data;
 
        IO->CitContext    = CloneContext(CC);
-       IO->CitContext->session_specific_data = (char*) Data;
+       IO->CitContext->session_specific_data = Data;
        IO->CitContext->IO = IO;
 
        IO->SendDone      = SendDone;
@@ -1093,10 +1115,13 @@ typedef struct KillOtherSessionContext {
 
 eNextState KillTerminate(AsyncIO *IO)
 {
+       long id;
        KillOtherSessionContext *Ctx = (KillOtherSessionContext*)IO->Data;
        EV_syslog(LOG_DEBUG, "%s Exit\n", __FUNCTION__);
+       id = IO->ID;
        FreeAsyncIOContents(IO);
        memset(Ctx, 0, sizeof(KillOtherSessionContext));
+       IO->ID = id; /* just for the case we want to analyze it in a coredump */
        free(Ctx);
        return eAbort;