Procházet zdrojové kódy

Implemented debug printing for external events

Evgeny Grin (Karlson2k) před 10 měsíci
rodič
revize
89e3a71ddc

+ 5 - 0
src/incl_priv/mhd_sys_options.h

@@ -516,6 +516,11 @@
 #  endif
 #endif
 
+#ifndef mhd_DEBUG_EXTR_EVENTS
+/* Use debug-print for external events processing */
+/* #  define mhd_DEBUG_EXTR_EVENTS 1 */
+#endif
+
 #ifndef MHD_AUTH_DIGEST_DEF_TIMEOUT
 #  define MHD_AUTH_DIGEST_DEF_TIMEOUT 90
 #endif /* ! MHD_AUTH_DIGEST_DEF_TIMEOUT */

+ 43 - 0
src/mhd2/daemon_event_update.c

@@ -36,6 +36,11 @@
 
 #include "daemon_logger.h"
 
+#ifdef mhd_DEBUG_EXTR_EVENTS
+#  include "mhd_itc.h"
+#  include <stdio.h>
+#endif /* mhd_DEBUG_EXTR_EVENTS */
+
 #include "mhd_public_api.h"
 
 MHD_EXTERN_
@@ -55,6 +60,44 @@ MHD_daemon_event_update (
   if (mhd_DAEMON_STATE_STARTED < daemon->state)
     return;
 
+#ifdef mhd_DEBUG_EXTR_EVENTS
+  if (1)
+  {
+    char state_str[] = "x:x:x";
+    state_str[0] = MHD_FD_STATE_IS_SET_RECV (fd_current_state) ? 'R' : '-';
+    state_str[2] = MHD_FD_STATE_IS_SET_SEND (fd_current_state) ? 'W' : '-';
+    state_str[4] = MHD_FD_STATE_IS_SET_EXCEPT (fd_current_state) ? 'E' : '-';
+
+    switch ((mhd_SockRelMarker) ecb_cntx)
+    {
+    case mhd_SOCKET_REL_MARKER_EMPTY:
+      fprintf (stderr,
+               "### MHD_daemon_event_update(daemon, [unknown],   %s)\n",
+               state_str);
+      break;
+    case mhd_SOCKET_REL_MARKER_ITC:
+      fprintf (stderr,
+               "### MHD_daemon_event_update(daemon, [ITC:  %llu], %s)\n",
+               (unsigned long long) mhd_itc_r_fd (daemon->threading.itc),
+               state_str);
+      break;
+    case mhd_SOCKET_REL_MARKER_LISTEN:
+      fprintf (stderr,
+               "### MHD_daemon_event_update(daemon, [lstn: %llu], %s)\n",
+               (unsigned long long) daemon->net.listen.fd,
+               state_str);
+      break;
+    default:
+      fprintf (stderr,
+               "### MHD_daemon_event_update(daemon, [conn: %llu], %s)\n",
+               (unsigned long long)
+               (((struct MHD_Connection *) ecb_cntx)->sk.fd),
+               state_str);
+      break;
+    }
+  }
+#endif /* mhd_DEBUG_EXTR_EVENTS */
+
   broken_app_data = false;
   unneeded_event = false;
 

+ 28 - 26
src/mhd2/daemon_start.c

@@ -36,6 +36,8 @@
 #include "mhd_sockets_macros.h"
 #include "sys_ip_headers.h"
 
+#include "extr_events_funcs.h"
+
 #ifdef MHD_SOCKETS_KIND_POSIX
 #  include "sys_errno.h"
 #endif
@@ -2082,12 +2084,12 @@ init_daemon_fds_monitoring (struct MHD_Daemon *restrict d)
       /* Register daemon's FDs now */
 #ifdef MHD_SUPPORT_THREADS
       d->events.data.extr.itc_data.app_cntx =
-        d->events.data.extr.cb_data.cb (d->events.data.extr.cb_data.cls,
-                                        mhd_itc_r_fd (d->threading.itc),
-                                        MHD_FD_STATE_RECV_EXCEPT,
-                                        NULL,
-                                        (struct MHD_EventUpdateContext *)
-                                        mhd_SOCKET_REL_MARKER_ITC);
+        mhd_daemon_extr_event_reg (d,
+                                   mhd_itc_r_fd (d->threading.itc),
+                                   MHD_FD_STATE_RECV_EXCEPT,
+                                   NULL,
+                                   (struct MHD_EventUpdateContext *)
+                                   mhd_SOCKET_REL_MARKER_ITC);
       itc_reg_succeed = (NULL != d->events.data.extr.itc_data.app_cntx);
 #else  /* ! MHD_SUPPORT_THREADS */
       itc_reg_succeed = true;
@@ -2102,24 +2104,24 @@ init_daemon_fds_monitoring (struct MHD_Daemon *restrict d)
 
         /* Need to register the listen FD */
         d->events.data.extr.listen_data.app_cntx =
-          d->events.data.extr.cb_data.cb (d->events.data.extr.cb_data.cls,
-                                          d->net.listen.fd,
-                                          MHD_FD_STATE_RECV_EXCEPT,
-                                          NULL,
-                                          (struct MHD_EventUpdateContext *)
-                                          mhd_SOCKET_REL_MARKER_LISTEN);
+          mhd_daemon_extr_event_reg (d,
+                                     d->net.listen.fd,
+                                     MHD_FD_STATE_RECV_EXCEPT,
+                                     NULL,
+                                     (struct MHD_EventUpdateContext *)
+                                     mhd_SOCKET_REL_MARKER_LISTEN);
         if (NULL != d->events.data.extr.listen_data.app_cntx)
           return MHD_SC_OK; /* Success exit point */
 
         /* Below is a clean-up path for 'case mhd_POLL_TYPE_EXT:' */
 #ifdef MHD_SUPPORT_THREADS
         /* De-register ITC FD */
-        (void) d->events.data.extr.cb_data.cb (
-          d->events.data.extr.cb_data.cls,
-          mhd_itc_r_fd (d->threading.itc),
-          MHD_FD_STATE_NONE,
-          d->events.data.extr.itc_data.app_cntx,
-          (struct MHD_EventUpdateContext *) mhd_SOCKET_REL_MARKER_ITC);
+        (void) mhd_daemon_extr_event_reg (d,
+                                          mhd_itc_r_fd (d->threading.itc),
+                                          MHD_FD_STATE_NONE,
+                                          d->events.data.extr.itc_data.app_cntx,
+                                          (struct MHD_EventUpdateContext *)
+                                          mhd_SOCKET_REL_MARKER_ITC);
         d->events.data.extr.itc_data.app_cntx = NULL;
 #endif /* MHD_SUPPORT_THREADS */
       }
