@@ -39,6 +39,7 @@ static bool flag_log_rotate = false;
39
39
static bool flag_db_backup = false;
40
40
#endif
41
41
static bool flag_tree_print = false;
42
+ static bool flag_xtreport = false;
42
43
43
44
static void handle_signal (int signal )
44
45
{
@@ -59,6 +60,7 @@ static void handle_signal(int signal)
59
60
#ifdef SIGUSR2
60
61
}else if (signal == SIGUSR2 ){
61
62
flag_tree_print = true;
63
+ flag_xtreport = true;
62
64
#endif
63
65
#ifdef SIGRTMIN
64
66
}else if (signal == SIGRTMIN ){
@@ -122,43 +124,57 @@ void signal__flag_check(void)
122
124
sub__tree_print (db .normal_subs , 0 );
123
125
sub__tree_print (db .shared_subs , 0 );
124
126
flag_tree_print = false;
127
+ }
125
128
#ifdef WITH_XTREPORT
129
+ if (flag_xtreport ){
126
130
xtreport ();
127
- #endif
131
+ flag_xtreport = false;
128
132
}
133
+ #endif
129
134
}
130
135
131
136
/*
132
137
*
133
138
* Signalling mosquitto process on Win32.
134
139
*
135
- * On Windows we we can use named events to pass signals to the mosquitto process.
140
+ * On Windows we can use named events to pass signals to the mosquitto process.
136
141
* List of events :
137
142
*
138
143
* mosqPID_shutdown
139
144
* mosqPID_reload
140
145
* mosqPID_backup
146
+ * mosqPID_log_rotate
147
+ * mosqPID_tree_print
148
+ * mosqPID_xtreport
141
149
*
142
150
* (where PID is the PID of the mosquitto process).
143
151
*/
144
152
#ifdef WIN32
153
+
154
+ #define MOSQ_MAX_EVTS 6
145
155
DWORD WINAPI SigThreadProc (void * data )
146
156
{
147
157
TCHAR evt_name [MAX_PATH ];
148
- static HANDLE evt [3 ];
158
+ static HANDLE evt [MOSQ_MAX_EVTS ];
149
159
int pid = GetCurrentProcessId ();
160
+ const char * evt_names [MOSQ_MAX_EVTS ] = {
161
+ "shutdown" ,
162
+ "reload" ,
163
+ "backup" ,
164
+ "log_rotate" ,
165
+ "tree_print" ,
166
+ "xtreport"
167
+ };
150
168
151
169
UNUSED (data );
152
170
153
- sprintf_s (evt_name , MAX_PATH , "mosq%d_shutdown" , pid );
154
- evt [0 ] = CreateEvent (NULL , TRUE, FALSE, evt_name );
155
- sprintf_s (evt_name , MAX_PATH , "mosq%d_reload" , pid );
156
- evt [1 ] = CreateEvent (NULL , FALSE, FALSE, evt_name );
157
- sprintf_s (evt_name , MAX_PATH , "mosq%d_backup" , pid );
158
- evt [2 ] = CreateEvent (NULL , FALSE, FALSE, evt_name );
171
+ for (int i = 0 ; i < MOSQ_MAX_EVTS ; i ++ ){
172
+ sprintf_s (evt_name , MAX_PATH , "mosq%d_%s" , pid , evt_names [i ]);
173
+ evt [i ] = CreateEvent (NULL , TRUE, FALSE, evt_name );
174
+ }
159
175
160
176
while (g_run ) {
161
- int wr = WaitForMultipleObjects (sizeof ( evt ) / sizeof ( HANDLE ) , evt , FALSE, INFINITE );
177
+ int wr = WaitForMultipleObjects (MOSQ_MAX_EVTS , evt , FALSE, INFINITE );
162
178
switch (wr ) {
163
179
case WAIT_OBJECT_0 + 0 :
164
180
handle_signal (SIGINT );
@@ -172,11 +188,21 @@ DWORD WINAPI SigThreadProc(void* data)
172
188
#endif
173
189
continue ;
174
190
break ;
191
+ case WAIT_OBJECT_0 + 3 :
192
+ flag_log_rotate = true;
193
+ continue ;
194
+ case WAIT_OBJECT_0 + 4 :
195
+ flag_tree_print = true;
196
+ continue ;
197
+ case WAIT_OBJECT_0 + 5 :
198
+ flag_xtreport = true;
199
+ continue ;
175
200
}
176
201
}
177
- CloseHandle ( evt [ 0 ]);
178
- if (evt [1 ]) CloseHandle (evt [1 ]);
179
- if ( evt [ 2 ]) CloseHandle ( evt [ 2 ]);
202
+ for ( int i = 0 ; i < MOSQ_MAX_EVTS ; i ++ ){
203
+ if (evt [i ]) CloseHandle (evt [i ]);
204
+ }
180
205
return 0 ;
181
206
}
207
+ #undef MOSQ_MAX_EVTS
182
208
#endif
0 commit comments