]> git.ipfire.org Git - thirdparty/tvheadend.git/commitdiff
tasklet: do not call tasklet callbacks inside tasklet_lock
authorJaroslav Kysela <perex@perex.cz>
Tue, 8 Mar 2016 12:40:20 +0000 (13:40 +0100)
committerJaroslav Kysela <perex@perex.cz>
Tue, 8 Mar 2016 12:40:20 +0000 (13:40 +0100)
src/dvr/dvr_vfsmgr.c
src/main.c

index 54d87bad6a0a0106bf65f538ca247362e688b2a1..b61b98cd0832d783c1ca94e00ae331c22a9ce333 100644 (file)
@@ -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);
 }
 
index 75c5add4002e94cca78d514476823bee00ce3e7f..3abd1eeb9e5e614672209b0090af7ba3b5c8318c 100644 (file)
@@ -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);