]> code.citadel.org Git - citadel.git/blobdiff - citadel/event_client.h
Fix memleaks
[citadel.git] / citadel / event_client.h
index de36f29ed126b31c3c82d4ec0ffb6bf2984961ad..7210fcb41f7f95682b9b6bfe85c461ea5f6dccb4 100644 (file)
@@ -1,6 +1,7 @@
 #ifndef __EVENT_CLIENT_H__
 #define __EVENT_CLIENT_H__
 #define EV_COMPAT3 0
+#include "sysconfig.h"
 #include <ev.h>
 #include <sys/types.h>
 #include <sys/socket.h>
@@ -14,13 +15,19 @@ typedef struct AsyncIO AsyncIO;
 typedef enum _eNextState {
        eSendDNSQuery,
        eReadDNSReply,
+
        eDBQuery,
+
        eConnect,
        eSendReply, 
        eSendMore,
+       eSendFile,
+
        eReadMessage, 
        eReadMore,
        eReadPayload,
+       eReadFile,
+
        eTerminateConnection,
        eAbort
 }eNextState;
@@ -72,6 +79,7 @@ typedef struct _evcurl_request_data
 } evcurl_request_data;
 
 struct AsyncIO {
+       long ID;
                eNextState NextState;
 
        /* connection related */
@@ -82,6 +90,8 @@ struct AsyncIO {
        IOBuffer SendBuf, 
                RecvBuf;
 
+       FDIOBuffer IOB; /* when sending from / reading into files, this is used. */
+
        /* our events... */
        ev_cleanup abort_by_shutdown, /* server wants to go down... */
                db_abort_by_shutdown; /* server wants to go down... */
@@ -102,6 +112,7 @@ struct AsyncIO {
                Terminate,    /* shutting down... */
                Timeout,      /* Timeout handler; may also be connection timeout */
                ConnFail,     /* What to do when one connection failed? */
+               DNSFail,      /* the dns lookup didn't work out. */
                ShutdownAbort,/* we're going down. make your piece. */ 
                NextDBOperation; /* Perform Database IO */
 
@@ -110,6 +121,10 @@ struct AsyncIO {
        /* DNS Related */
        ev_io dns_recv_event, 
                dns_send_event;
+       ev_timer dns_timeout;           /* timeout while requesting ips */
+#ifdef DEBUG_CARES
+       short int DnsSourcePort;
+#endif
        struct ares_options DNSOptions;
        ares_channel DNSChannel;
        DNSQueryParts *DNSQuery;
@@ -120,6 +135,7 @@ struct AsyncIO {
        ReadAsyncMsg *ReadMsg;
        struct CtdlMessage *AsyncMsg;
        struct recptypes *AsyncRcp;
+
        /* Custom data; its expected to contain  AsyncIO so we can save malloc()s... */
        void *Data;        /* application specific data */
        void *CitContext;  /* Citadel Session context... */
@@ -130,12 +146,19 @@ typedef struct _IOAddHandler {
        IO_CallBack EvAttch;
 }IOAddHandler; 
 
+#define CCID ((CitContext*)IO->CitContext)->cs_pid
+#define EV_syslog(LEVEL, FORMAT, ...) syslog(LEVEL, "IO[%ld]CC[%d]" FORMAT, IO->ID, CCID, __VA_ARGS__)
+#define EVM_syslog(LEVEL, FORMAT) syslog(LEVEL, "IO[%ld]CC[%d]" FORMAT, IO->ID, CCID)
+
+#define EVNC_syslog(LEVEL, FORMAT, ...) syslog(LEVEL, "IO[%ld]" FORMAT, IO->ID, __VA_ARGS__)
+#define EVNCM_syslog(LEVEL, FORMAT) syslog(LEVEL, "IO[%ld]" FORMAT, IO->ID)
+
 void FreeAsyncIOContents(AsyncIO *IO);
 
 eNextState NextDBOperation(AsyncIO *IO, IO_CallBack CB);
 eNextState QueueDBOperation(AsyncIO *IO, IO_CallBack CB);
 eNextState QueueEventContext(AsyncIO *IO, IO_CallBack CB);
-int ShutDownEventQueue(void);
+eNextState QueueCurlContext(AsyncIO *IO);
 
 eNextState InitEventIO(AsyncIO *IO, 
                       void *pData, 
@@ -166,17 +189,15 @@ void InitC_ares_dns(AsyncIO *IO);
                        syslog(LOG_ERR, "error setting option " #s " on curl handle: %s", curl_easy_strerror(sta)); \
        } } while (0)
 
-
-int evcurl_init(AsyncIO *IO, 
-               void *CustomData, 
-               const char* Desc,
-               IO_CallBack CallBack
-               IO_CallBack Terminate);
+int evcurl_init(AsyncIO *IO,
+                void *CustomData,
+                const char* Desc,
+                IO_CallBack CallBack,
+                IO_CallBack Terminate
+               IO_CallBack ShutdownAbort);
 
 eNextState ReAttachIO(AsyncIO *IO, 
                      void *pData, 
                      int ReadFirst);
 
-void evcurl_handle_start(AsyncIO *IO);
-
 #endif /* __EVENT_CLIENT_H__ */