@@ -2240,20 +2242,20 @@ deinit_daemon_fds_monitoring (struct MHD_Daemon *restrict d)
   {
   case mhd_POLL_TYPE_EXT:
     if (NULL != d->events.data.extr.listen_data.app_cntx)
-      (void) d->events.data.extr.cb_data.cb (
-        d->events.data.extr.cb_data.cls,
+      (void) mhd_daemon_extr_event_reg (
+        d,
         d->net.listen.fd,
         MHD_FD_STATE_NONE,
         d->events.data.extr.listen_data.app_cntx,
         (struct MHD_EventUpdateContext *) mhd_SOCKET_REL_MARKER_LISTEN);
 #ifdef MHD_SUPPORT_THREADS
     if (NULL != d->events.data.extr.itc_data.app_cntx)
-      (void) d->events.data.extr.cb_data.cb (
-        d->events.data.extr.cb_data.cls,
-        mhd_itc_r_fd (d->threading.itc),
-        MHD_FD_STATE_NONE,
-        d->events.data.extr.itc_data.app_cntx,
-        (struct MHD_EventUpdateContext *) mhd_SOCKET_REL_MARKER_ITC);
+      (void) mhd_daemon_extr_event_reg (d,
+                                        mhd_itc_r_fd (d->threading.itc),
+                                        MHD_FD_STATE_NONE,
+                                        d->events.data.extr.itc_data.app_cntx,
+                                        (struct MHD_EventUpdateContext *)
+                                        mhd_SOCKET_REL_MARKER_ITC);
 #endif /* MHD_SUPPORT_THREADS */
     return;
 #ifdef MHD_SUPPORT_SELECT

+ 28 - 29
src/mhd2/events_process.c

@@ -509,12 +509,12 @@ ext_events_update_registrations (struct MHD_Daemon *restrict d)
   {
     /* (Re-)register ITC FD */
     d->events.data.extr.itc_data.app_cntx =
-      d->events.data.extr.cb_data.cb (d->events.data.extr.cb_data.cls,
-                                      mhd_itc_r_fd (d->threading.itc),
-                                      MHD_FD_STATE_RECV_EXCEPT,
-                                      d->events.data.extr.itc_data.app_cntx,
-                                      (struct MHD_EventUpdateContext *)
-                                      mhd_SOCKET_REL_MARKER_ITC);
+      mhd_daemon_extr_event_reg (d,
+                                 mhd_itc_r_fd (d->threading.itc),
+                                 MHD_FD_STATE_RECV_EXCEPT,
+                                 d->events.data.extr.itc_data.app_cntx,
+                                 (struct MHD_EventUpdateContext *)
+                                 mhd_SOCKET_REL_MARKER_ITC);
   }
   daemon_fds_succeed = (NULL != d->events.data.extr.itc_data.app_cntx);
 #else  /* ! MHD_SUPPORT_THREADS */
@@ -528,13 +528,12 @@ ext_events_update_registrations (struct MHD_Daemon *restrict d)
     {
       /* De-register the listen FD */
       d->events.data.extr.listen_data.app_cntx =
-        d->events.data.extr.cb_data.cb (
-          d->events.data.extr.cb_data.cls,
-          d->net.listen.fd,
-          MHD_FD_STATE_NONE,
-          d->events.data.extr.listen_data.app_cntx,
-          (struct MHD_EventUpdateContext *)
-          mhd_SOCKET_REL_MARKER_LISTEN);
+        mhd_daemon_extr_event_reg (d,
+                                   d->net.listen.fd,
+                                   MHD_FD_STATE_NONE,
+                                   d->events.data.extr.listen_data.app_cntx,
+                                   (struct MHD_EventUpdateContext *)
+                                   mhd_SOCKET_REL_MARKER_LISTEN);
       if (NULL != d->events.data.extr.listen_data.app_cntx)
         mhd_log_extr_event_dereg_failed (d);
     }
@@ -543,12 +542,12 @@ ext_events_update_registrations (struct MHD_Daemon *restrict d)
     {
       /* (Re-)register listen FD */
       d->events.data.extr.listen_data.app_cntx =
-        d->events.data.extr.cb_data.cb (
-          d->events.data.extr.cb_data.cls,
-          d->net.listen.fd,
-          MHD_FD_STATE_RECV_EXCEPT,
-          d->events.data.extr.listen_data.app_cntx,
-          (struct MHD_EventUpdateContext *) mhd_SOCKET_REL_MARKER_LISTEN);
+        mhd_daemon_extr_event_reg (d,
+                                   d->net.listen.fd,
+                                   MHD_FD_STATE_RECV_EXCEPT,
+                                   d->events.data.extr.listen_data.app_cntx,
+                                   (struct MHD_EventUpdateContext *)
+                                   mhd_SOCKET_REL_MARKER_LISTEN);
 
       daemon_fds_succeed = (NULL != d->events.data.extr.listen_data.app_cntx);
     }
@@ -578,11 +577,11 @@ ext_events_update_registrations (struct MHD_Daemon *restrict d)
       {
         /* De-register the connection socket FD */
         c->extr_event.app_cntx =
-          d->events.data.extr.cb_data.cb (d->events.data.extr.cb_data.cls,
-                                          c->sk.fd,
-                                          MHD_FD_STATE_NONE,
-                                          c->extr_event.app_cntx,
-                                          (struct MHD_EventUpdateContext *) c);
+          mhd_daemon_extr_event_reg (d,
+                                     c->sk.fd,
+                                     MHD_FD_STATE_NONE,
+                                     c->extr_event.app_cntx,
+                                     (struct MHD_EventUpdateContext *) c);
         if (NULL != c->extr_event.app_cntx)
           mhd_log_extr_event_dereg_failed (d);
       }
@@ -607,11 +606,11 @@ ext_events_update_registrations (struct MHD_Daemon *restrict d)
     {
       /* (Re-)register the connection socket FD */
       c->extr_event.app_cntx =
-        d->events.data.extr.cb_data.cb (d->events.data.extr.cb_data.cls,
-                                        c->sk.fd,
-                                        watch_for,
-                                        c->extr_event.app_cntx,
-                                        (struct MHD_EventUpdateContext *) c);
+        mhd_daemon_extr_event_reg (d,
+                                   c->sk.fd,
+                                   watch_for,
+                                   c->extr_event.app_cntx,
+                                   (struct MHD_EventUpdateContext *) c);
       if (NULL == c->extr_event.app_cntx)
       {
         mhd_conn_start_closing_ext_event_failed (c);

+ 83 - 0
src/mhd2/extr_events_funcs.h

@@ -29,6 +29,13 @@
 
 #include "mhd_sys_options.h"
 
+#ifdef mhd_DEBUG_EXTR_EVENTS
+#  include <stdio.h>
+#  include "mhd_daemon.h"
+#  include "mhd_assert.h"
+#  include "sys_null_macro.h"
+#endif /* mhd_DEBUG_EXTR_EVENTS */
+
 #ifdef MHD_SUPPORT_LOG_FUNCTIONALITY
 
 struct MHD_Daemon; /* forward declaration */
@@ -48,4 +55,80 @@ mhd_log_extr_event_dereg_failed (struct MHD_Daemon *restrict d);
 
 #endif /* ! MHD_SUPPORT_LOG_FUNCTIONALITY */
 
+#ifdef mhd_DEBUG_EXTR_EVENTS
+/**
+ * Call application event registration callback
+ * @param d the daemon to use
+ * @param fd the FD to register
+ * @param watch_for events/statuses to watch for
+ * @param app_cntx_old the previous application FD context
+ * @param ecb_cntx the MHD FD context
+ */
+MHD_static_inline_
+MHD_FN_PAR_NONNULL_ (1) void *
+mhd_daemon_extr_event_reg (struct MHD_Daemon *d,
+                           MHD_Socket fd,
+                           enum MHD_FdState watch_for,
+                           void *app_cntx_old,
+                           struct MHD_EventUpdateContext *ecb_cntx)
+{
+  void *res;
+  char state_str[] = "x:x:x";
+  const char *reg_type;
+  const char *fd_rel;
+
+  mhd_assert (mhd_WM_INT_HAS_EXT_EVENTS (d->wmode_int));
+  mhd_assert (mhd_POLL_TYPE_EXT == d->events.poll_type);
+  mhd_assert (mhd_SOCKET_REL_MARKER_EMPTY != (mhd_SockRelMarker) ecb_cntx);
+
+  res =
+    d->events.data.extr.cb_data.cb (d->events.data.extr.cb_data.cls,
+                                    fd,
+                                    watch_for,
+                                    app_cntx_old,
+                                    ecb_cntx);
+
+  if (NULL == app_cntx_old)
+    reg_type = "   Registration";
+  else if (MHD_FD_STATE_NONE == watch_for)
+    reg_type = "De-registration";
+  else
+    reg_type = "Re-registration";
+
+  state_str[0] = MHD_FD_STATE_IS_SET_RECV (watch_for) ? 'R' : '-';
+  state_str[2] = MHD_FD_STATE_IS_SET_SEND (watch_for) ? 'W' : '-';
+  state_str[4] = MHD_FD_STATE_IS_SET_EXCEPT (watch_for) ? 'E' : '-';
+
+  switch ((mhd_SockRelMarker) ecb_cntx)
+  {
+  case mhd_SOCKET_REL_MARKER_ITC:
+    fd_rel = "ITC: ";
+    break;
+  case mhd_SOCKET_REL_MARKER_LISTEN:
+    fd_rel = "lstn:";
+    break;
+  default:
+    fd_rel = "conn:";
+    break;
+  }
+  fprintf (stderr,
+           "### %s callback (cls, [%s %llu], %s, 0x%08llX, ptr) "
+           "-> 0x%08llX\n",
+           reg_type,
+           fd_rel,
+           (unsigned long long) fd,
+           state_str,
+           (unsigned long long) app_cntx_old,
+           (unsigned long long) res);
+
+  return res;
+}
+#else  /* ! mhd_DEBUG_EXTR_EVENTS */
+#  define mhd_daemon_extr_event_reg(d,fd,w_for,app_cntx_old,ecb_cntx) \
+        d->events.data.extr.cb_data.cb (d->events.data.extr.cb_data.cls, \
+                                        fd, w_for, app_cntx_old, ecb_cntx)
+
+#endif /* ! mhd_DEBUG_EXTR_EVENTS */
+
+
 #endif /* ! MHD_EXTR_EVENTS_FUNCS_H */

+ 6 - 5
src/mhd2/stream_funcs.c

@@ -32,6 +32,7 @@
 #include "mhd_unreachable.h"
 
 #include <string.h>
+#include "extr_events_funcs.h"
 #ifdef MHD_SUPPORT_EPOLL
 #  include <sys/epoll.h>
 #endif
@@ -987,11 +988,11 @@ mhd_conn_pre_clean_part1 (struct MHD_Connection *restrict c)
     if (NULL != c->extr_event.app_cntx)
     {
       c->extr_event.app_cntx =
-        d->events.data.extr.cb_data.cb (d->events.data.extr.cb_data.cls,
-                                        c->sk.fd,
-                                        MHD_FD_STATE_NONE,
-                                        c->extr_event.app_cntx,
-                                        (struct MHD_EventUpdateContext *) c);
+        mhd_daemon_extr_event_reg (d,
+                                   c->sk.fd,
+                                   MHD_FD_STATE_NONE,
+                                   c->extr_event.app_cntx,
+                                   (struct MHD_EventUpdateContext *) c);
       if (NULL != c->extr_event.app_cntx)
         mhd_log_extr_event_dereg_failed (d);
     }