From: Jaroslav Kysela Date: Fri, 24 Feb 2017 19:24:52 +0000 (+0100) Subject: tasklet: relpace tsk_allocated with tsk_free, fixes #2972 X-Git-Tag: v4.2.1~99 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=b71fbc27d809a0cfb898d71ee7df7b2b89107684;p=thirdparty%2Ftvheadend.git tasklet: relpace tsk_allocated with tsk_free, fixes #2972 --- diff --git a/src/main.c b/src/main.c index f6c9af4d9..7c2aac2a1 100644 --- a/src/main.c +++ b/src/main.c @@ -370,7 +370,7 @@ tasklet_arm_alloc(tsk_callback_t *callback, void *opaque) tasklet_t *tsk = calloc(1, sizeof(*tsk)); if (tsk) { memoryinfo_alloc(&tasklet_memoryinfo, sizeof(*tsk)); - tsk->tsk_allocated = 1; + tsk->tsk_free = free; tasklet_arm(tsk, callback, opaque); } return tsk; @@ -410,8 +410,7 @@ tasklet_disarm(tasklet_t *tsk) TAILQ_REMOVE(&tasklets, tsk, tsk_link); tsk->tsk_callback(tsk->tsk_opaque, 1); tsk->tsk_callback = NULL; - if (tsk->tsk_allocated) - free(tsk); + if (tsk->tsk_free) tsk->tsk_free(tsk); } pthread_mutex_unlock(&tasklet_lock); @@ -428,9 +427,9 @@ tasklet_flush() TAILQ_REMOVE(&tasklets, tsk, tsk_link); tsk->tsk_callback(tsk->tsk_opaque, 1); tsk->tsk_callback = NULL; - if (tsk->tsk_allocated) { + if (tsk->tsk_free) { memoryinfo_free(&tasklet_memoryinfo, sizeof(*tsk)); - free(tsk); + tsk->tsk_free(tsk); } } @@ -456,14 +455,14 @@ tasklet_thread ( void *aux ) tvh_cond_wait(&tasklet_cond, &tasklet_lock); continue; } - /* the callback might re-initialize tasklet, save everythin */ + /* the callback might re-initialize tasklet, save everything */ TAILQ_REMOVE(&tasklets, tsk, tsk_link); tsk_cb = tsk->tsk_callback; opaque = tsk->tsk_opaque; tsk->tsk_callback = NULL; - if (tsk->tsk_allocated) { + if (tsk->tsk_free) { memoryinfo_free(&tasklet_memoryinfo, sizeof(*tsk)); - free(tsk); + tsk->tsk_free(tsk); } /* now, the callback can be safely called */ if (tsk_cb) { diff --git a/src/tvheadend.h b/src/tvheadend.h index f147a5a19..ec8d8b925 100644 --- a/src/tvheadend.h +++ b/src/tvheadend.h @@ -233,7 +233,7 @@ typedef struct tasklet { TAILQ_ENTRY(tasklet) tsk_link; tsk_callback_t *tsk_callback; void *tsk_opaque; - int tsk_allocated; + void (*tsk_free)(void *); } tasklet_t; tasklet_t *tasklet_arm_alloc(tsk_callback_t *callback, void *opaque);