aboutsummaryrefslogtreecommitdiff
path: root/src/testbed/gnunet-service-testbed_links.c
diff options
context:
space:
mode:
authorSree Harsha Totakura <totakura@in.tum.de>2013-09-30 12:55:03 +0000
committerSree Harsha Totakura <totakura@in.tum.de>2013-09-30 12:55:03 +0000
commit87ed5554b390cbf16a9bd15c4aec13ab34d7f080 (patch)
tree57716c8c85d0d8f8e3463f5a1b766f51b4f22405 /src/testbed/gnunet-service-testbed_links.c
parentec7d72a656a180ecdd25507439add2656d5bcbae (diff)
downloadgnunet-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.c117
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 */
427static void
428kill_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 */
460static void
461destroy_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 */
425void 476void
426GST_slave_list_clear () 477GST_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
789clean_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
1317GST_free_lcfq () 1350GST_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 }