Correct agent shutdown procedure implemented under NetWare
authorVictor Kirhenshtein <victor@netxms.org>
Fri, 23 Sep 2005 21:58:44 +0000 (21:58 +0000)
committerVictor Kirhenshtein <victor@netxms.org>
Fri, 23 Sep 2005 21:58:44 +0000 (21:58 +0000)
TODO
src/agent/core/nxagentd.cpp
src/agent/core/subagent.cpp
src/agent/subagents/netware/netware.cpp
src/agent/subagents/netware/netware.def
src/agent/subagents/ping/ping.cpp
src/agent/subagents/ping/ping.def
src/libnetxms/netxms.def

diff --git a/TODO b/TODO
index b2511de..b4b40a7 100644 (file)
--- a/TODO
+++ b/TODO
@@ -17,7 +17,6 @@ GENERAL:
   event configuration to allow sending of new events
 - Planned outages (maintenance schedule)
 - Maintenance mode for nodes
-- Possibility to tune ICMP packet size on server and ping subagent
 
 
 SERVER:
@@ -41,12 +40,6 @@ SERVER:
 - Add support for 64 bit counters to libnxsnmp
 
 
-CORE AGENT:
-
-- Check shutdown procedure on different platforms
-- Remote config editing
-
-
 LINUX AGENT:
 
 - Return correct interface type in Net.InterfaceList
index daea9f4..df52880 100644 (file)
@@ -992,6 +992,8 @@ int main(int argc, char *argv[])
          break;
    }
 
+char buf[128];
+gets(buf);
 #ifdef _NETWARE
    if ((iExitCode != 0) || (iAction == ACTION_NONE) || 
        (iAction == ACTION_CHECK_CONFIG))
index dfa1be7..3c4cc87 100644 (file)
@@ -24,6 +24,7 @@
 
 #ifdef _NETWARE
 #include <fsio.h>
+#include <library.h>
 #endif
 
 
