X-Git-Url: https://code.citadel.org/?p=citadel.git;a=blobdiff_plain;f=citadel%2Fmodules%2Fnetwork%2Fserv_network.c;fp=citadel%2Fmodules%2Fnetwork%2Fserv_network.c;h=7ac84729c331241d482c5d63b5232a30c6be600d;hp=dc61feb47a93b4c60c20b9a589d1e6af5018cb20;hb=9caef44a2f42ab81b2489ae19859f1bbc25d4430;hpb=00514372bc3bd09268a8f6764fe5d7b50fce0c41 diff --git a/citadel/modules/network/serv_network.c b/citadel/modules/network/serv_network.c index dc61feb47..7ac84729c 100644 --- a/citadel/modules/network/serv_network.c +++ b/citadel/modules/network/serv_network.c @@ -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);