NTTList: move into networking module
authorWilfried Goesgens <dothebart@citadel.org>
Thu, 3 May 2012 20:44:33 +0000 (22:44 +0200)
committerWilfried Goesgens <dothebart@citadel.org>
Thu, 3 May 2012 20:44:33 +0000 (22:44 +0200)
  - use session logout hook to free the NTTList entry instead of adding a dependency to user_ops.c
  - make logging of NTT configurable
  - move ntt locking code into serv_network.c

citadel/file_ops.c
citadel/file_ops.h
citadel/modules/network/serv_network.c
citadel/modules/network/serv_network.h
citadel/user_ops.c

index 460e2a85b462df566385f4211d44f983d8b6d52e..d1b529d57efada1399545722745c3873bdf07e5c 100644 (file)
 #include "ctdl_module.h"
 #include "user_ops.h"
 
-/*
- * network_talking_to()  --  concurrency checker
- */
-static HashList *nttlist = NULL;
-int network_talking_to(const char *nodename, long len, int operation) {
-
-       int retval = 0;
-       HashPos *Pos = NULL;
-       void *vdata;
-
-       begin_critical_section(S_NTTLIST);
-
-       switch(operation) {
-
-               case NTT_ADD:
-                       if (nttlist == NULL) 
-                               nttlist = NewHash(1, NULL);
-                       Put(nttlist, nodename, len, NewStrBufPlain(nodename, len), HFreeStrBuf);
-                       syslog(LOG_DEBUG, "nttlist: added <%s>\n", nodename);
-                       break;
-               case NTT_REMOVE:
-                       if ((nttlist == NULL) ||
-                           (GetCount(nttlist) == 0))
-                               break;
-                       Pos = GetNewHashPos(nttlist, 1);
-                       if (GetHashPosFromKey (nttlist, nodename, len, Pos))
-                               DeleteEntryFromHash(nttlist, Pos);
-                       DeleteHashPos(&Pos);
-                       syslog(LOG_DEBUG, "nttlist: removed <%s>\n", nodename);
-
-                       break;
-
-               case NTT_CHECK:
-                       if ((nttlist == NULL) ||
-                           (GetCount(nttlist) == 0))
-                               break;
-                       if (GetHash(nttlist, nodename, len, &vdata))
-                               retval ++;
-                       syslog(LOG_DEBUG, "nttlist: have [%d] <%s>\n", retval, nodename);
-                       break;
-       }
-
-       end_critical_section(S_NTTLIST);
-       return(retval);
-}
-
-void cleanup_nttlist(void)
-{
-        begin_critical_section(S_NTTLIST);
-       DeleteHash(&nttlist);
-        end_critical_section(S_NTTLIST);
-}
-
 
 
 /*
@@ -811,6 +758,7 @@ void cmd_nuop(char *cmdbuf)
 CTDL_MODULE_INIT(file_ops)
 {
        if (!threading) {
+
                CtdlRegisterProtoHook(cmd_delf, "DELF", "Delete a file");
                CtdlRegisterProtoHook(cmd_movf, "MOVF", "Move a file");
                CtdlRegisterProtoHook(cmd_open, "OPEN", "Open a download file transfer");
@@ -823,7 +771,6 @@ CTDL_MODULE_INIT(file_ops)
                CtdlRegisterProtoHook(cmd_nuop, "NUOP", "Open a network spool file for upload");
                CtdlRegisterProtoHook(cmd_oimg, "OIMG", "Open an image file for download");
                CtdlRegisterProtoHook(cmd_uimg, "UIMG", "Upload an image file");
-               CtdlRegisterCleanupHook(cleanup_nttlist);
        }
         /* return our Subversion id for the Log */
        return "file_ops";
index a2483a126e115446026c5a1c67ffcd85849437a5..080c83e76488803d1c11b0942593c7939bd585b8 100644 (file)
@@ -6,15 +6,5 @@
 void OpenCmdResult (char *, const char *);
 void abort_upl (CitContext *who);
 
-int network_talking_to(const char *nodename, long len, int operation);
-
-/*
- * Operations that can be performed by network_talking_to()
- */
-enum {
-        NTT_ADD,
-        NTT_REMOVE,
-        NTT_CHECK
-};
 
 #endif /* FILE_OPS_H */
index dc61feb47a93b4c60c20b9a589d1e6af5018cb20..7ac84729c331241d482c5d63b5232a30c6be600d 100644 (file)
@@ -618,14 +618,90 @@ int network_room_handler (struct ctdlroom *room)
        return 0;
 }
 
