diff options
author | Sree Harsha Totakura <totakura@in.tum.de> | 2013-09-30 12:55:03 +0000 |
---|---|---|
committer | Sree Harsha Totakura <totakura@in.tum.de> | 2013-09-30 12:55:03 +0000 |
commit | 87ed5554b390cbf16a9bd15c4aec13ab34d7f080 (patch) | |
tree | 57716c8c85d0d8f8e3463f5a1b766f51b4f22405 /src/testbed/gnunet-service-testbed_links.c | |
parent | ec7d72a656a180ecdd25507439add2656d5bcbae (diff) | |
download | gnunet-87ed5554b390cbf16a9bd15c4aec13ab34d7f080.tar.gz gnunet-87ed5554b390cbf16a9bd15c4aec13ab34d7f080.zip |
- fix misc. memleaks
Diffstat (limited to 'src/testbed/gnunet-service-testbed_links.c')
-rw-r--r-- | src/testbed/gnunet-service-testbed_links.c | 117 |
1 files changed, 78 insertions, 39 deletions
diff --git a/src/testbed/gnunet-service-testbed_links.c b/src/testbed/gnunet-service-testbed_links.c index d34d0c040..85a4538ef 100644 --- a/src/testbed/gnunet-service-testbed_links.c +++ b/src/testbed/gnunet-service-testbed_links.c | |||
@@ -420,51 +420,78 @@ reghost_free_iterator (void *cls, const struct GNUNET_HashCode *key, | |||
420 | 420 | ||
421 | 421 | ||
422 | /** | 422 | /** |
423 | * Kill a #Slave object | ||
424 | * | ||
425 | * @param slave the #Slave object | ||
426 | */ | ||
427 | static void | ||
428 | kill_slave (struct Slave *slave) | ||
429 | { | ||
430 | struct HostRegistration *hr_entry; | ||
431 | |||
432 | while (NULL != (hr_entry = slave->hr_dll_head)) | ||
433 | { | ||
434 | GNUNET_CONTAINER_DLL_remove (slave->hr_dll_head, slave->hr_dll_tail, | ||
435 | hr_entry); | ||
436 | GNUNET_free (hr_entry); | ||
437 | } | ||
438 | if (NULL != slave->rhandle) | ||
439 | GNUNET_TESTBED_cancel_registration (slave->rhandle); | ||
440 | GNUNET_assert (GNUNET_SYSERR != | ||
441 | GNUNET_CONTAINER_multihashmap_iterate (slave->reghost_map, | ||
442 | reghost_free_iterator, | ||
443 | slave)); | ||
444 | GNUNET_CONTAINER_multihashmap_destroy (slave->reghost_map); | ||
445 | if (NULL != slave->controller) | ||
446 | GNUNET_TESTBED_controller_disconnect (slave->controller); | ||
447 | if (NULL != slave->controller_proc) | ||
448 | { | ||
449 | LOG_DEBUG ("Stopping a slave\n"); | ||
450 | GNUNET_TESTBED_controller_kill_ (slave->controller_proc); | ||
451 | } | ||
452 | } | ||
453 | |||
454 | |||
455 | /** | ||
456 | * Destroy a #Slave object | ||
457 | * | ||
458 | * @param slave the #Slave object | ||
459 | */ | ||
460 | static void | ||
461 | destroy_slave (struct Slave *slave) | ||
462 | { | ||
463 | if (NULL != slave->controller_proc) | ||
464 | { | ||
465 | GNUNET_TESTBED_controller_destroy_ (slave->controller_proc); | ||
466 | LOG_DEBUG ("Slave stopped\n"); | ||
467 | } | ||
468 | GST_slave_list[slave->host_id] = NULL; | ||
469 | GNUNET_free (slave); | ||
470 | } | ||
471 | |||
472 | |||
473 | /** | ||
423 | * Cleans up the slave list | 474 | * Cleans up the slave list |
424 | */ | 475 | */ |
425 | void | 476 | void |
426 | GST_slave_list_clear () | 477 | GST_slave_list_clear () |
427 | { | 478 | { |
428 | struct HostRegistration *hr_entry; | 479 | struct Slave *slave; |
429 | struct GNUNET_TESTBED_ControllerProc *cproc; | ||
430 | unsigned int id; | 480 | unsigned int id; |
431 | 481 | ||
432 | for (id = 0; id < GST_slave_list_size; id++) | 482 | for (id = 0; id < GST_slave_list_size; id++) |
433 | { | 483 | { |
434 | if (NULL == GST_slave_list[id]) | 484 | slave = GST_slave_list[id]; |
485 | if (NULL == slave) | ||
435 | continue; | 486 | continue; |
436 | while (NULL != (hr_entry = GST_slave_list[id]->hr_dll_head)) | 487 | kill_slave (slave); |
437 | { | ||
438 | GNUNET_CONTAINER_DLL_remove (GST_slave_list[id]->hr_dll_head, | ||
439 | GST_slave_list[id]->hr_dll_tail, hr_entry); | ||
440 | GNUNET_free (hr_entry); | ||
441 | } | ||
442 | if (NULL != GST_slave_list[id]->rhandle) | ||
443 | GNUNET_TESTBED_cancel_registration (GST_slave_list[id]->rhandle); | ||
444 | (void) | ||
445 | GNUNET_CONTAINER_multihashmap_iterate (GST_slave_list | ||
446 | [id]->reghost_map, | ||
447 | reghost_free_iterator, | ||
448 | GST_slave_list[id]); | ||
449 | GNUNET_CONTAINER_multihashmap_destroy (GST_slave_list[id]->reghost_map); | ||
450 | if (NULL != GST_slave_list[id]->controller) | ||
451 | GNUNET_TESTBED_controller_disconnect (GST_slave_list[id]->controller); | ||
452 | if (NULL != (cproc = GST_slave_list[id]->controller_proc)) | ||
453 | { | ||
454 | LOG_DEBUG ("Stopping a slave\n"); | ||
455 | GNUNET_TESTBED_controller_kill_ (cproc); | ||
456 | } | ||
457 | } | 488 | } |
458 | for (id = 0; id < GST_slave_list_size; id++) | 489 | for (id = 0; id < GST_slave_list_size; id++) |
459 | { | 490 | { |
460 | if (NULL == GST_slave_list[id]) | 491 | slave = GST_slave_list[id]; |
492 | if (NULL == slave) | ||
461 | continue; | 493 | continue; |
462 | if (NULL != (cproc = GST_slave_list[id]->controller_proc)) | 494 | destroy_slave (slave); |
463 | { | ||
464 | GNUNET_TESTBED_controller_destroy_ (cproc); | ||
465 | LOG_DEBUG ("Slave stopped\n"); | ||
466 | } | ||
467 | GNUNET_free (GST_slave_list[id]); | ||
468 | } | 495 | } |
469 | GNUNET_free_non_null (GST_slave_list); | 496 | GNUNET_free_non_null (GST_slave_list); |
470 | GST_slave_list = NULL; | 497 | GST_slave_list = NULL; |
@@ -723,6 +750,8 @@ slave_event_cb (void *cls, const struct GNUNET_TESTBED_EventInformation *event) | |||
723 | GNUNET_assert (GNUNET_TESTBED_ET_OPERATION_FINISHED == event->type); | 750 | GNUNET_assert (GNUNET_TESTBED_ET_OPERATION_FINISHED == event->type); |
724 | lcf = event->op_cls; | 751 | lcf = event->op_cls; |
725 | GNUNET_assert (lcf->op == event->op); | 752 | GNUNET_assert (lcf->op == event->op); |
753 | GNUNET_TESTBED_operation_done (lcf->op); | ||
754 | lcf->op = NULL; | ||
726 | GNUNET_assert (FINISHED == lcf->state); | 755 | GNUNET_assert (FINISHED == lcf->state); |
727 | GNUNET_assert (GNUNET_SCHEDULER_NO_TASK != lcf->timeout_task); | 756 | GNUNET_assert (GNUNET_SCHEDULER_NO_TASK != lcf->timeout_task); |
728 | GNUNET_SCHEDULER_cancel (lcf->timeout_task); | 757 | GNUNET_SCHEDULER_cancel (lcf->timeout_task); |
@@ -761,8 +790,13 @@ slave_status_cb (void *cls, const struct GNUNET_CONFIGURATION_Handle *cfg, | |||
761 | if (GNUNET_SYSERR == status) | 790 | if (GNUNET_SYSERR == status) |
762 | { | 791 | { |
763 | slave->controller_proc = NULL; | 792 | slave->controller_proc = NULL; |
764 | GST_slave_list[slave->host_id] = NULL; | 793 | /* Stop all link controller forwarding tasks since we shutdown here anyway |
765 | GNUNET_free (slave); | 794 | and as these tasks they depend on the operation queues which are created |
795 | through GNUNET_TESTBED_controller_connect() and in kill_slave() we call | ||
796 | the destructor function GNUNET_TESTBED_controller_disconnect() */ | ||
797 | GST_free_lcfq (); | ||
798 | kill_slave (slave); | ||
799 | destroy_slave (slave); | ||
766 | slave = NULL; | 800 | slave = NULL; |
767 | LOG (GNUNET_ERROR_TYPE_WARNING, "Unexpected slave shutdown\n"); | 801 | LOG (GNUNET_ERROR_TYPE_WARNING, "Unexpected slave shutdown\n"); |
768 | GNUNET_SCHEDULER_shutdown (); /* We too shutdown */ | 802 | GNUNET_SCHEDULER_shutdown (); /* We too shutdown */ |
@@ -780,13 +814,12 @@ slave_status_cb (void *cls, const struct GNUNET_CONFIGURATION_Handle *cfg, | |||
780 | { | 814 | { |
781 | send_controller_link_response (lcc->client, lcc->operation_id, NULL, | 815 | send_controller_link_response (lcc->client, lcc->operation_id, NULL, |
782 | "Could not connect to delegated controller"); | 816 | "Could not connect to delegated controller"); |
783 | GNUNET_TESTBED_controller_stop (slave->controller_proc); | 817 | kill_slave (slave); |
784 | GST_slave_list[slave->host_id] = NULL; | 818 | destroy_slave (slave); |
785 | GNUNET_free (slave); | ||
786 | slave = NULL; | 819 | slave = NULL; |
787 | } | 820 | } |
788 | 821 | ||
789 | clean_lcc: | 822 | clean_lcc: |
790 | if (NULL != lcc) | 823 | if (NULL != lcc) |
791 | { | 824 | { |
792 | if (NULL != lcc->client) | 825 | if (NULL != lcc->client) |
@@ -1317,6 +1350,7 @@ void | |||
1317 | GST_free_lcfq () | 1350 | GST_free_lcfq () |
1318 | { | 1351 | { |
1319 | struct LCFContextQueue *lcfq; | 1352 | struct LCFContextQueue *lcfq; |
1353 | struct LCFContext *lcf; | ||
1320 | 1354 | ||
1321 | if (NULL != lcfq_head) | 1355 | if (NULL != lcfq_head) |
1322 | { | 1356 | { |
@@ -1329,8 +1363,13 @@ GST_free_lcfq () | |||
1329 | GNUNET_assert (GNUNET_SCHEDULER_NO_TASK == lcf_proc_task_id); | 1363 | GNUNET_assert (GNUNET_SCHEDULER_NO_TASK == lcf_proc_task_id); |
1330 | for (lcfq = lcfq_head; NULL != lcfq; lcfq = lcfq_head) | 1364 | for (lcfq = lcfq_head; NULL != lcfq; lcfq = lcfq_head) |
1331 | { | 1365 | { |
1332 | GNUNET_SERVER_client_drop (lcfq->lcf->client); | 1366 | lcf = lcfq->lcf; |
1333 | GNUNET_free (lcfq->lcf); | 1367 | GNUNET_SERVER_client_drop (lcf->client); |
1368 | if (NULL != lcf->op) | ||
1369 | GNUNET_TESTBED_operation_done (lcf->op); | ||
1370 | if (GNUNET_SCHEDULER_NO_TASK != lcf->timeout_task) | ||
1371 | GNUNET_SCHEDULER_cancel (lcf->timeout_task); | ||
1372 | GNUNET_free (lcf); | ||
1334 | GNUNET_CONTAINER_DLL_remove (lcfq_head, lcfq_tail, lcfq); | 1373 | GNUNET_CONTAINER_DLL_remove (lcfq_head, lcfq_tail, lcfq); |
1335 | GNUNET_free (lcfq); | 1374 | GNUNET_free (lcfq); |
1336 | } | 1375 | } |