diff options
Diffstat (limited to 'src/dumm/dumm.c')
-rw-r--r-- | src/dumm/dumm.c | 18 |
1 files changed, 18 insertions, 0 deletions
diff --git a/src/dumm/dumm.c b/src/dumm/dumm.c index b8f0e0f2c..6432e74a7 100644 --- a/src/dumm/dumm.c +++ b/src/dumm/dumm.c @@ -24,6 +24,7 @@ typedef struct private_dumm_t private_dumm_t; struct private_dumm_t { dumm_t public; linked_list_t *guests; + bool destroying; }; static guest_t* create_guest(private_dumm_t *this, char *name, char *master, int mem) @@ -48,6 +49,11 @@ static iterator_t* create_guest_iterator(private_dumm_t *this) */ static void sigchild_handler(private_dumm_t *this, siginfo_t *info) { + if (this->destroying) + { + return; + } + switch (info->si_code) { case CLD_EXITED: @@ -77,6 +83,17 @@ static void sigchild_handler(private_dumm_t *this, siginfo_t *info) static void destroy(private_dumm_t *this) { + iterator_t *iterator; + guest_t *guest; + + iterator = this->guests->create_iterator(this->guests, TRUE); + while (iterator->iterate(iterator, (void**)&guest)) + { + guest->stop(guest); + } + iterator->destroy(iterator); + + this->destroying = TRUE; this->guests->destroy_offset(this->guests, offsetof(guest_t, destroy)); free(this); } @@ -110,6 +127,7 @@ dumm_t *dumm_create() return NULL; } + this->destroying = FALSE; this->guests = linked_list_create(); return &this->public; } |