diff options
author | Martin Willi <martin@revosec.ch> | 2014-02-11 15:41:49 +0100 |
---|---|---|
committer | Martin Willi <martin@revosec.ch> | 2014-05-07 14:13:34 +0200 |
commit | 874e212f71b86a483445036096b29f0dd81b3ed3 (patch) | |
tree | 34c5e43bfbd58c6e68f6088c8c6afe4f7e1a4463 /src/libstrongswan/processing/processor.c | |
parent | 9e93251397788b73728afcf44372127de7b26332 (diff) | |
download | strongswan-874e212f71b86a483445036096b29f0dd81b3ed3.tar.bz2 strongswan-874e212f71b86a483445036096b29f0dd81b3ed3.tar.xz |
processor: Flush pending jobs during cancel(), not destroy
During shutdown, cancel queued jobs earlier to avoid having cleanup functions
accessing infrastructure not available anymore, for example watcher.
Diffstat (limited to 'src/libstrongswan/processing/processor.c')
-rw-r--r-- | src/libstrongswan/processing/processor.c | 12 |
1 files changed, 11 insertions, 1 deletions
diff --git a/src/libstrongswan/processing/processor.c b/src/libstrongswan/processing/processor.c index 012b169e3..27e5ab5f6 100644 --- a/src/libstrongswan/processing/processor.c +++ b/src/libstrongswan/processing/processor.c @@ -467,6 +467,8 @@ METHOD(processor_t, cancel, void, { enumerator_t *enumerator; worker_thread_t *worker; + job_t *job; + int i; this->mutex->lock(this->mutex); this->desired_threads = 0; @@ -496,6 +498,14 @@ METHOD(processor_t, cancel, void, worker->thread->join(worker->thread); free(worker); } + for (i = 0; i < JOB_PRIO_MAX; i++) + { + while (this->jobs[i]->remove_first(this->jobs[i], + (void**)&job) == SUCCESS) + { + job->destroy(job); + } + } this->mutex->unlock(this->mutex); } @@ -510,7 +520,7 @@ METHOD(processor_t, destroy, void, this->mutex->destroy(this->mutex); for (i = 0; i < JOB_PRIO_MAX; i++) { - this->jobs[i]->destroy_offset(this->jobs[i], offsetof(job_t, destroy)); + this->jobs[i]->destroy(this->jobs[i]); } this->threads->destroy(this->threads); free(this); |