From: Jaroslav Kysela Date: Tue, 8 Mar 2016 12:40:20 +0000 (+0100) Subject: tasklet: do not call tasklet callbacks inside tasklet_lock X-Git-Tag: v4.2.1~937 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=25cb7a503f6c65b504dc4f67e2724adba72a57dd;p=thirdparty%2Ftvheadend.git tasklet: do not call tasklet callbacks inside tasklet_lock --- diff --git a/src/dvr/dvr_vfsmgr.c b/src/dvr/dvr_vfsmgr.c index 54d87bad6..b61b98cd0 100644 --- a/src/dvr/dvr_vfsmgr.c +++ b/src/dvr/dvr_vfsmgr.c @@ -396,8 +396,6 @@ dvr_get_disk_space_update(const char *path, int locked) static void dvr_get_disk_space_tcb(void *opaque, int dearmed) { - pthread_mutex_unlock(&tasklet_lock); - if (!dearmed) { htsmsg_t *m = htsmsg_create_map(); @@ -412,7 +410,6 @@ dvr_get_disk_space_tcb(void *opaque, int dearmed) dvr_disk_space_check(); } - pthread_mutex_lock(&tasklet_lock); free(opaque); } diff --git a/src/main.c b/src/main.c index 75c5add40..3abd1eeb9 100644 --- a/src/main.c +++ b/src/main.c @@ -448,7 +448,7 @@ tasklet_thread ( void *aux ) tvh_cond_wait(&tasklet_cond, &tasklet_lock); continue; } - /* the callback might re-initiaze tasklet, save everythin */ + /* the callback might re-initialize tasklet, save everythin */ TAILQ_REMOVE(&tasklets, tsk, tsk_link); tsk_cb = tsk->tsk_callback; opaque = tsk->tsk_opaque; @@ -456,8 +456,11 @@ tasklet_thread ( void *aux ) if (tsk->tsk_allocated) free(tsk); /* now, the callback can be safely called */ - if (tsk_cb) + if (tsk_cb) { + pthread_mutex_unlock(&tasklet_lock); tsk_cb(opaque, 0); + pthread_mutex_lock(&tasklet_lock); + } } pthread_mutex_unlock(&tasklet_lock);