+ conditions should work
[public/netxms.git] / src / server / core / dbwrite.cpp
1 /*
2 ** NetXMS - Network Management System
3 ** Copyright (C) 2003, 2004 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 ** $module: hk.cpp
20 **
21 **/
22
23 #include "nms_core.h"
24
25
26 //
27 // Global variables
28 //
29
30 Queue *g_pLazyRequestQueue = NULL;
31
32
33 //
34 // Static data
35 //
36
37 static CONDITION m_hCondWriteThreadFinished = NULL;
38
39
40 //
41 // Put SQL request into queue for later execution
42 //
43
44 void QueueSQLRequest(char *szQuery)
45 {
46 g_pLazyRequestQueue->Put(strdup(szQuery));
47 }
48
49
50 //
51 // Database "lazy" write thread
52 //
53
54 void DBWriteThread(void *pArg)
55 {
56 char *pQuery;
57
58 m_hCondWriteThreadFinished = ConditionCreate(FALSE);
59 while(1)
60 {
61 pQuery = (char *)g_pLazyRequestQueue->GetOrBlock();
62 if (pQuery == INVALID_POINTER_VALUE) // End-of-job indicator
63 break;
64
65 DBQuery(g_hCoreDB, pQuery);
66 free(pQuery);
67 }
68 ConditionSet(m_hCondWriteThreadFinished);
69 }
70
71
72 //
73 // Stop writer thread and wait while all queries will be executed
74 //
75
76 void StopDBWriter(void)
77 {
78 g_pLazyRequestQueue->Put(INVALID_POINTER_VALUE);
79 if (m_hCondWriteThreadFinished != NULL)
80 {
81 ConditionWait(m_hCondWriteThreadFinished, INFINITE);
82 ConditionDestroy(m_hCondWriteThreadFinished);
83 }
84 }