@@ -150,32 +150,9 @@ void qdr_core_free(qdr_core_t *core)
150
150
core -> router_id = 0 ;
151
151
core -> router_area = 0 ;
152
152
153
- // discard any left over actions
154
-
155
- qdr_action_list_t action_list ;
156
- DEQ_MOVE (core -> action_list , action_list );
157
- DEQ_APPEND (action_list , core -> action_list_background );
158
- qdr_action_t * action = DEQ_HEAD (action_list );
159
- while (action ) {
160
- DEQ_REMOVE_HEAD (action_list );
161
- action -> action_handler (core , action , true);
162
- free_qdr_action_t (action );
163
- action = DEQ_HEAD (action_list );
164
- }
165
-
166
- // Drain the general work lists
167
- qdr_general_handler (core );
168
-
169
153
//
170
154
// Free the core resources
171
155
//
172
- sys_thread_free (core -> thread );
173
- sys_cond_free (core -> action_cond );
174
- sys_mutex_free (core -> action_lock );
175
- sys_mutex_free (core -> work_lock );
176
- sys_mutex_free (core -> id_lock );
177
- qd_timer_free (core -> work_timer );
178
-
179
156
for (int i = 0 ; i <= QD_TREATMENT_LINK_BALANCED ; ++ i ) {
180
157
if (core -> forwarders [i ]) {
181
158
free (core -> forwarders [i ]);
@@ -306,8 +283,25 @@ void qdr_core_free(qdr_core_t *core)
306
283
// at this point all the conn identifiers have been freed
307
284
qd_hash_free (core -> conn_id_hash );
308
285
286
+ // finalize modules while we can still submit new actions
309
287
qdr_modules_finalize (core );
310
288
289
+ // discard any left over actions
290
+
291
+ qdr_action_list_t action_list ;
292
+ DEQ_MOVE (core -> action_list , action_list );
293
+ DEQ_APPEND (action_list , core -> action_list_background );
294
+ qdr_action_t * action = DEQ_HEAD (action_list );
295
+ while (action ) {
296
+ DEQ_REMOVE_HEAD (action_list );
297
+ action -> action_handler (core , action , true);
298
+ free_qdr_action_t (action );
299
+ action = DEQ_HEAD (action_list );
300
+ }
301
+
302
+ // Drain the general work lists
303
+ qdr_general_handler (core );
304
+
311
305
qdr_agent_free (core -> mgmt_agent );
312
306
313
307
if (core -> routers_by_mask_bit ) free (core -> routers_by_mask_bit );
@@ -316,6 +310,13 @@ void qdr_core_free(qdr_core_t *core)
316
310
if (core -> neighbor_free_mask ) qd_bitmask_free (core -> neighbor_free_mask );
317
311
if (core -> rnode_conns_by_mask_bit ) free (core -> rnode_conns_by_mask_bit );
318
312
313
+ sys_thread_free (core -> thread );
314
+ sys_cond_free (core -> action_cond );
315
+ sys_mutex_free (core -> action_lock );
316
+ sys_mutex_free (core -> work_lock );
317
+ sys_mutex_free (core -> id_lock );
318
+ qd_timer_free (core -> work_timer );
319
+
319
320
free (core );
320
321
}
321
322
0 commit comments