]> git.ipfire.org Git - thirdparty/tvheadend.git/commitdiff
DVR: fix dvr_get_disk_space_tcb deadlock (global_lock)
authorJaroslav Kysela <perex@perex.cz>
Fri, 26 Jun 2015 13:39:43 +0000 (15:39 +0200)
committerJaroslav Kysela <perex@perex.cz>
Fri, 26 Jun 2015 13:39:43 +0000 (15:39 +0200)
src/dvr/dvr_rec.c

index 4ae723902a31589267ad69c91646321b543e37f2..827eabc2521863657de5c63d39c354f6d3ab4302 100644 (file)
@@ -1138,16 +1138,10 @@ dvr_get_disk_space_update(const char *path)
  *
  */
 static void
-dvr_get_disk_space_tcb(void *s, int dearmed)
+dvr_get_disk_space_tcb(void *opaque, int dearmed)
 {
-  dvr_config_t *cfg;
+  const char *path = opaque;
   htsmsg_t *m;
-  char *path;
-
-  pthread_mutex_lock(&global_lock);
-  cfg = dvr_config_find_by_name_default(NULL);
-  path = tvh_strdupa(cfg->dvr_storage);
-  pthread_mutex_unlock(&global_lock);
 
   m = htsmsg_create_map();
   pthread_mutex_lock(&dvr_disk_space_mutex);
@@ -1157,12 +1151,23 @@ dvr_get_disk_space_tcb(void *s, int dearmed)
   pthread_mutex_unlock(&dvr_disk_space_mutex);
 
   notify_by_msg("diskspaceUpdate", m);
+
+  free(opaque);
 }
 
 static void
 dvr_get_disk_space_cb(void *aux)
 {
-  tasklet_arm(&dvr_disk_space_tasklet, dvr_get_disk_space_tcb, NULL);
+  dvr_config_t *cfg;
+  char *path;
+
+  lock_assert(&global_lock);
+
+  cfg = dvr_config_find_by_name_default(NULL);
+  if (cfg->dvr_storage && cfg->dvr_storage[0]) {
+    path = strdup(cfg->dvr_storage);
+    tasklet_arm(&dvr_disk_space_tasklet, dvr_get_disk_space_tcb, path);
+  }
   gtimer_arm(&dvr_disk_space_timer, dvr_get_disk_space_cb, NULL, 60);
 }