+int NTTDebugEnabled = 0;
+
+/*
+ * network_talking_to()  --  concurrency checker
+ */
+static HashList *nttlist = NULL;
+int network_talking_to(const char *nodename, long len, int operation) {
+
+       int retval = 0;
+       HashPos *Pos = NULL;
+       void *vdata;
+
+       begin_critical_section(S_NTTLIST);
+
+       switch(operation) {
+
+               case NTT_ADD:
+                       if (nttlist == NULL) 
+                               nttlist = NewHash(1, NULL);
+                       Put(nttlist, nodename, len, NewStrBufPlain(nodename, len), HFreeStrBuf);
+                       if (NTTDebugEnabled) syslog(LOG_DEBUG, "nttlist: added <%s>\n", nodename);
+                       break;
+               case NTT_REMOVE:
+                       if ((nttlist == NULL) ||
+                           (GetCount(nttlist) == 0))
+                               break;
+                       Pos = GetNewHashPos(nttlist, 1);
+                       if (GetHashPosFromKey (nttlist, nodename, len, Pos))
+                               DeleteEntryFromHash(nttlist, Pos);
+                       DeleteHashPos(&Pos);
+                       if (NTTDebugEnabled) syslog(LOG_DEBUG, "nttlist: removed <%s>\n", nodename);
+
+                       break;
+
+               case NTT_CHECK:
+                       if ((nttlist == NULL) ||
+                           (GetCount(nttlist) == 0))
+                               break;
+                       if (GetHash(nttlist, nodename, len, &vdata))
+                               retval ++;
+                       if (NTTDebugEnabled) syslog(LOG_DEBUG, "nttlist: have [%d] <%s>\n", retval, nodename);
+                       break;
+       }
+
+       end_critical_section(S_NTTLIST);
+       return(retval);
+}
+
+void cleanup_nttlist(void)
+{
+        begin_critical_section(S_NTTLIST);
+       DeleteHash(&nttlist);
+        end_critical_section(S_NTTLIST);
+}
+
+
+
+void network_logout_hook(void)
+{
+       CitContext *CCC = MyContext();
+
+       /*
+        * If we were talking to a network node, we're not anymore...
+        */
+       if (!IsEmptyStr(CCC->net_node)) {
+               network_talking_to(CCC->net_node, strlen(CCC->net_node), NTT_REMOVE);
+       }
+}
 
 /*
  * Module entry point
  */
+void SetNTTDebugEnabled(const int n)
+{
+       NTTDebugEnabled = n;
+}
+
 CTDL_MODULE_INIT(network)
 {
        if (!threading)
        {
+               CtdlRegisterDebugFlagHook(HKEY("networktalkingto"), SetNTTDebugEnabled, &NTTDebugEnabled);
+               CtdlRegisterCleanupHook(cleanup_nttlist);
+                CtdlRegisterSessionHook(network_logout_hook, EVT_LOGOUT);
                CtdlRegisterProtoHook(cmd_nsyn, "NSYN", "Synchronize room to node");
                CtdlRegisterRoomHook(network_room_handler);
                CtdlRegisterCleanupHook(destroy_network_queue_room_locked);
index 549959079c1b5bf8ff69a86a2a7521d267ee1429..d0cba74effc3bab1d75301071fa56abdc777a222 100644 (file)
@@ -17,3 +17,13 @@ void network_queue_room(struct ctdlroom *, void *);
 void network_bounce(struct CtdlMessage *msg, char *reason);
 int network_usetable(struct CtdlMessage *msg);
 
+int network_talking_to(const char *nodename, long len, int operation);
+
+/*
+ * Operations that can be performed by network_talking_to()
+ */
+enum {
+        NTT_ADD,
+        NTT_REMOVE,
+        NTT_CHECK
+};
index 7f72befa7f12abe00aca67c8d403d5772c4c2fcc..2ca3b4220ddfb43c754da98643c37ccbbeacc047 100644 (file)
@@ -799,13 +799,6 @@ void CtdlUserLogout(void)
                abort_upl(CCC);
        }
 
-       /*
-        * If we were talking to a network node, we're not anymore...
-        */
-       if (!IsEmptyStr(CCC->net_node)) {
-               network_talking_to(CCC->net_node, strlen(CCC->net_node), NTT_REMOVE);
-       }
-
        /* Run any hooks registered by modules... */
        PerformSessionHooks(EVT_LOGOUT);