@@ -153,6 +154,8 @@ BOOL LoadSubAgent(char *szModuleName)
       {
 #ifdef _NETWARE
          bSuccess = InitSubAgent(hModule, szModuleName, SubAgentInit, szEntryPoint);
+         if (bSuccess)
+            setdontunloadflag(hModule);
 #else
          bSuccess = InitSubAgent(hModule, szModuleName, SubAgentInit, NULL);
 #endif
@@ -185,11 +188,13 @@ void UnloadAllSubAgents(void)
 
    for(i = 0; i < m_dwNumSubAgents; i++)
    {
-      if (m_pSubAgentList[i].pInfo->pUnloadHandler != NULL)
-         m_pSubAgentList[i].pInfo->pUnloadHandler();
 #ifdef _NETWARE
       UnImportPublicObject(m_pSubAgentList[i].hModule, m_pSubAgentList[i].szEntryPoint);
-#else
+      cleardontunloadflag(m_pSubAgentList[i].hModule);
+#endif
+      if (m_pSubAgentList[i].pInfo->pUnloadHandler != NULL)
+         m_pSubAgentList[i].pInfo->pUnloadHandler();
+#ifndef _NETWARE
       DLClose(m_pSubAgentList[i].hModule);
 #endif
    }
index cd01a4d..f4761b1 100644 (file)
@@ -27,6 +27,9 @@
 // Static data
 //
 
+static CONDITION m_hCondShutdown = INVALID_CONDITION_HANDLE;
+static CONDITION m_hCondTerminate = INVALID_CONDITION_HANDLE;
+static THREAD m_hCollectorThread = INVALID_THREAD_HANDLE;
 static int m_iCpuUtilHistory[MAX_CPU][CPU_HISTORY_SIZE];
 static int m_iCpuHPos = 0;
 
@@ -200,7 +203,8 @@ static THREAD_RESULT THREAD_CALL CollectorThread(void *pArg)
    while(1)
    {
       // Sleep one second
-      ThreadSleep(1);
+      if (ConditionWait(m_hCondShutdown, 1000))
+         break;
 
       // CPU utilization
       iNumCpu = NXGetCpuCount();
@@ -225,6 +229,21 @@ static THREAD_RESULT THREAD_CALL CollectorThread(void *pArg)
 
 
 //
+// Called by master agent at unload
+//
+
+static void UnloadHandler(void)
+{
+   if (m_hCondShutdown != INVALID_CONDITION_HANDLE)
+      ConditionSet(m_hCondShutdown);
+   ThreadJoin(m_hCollectorThread);
+
+   // Notify main thread that NLM can exit
+   ConditionSet(m_hCondTerminate);
+}
+
+
+//
 // Subagent information
 //
 
@@ -256,7 +275,7 @@ static NETXMS_SUBAGENT_INFO m_info =
    NETXMS_SUBAGENT_INFO_MAGIC,
    "NETWARE", 
    NETXMS_VERSION_STRING,
-   NULL, NULL,
+   UnloadHandler, NULL,
    sizeof(m_parameters) / sizeof(NETXMS_SUBAGENT_PARAM),
    m_parameters,
    sizeof(m_enums) / sizeof(NETXMS_SUBAGENT_ENUM),
@@ -278,22 +297,23 @@ extern "C" BOOL NxSubAgentInit_NETWARE(NETXMS_SUBAGENT_INFO **ppInfo, TCHAR *psz
    memset(m_iCpuUtilHistory, 0, sizeof(int) * CPU_HISTORY_SIZE * MAX_CPU);
 
    // Start collecto thread
-   ThreadCreate(CollectorThread, 0, NULL);
+   m_hCollectorThread = ThreadCreateEx(CollectorThread, 0, NULL);
 
    return TRUE;
 }
 
 
 //
-// NetWare library entry point
+// NetWare entry point
+// We use main() instead of _init() and _fini() to implement
+// automatic unload of the subagent after unload handler is called
 //
 
-int _init(void)
-{
-   return 0;
-}
-
-int _fini(void)
+int main(int argc, char *argv[])
 {
+   m_hCondTerminate = ConditionCreate(TRUE);
+   ConditionWait(m_hCondTerminate, INFINITE);
+   ConditionDestroy(m_hCondTerminate);
+   sleep(1);
    return 0;
 }
index feb5373..bc252a7 100644 (file)
@@ -21,7 +21,7 @@ OUTPUT netware.nsm
 TYPE 0
 VERSION 0,2,6
 COPYRIGHT "Copyright (c) 2004, 2005 NetXMS Team"
-DESCRIPTION "NetXMS NetWare Subagent"
+DESCRIPTION "NetXMS NetWare Platform Subagent"
 SCREENNAME "System Console"
 
 MODULE LIBC, NETXMS
index 17d958f..8fb165a 100644 (file)
@@ -34,6 +34,9 @@
 //
 
 static CONDITION m_hCondShutdown = INVALID_CONDITION_HANDLE;
+#ifdef _NETWARE
+static CONDITION m_hCondTerminate = INVALID_CONDITION_HANDLE;
+#endif
 static BOOL m_bShutdown = FALSE;
 static DWORD m_dwNumTargets = 0;
 static PING_TARGET *m_pTargetList = NULL;
@@ -194,6 +197,11 @@ static void UnloadHandler(void)
    for(i = 0; i < m_dwNumTargets; i++)
       ThreadJoin(m_pTargetList[i].hThread);
    safe_free(m_pTargetList);
+
+#ifdef _NETWARE
+   // Notify main thread that NLM can exit
+   ConditionSet(m_hCondTerminate);
+#endif
 }
 
 
@@ -354,18 +362,19 @@ BOOL WINAPI DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID lpReserved)
 
 
 //
-// NetWare library entry point
+// NetWare entry point
+// We use main() instead of _init() and _fini() to implement
+// automatic unload of the subagent after unload handler is called
 //
 
 #ifdef _NETWARE
 
-int _init(void)
-{
-   return 0;
-}
-
-int _fini(void)
+int main(int argc, char *argv[])
 {
+   m_hCondTerminate = ConditionCreate(TRUE);
+   ConditionWait(m_hCondTerminate, INFINITE);
+   ConditionDestroy(m_hCondTerminate);
+   sleep(1);
    return 0;
 }
 
index 0bf8152..c89352b 100644 (file)
@@ -23,6 +23,5 @@ VERSION 0,2,6
 COPYRIGHT "Copyright (c) 2004, 2005 NetXMS Team"
 DESCRIPTION "NetXMS PING Subagent"
 SCREENNAME "System Console"
-FLAG_ON 64
 
 MODULE LIBC, NETXMS
index 12a1caf..c89e4bd 100644 (file)
@@ -23,5 +23,6 @@ VERSION 0,2,6
 COPYRIGHT "Copyright (c) 2004, 2005 NetXMS Team"
 DESCRIPTION "NetXMS Foundation Library"
 SCREENNAME "System Console"
+FLAG_ON 64
 
 MODULE LIBC