fixed compilation erros
[public/netxms.git] / src / server / core / debug.cpp
CommitLineData
5039dede
AK
1/*
2** NetXMS - Network Management System
3** Copyright (C) 2003, 2004, 2005, 2006 Victor Kirhenshtein
4**
5** This program is free software; you can redistribute it and/or modify
6** it under the terms of the GNU General Public License as published by
7** the Free Software Foundation; either version 2 of the License, or
8** (at your option) any later version.
9**
10** This program is distributed in the hope that it will be useful,
11** but WITHOUT ANY WARRANTY; without even the implied warranty of
12** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13** GNU General Public License for more details.
14**
15** You should have received a copy of the GNU General Public License
16** along with this program; if not, write to the Free Software
17** Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
18**
19** File: debug.cpp
20**
21**/
22
23#include "nxcore.h"
24
25#ifdef _WIN32
26#include <dbghelp.h>
27#endif
28
29
30//
31// Test mutex state and print to stdout
32//
33
34void DbgTestMutex(MUTEX hMutex, const TCHAR *szName, CONSOLE_CTX pCtx)
35{
36 ConsolePrintf(pCtx, _T(" %s: "), szName);
37 if (MutexLock(hMutex, 100))
38 {
39 ConsolePrintf(pCtx, _T("unlocked\n"));
40 MutexUnlock(hMutex);
41 }
42 else
43 {
44 ConsolePrintf(pCtx, _T("locked\n"));
45 }
46}
47
48
49//
50// Test read/write lock state and print to stdout
51//
52
53void DbgTestRWLock(RWLOCK hLock, const TCHAR *szName, CONSOLE_CTX pCtx)
54{
55 ConsolePrintf(pCtx, _T(" %s: "), szName);
56 if (RWLockWriteLock(hLock, 100))
57 {
58 ConsolePrintf(pCtx, _T("unlocked\n"));
59 RWLockUnlock(hLock);
60 }
61 else
62 {
63 if (RWLockReadLock(hLock, 100))
64 {
65 ConsolePrintf(pCtx, _T("locked for reading\n"));
66 RWLockUnlock(hLock);
67 }
68 else
69 {
70 ConsolePrintf(pCtx, _T("locked for writing\n"));
71 }
72 }
73}
74
75
76//
77// Print message to console, either local or remote
78//
79
35f836fe 80void ConsolePrintf(CONSOLE_CTX pCtx, const TCHAR *pszFormat, ...)
5039dede
AK
81{
82 va_list args;
83
84 va_start(args, pszFormat);
85 if (pCtx->hSocket == -1)
86 {
35f836fe 87 _vtprintf(pszFormat, args);
5039dede
AK
88 }
89 else
90 {
91 CSCP_MESSAGE *pRawMsg;
92 TCHAR szBuffer[8192];
93
94 _vsntprintf(szBuffer, 8191, pszFormat, args);
95 szBuffer[8191] = 0;
96 pCtx->pMsg->SetVariable(VID_MESSAGE, szBuffer);
97 pRawMsg = pCtx->pMsg->CreateMessage();
98 SendEx(pCtx->hSocket, pRawMsg, ntohl(pRawMsg->dwSize), 0);
99 free(pRawMsg);
100 }
101 va_end(args);
102}
103
104
105//
106// Show server statistics
107//
108
109void ShowServerStats(CONSOLE_CTX pCtx)
110{
111 DWORD i, dwNumItems;
112
113 RWLockReadLock(g_rwlockNodeIndex, INFINITE);
114 for(i = 0, dwNumItems = 0; i < g_dwNodeAddrIndexSize; i++)
7c521895 115 dwNumItems += ((Node *)g_pNodeIndexByAddr[i].pObject)->getItemCount();
5039dede
AK
116 RWLockUnlock(g_rwlockNodeIndex);
117
35f836fe
VK
118 ConsolePrintf(pCtx, _T("Total number of objects: %d\n")
119 _T("Number of monitored nodes: %d\n")
120 _T("Number of collectable DCIs: %d\n\n"),
5039dede
AK
121 g_dwIdIndexSize, g_dwNodeAddrIndexSize, dwNumItems);
122}
123
124
125//
126// Show queue stats
127//
128
35f836fe 129void ShowQueueStats(CONSOLE_CTX pCtx, Queue *pQueue, const TCHAR *pszName)
5039dede
AK
130{
131 if (pQueue != NULL)
35f836fe 132 ConsolePrintf(pCtx, _T("%-32s : %d\n"), pszName, pQueue->Size());
5039dede
AK
133}
134
135
136//
137// Write process coredump
138//
139
140#ifdef _WIN32
141
142void DumpProcess(CONSOLE_CTX pCtx)
143{
35f836fe 144 STARTUPINFOA si;
5039dede 145 PROCESS_INFORMATION pi;
35f836fe 146 char cmdLine[64];
5039dede 147
35f836fe 148 ConsolePrintf(pCtx, _T("Dumping process to disk...\n"));
5039dede
AK
149
150 sprintf(cmdLine, "netxmsd.exe --dump %d", GetCurrentProcessId());
151 memset(&si, 0, sizeof(STARTUPINFO));
152 si.cb = sizeof(STARTUPINFO);
35f836fe
VK
153 if (CreateProcessA(NULL, cmdLine, NULL, NULL, FALSE,
154 (g_dwFlags & AF_DAEMON) ? CREATE_NO_WINDOW : 0, NULL, NULL, &si, &pi))
5039dede
AK
155 {
156 WaitForSingleObject(pi.hProcess, INFINITE);
157 CloseHandle(pi.hThread);
158 CloseHandle(pi.hProcess);
159
35f836fe 160 ConsolePrintf(pCtx, _T("Done.\n"));
5039dede
AK
161 }
162 else
163 {
35f836fe
VK
164 TCHAR buffer[256];
165 ConsolePrintf(pCtx, _T("Dump error: CreateProcess() failed (%s)\n"), GetSystemErrorText(GetLastError(), buffer, 256));
5039dede
AK
166 }
167}
168
169#else
170
171void DumpProcess(CONSOLE_CTX pCtx)
172{
173 ConsolePrintf(pCtx, "DUMP command is not supported for current operating system\n");
174}
175
176#endif