]> git.ipfire.org Git - thirdparty/tvheadend.git/commitdiff
idnode: add idnode_save_check mechanism to save queued entry on removal
authorJaroslav Kysela <perex@perex.cz>
Wed, 10 Feb 2016 17:01:01 +0000 (18:01 +0100)
committerJaroslav Kysela <perex@perex.cz>
Wed, 10 Feb 2016 17:01:01 +0000 (18:01 +0100)
22 files changed:
src/access.c
src/bouquet.c
src/channels.c
src/descrambler/caclient.c
src/dvr/dvr_autorec.c
src/dvr/dvr_config.c
src/dvr/dvr_db.c
src/dvr/dvr_timerec.c
src/epggrab.c
src/epggrab/channel.c
src/esfilter.c
src/idnode.c
src/idnode.h
src/input/mpegts/linuxdvb/linuxdvb_adapter.c
src/input/mpegts/linuxdvb/linuxdvb_satconf.c
src/input/mpegts/mpegts_input.c
src/input/mpegts/mpegts_mux.c
src/input/mpegts/satip/satip.c
src/input/mpegts/satip/satip_satconf.c
src/input/mpegts/tvhdhomerun/tvhdhomerun.c
src/profile.c
src/service.c

index b11886f6ad0c563206531ac45a6b3e3fc057dd65..1bf6e4d752343e1a9fae3270469f40bec983d216 100644 (file)
@@ -1093,6 +1093,8 @@ access_entry_destroy(access_entry_t *ae, int delconf)
   access_ipmask_t *ai;
   char ubuf[UUID_HEX_SIZE];
 
+  idnode_save_check(&ae->ae_id, delconf);
+
   if (delconf)
     hts_settings_remove("accesscontrol/%s", idnode_uuid_as_str(&ae->ae_id, ubuf));
 
@@ -1759,6 +1761,8 @@ passwd_entry_destroy(passwd_entry_t *pw, int delconf)
   if (pw == NULL)
     return;
 
+  idnode_save_check(&pw->pw_id, delconf);
+
   if (delconf)
     hts_settings_remove("passwd/%s", idnode_uuid_as_str(&pw->pw_id, ubuf));
   TAILQ_REMOVE(&passwd_entries, pw, pw_link);
@@ -1931,10 +1935,11 @@ ipblock_entry_create(const char *uuid, htsmsg_t *conf)
 }
 
 static void
-ipblock_entry_destroy(ipblock_entry_t *ib)
+ipblock_entry_destroy(ipblock_entry_t *ib, int delconf)
 {
   if (ib == NULL)
     return;
+  idnode_save_check(&ib->ib_id, delconf);
   TAILQ_REMOVE(&ipblock_entries, ib, ib_link);
   idnode_unlink(&ib->ib_id);
   free(ib->ib_comment);
@@ -1969,7 +1974,7 @@ ipblock_entry_class_delete(idnode_t *self)
   char ubuf[UUID_HEX_SIZE];
 
   hts_settings_remove("ipblock/%s", idnode_uuid_as_str(&ib->ib_id, ubuf));
-  ipblock_entry_destroy(ib);
+  ipblock_entry_destroy(ib, 1);
 }
 
 static int
@@ -2127,7 +2132,7 @@ access_done(void)
   while ((pw = TAILQ_FIRST(&passwd_entries)) != NULL)
     passwd_entry_destroy(pw, 0);
   while ((ib = TAILQ_FIRST(&ipblock_entries)) != NULL)
-    ipblock_entry_destroy(ib);
+    ipblock_entry_destroy(ib, 0);
   free((void *)superuser_username);
   superuser_username = NULL;
   free((void *)superuser_password);
index a628f2180bb77cc638bb615a391a38eb31d9cd75..88ed93abc1b9d785e4b41765a446af2d442eeebc 100644 (file)
@@ -132,6 +132,7 @@ bouquet_destroy(bouquet_t *bq)
     return;
 
   RB_REMOVE(&bouquets, bq, bq_link);
+  idnode_save_check(&bq->bq_id, 1);
   idnode_unlink(&bq->bq_id);
 
   if ((bqd = bq->bq_download) != NULL) {
index 59d649ed0c90515a0ba8530df497625c96ed7754..bd0e783a965ab3c9bade50d6744d9066c3339e97 100644 (file)
@@ -1012,6 +1012,8 @@ channel_delete ( channel_t *ch, int delconf )
 
   lock_assert(&global_lock);
 
+  idnode_save_check(&ch->ch_id, delconf);
+
   if (delconf)
     tvhinfo("channel", "%s - deleting", channel_get_name(ch));
 
@@ -1227,6 +1229,8 @@ channel_tag_destroy(channel_tag_t *ct, int delconf)
   idnode_list_mapping_t *ilm;
   char ubuf[UUID_HEX_SIZE];
 
+  idnode_save_check(&ct->ct_id, delconf);
+
   while((ilm = LIST_FIRST(&ct->ct_ctms)) != NULL)
     channel_tag_mapping_destroy(ilm, delconf ? ilm->ilm_in1 : NULL);
 
index 83e2ed11b552574015bc0709de19abc81bc4758b..32f506cb66f11f16ddb4be9b6458df01ac9037c6 100644 (file)
@@ -137,6 +137,7 @@ caclient_delete(caclient_t *cac, int delconf)
 {
   char ubuf[UUID_HEX_SIZE];
 
+  idnode_save_check(&cac->cac_id, delconf);
   cac->cac_enabled = 0;
   cac->cac_conf_changed(cac);
   if (delconf)
index bb08edf281bd1b9fa75e75fd38d145595e5a7f72..e8b791db60a13510a06ba2f33f6cc7cc675030cc 100644 (file)
@@ -364,6 +364,8 @@ autorec_entry_destroy(dvr_autorec_entry_t *dae, int delconf)
 {
   char ubuf[UUID_HEX_SIZE];
 
+  idnode_save_check(&dae->dae_id, delconf);
+
   dvr_autorec_purge_spawns(dae, delconf, 0);
 
   if (delconf)
index eff44d30c7a61b6a57d42fd051e51f4c8febe87e..1050439ca992ff7813cfe0cd8bc803b81030d740 100644 (file)
@@ -236,6 +236,8 @@ dvr_config_destroy(dvr_config_t *cfg, int delconf)
 {
   char ubuf[UUID_HEX_SIZE];
 
+  idnode_save_check(&cfg->dvr_id, delconf);
+
   if (delconf) {
     tvhinfo("dvr", "Deleting configuration '%s'", cfg->dvr_config_name);
     hts_settings_remove("dvr/config/%s", idnode_uuid_as_str(&cfg->dvr_id, ubuf));
index ab1b9e1ab283e484b8134875ad910108cd2ae91a..8139b929bf2fc9a2b246ffbb3a2bb4da5e9eae50 100644 (file)
@@ -1294,6 +1294,8 @@ dvr_entry_dec_ref(dvr_entry_t *de)
     return;
   }
 
+  idnode_save_check(&de->de_id, 1);
+
   idnode_unlink(&de->de_id);
 
   if(de->de_autorec != NULL)
@@ -1330,6 +1332,8 @@ dvr_entry_destroy(dvr_entry_t *de, int delconf)
 {
   char ubuf[UUID_HEX_SIZE];
 
+  idnode_save_check(&de->de_id, delconf);
+
   if (delconf)
     hts_settings_remove("dvr/log/%s", idnode_uuid_as_str(&de->de_id, ubuf));
 
index 56fb6423225fdda1a5e26ec8805d4cb998fc02a0..66a0534563c0a48fc2793c47ef783e44ac49be76 100644 (file)
@@ -232,6 +232,8 @@ timerec_entry_destroy(dvr_timerec_entry_t *dte, int delconf)
 {
   char ubuf[UUID_HEX_SIZE];
 
+  idnode_save_check(&dte->dte_id, delconf);
+
   dvr_timerec_purge_spawn(dte, delconf);
 
   if (delconf)
index 8474c6b1b3218de3800e388fa09d60d463b3ebd2..c8ca9c01069946e2ce49835340b6f96788647d3f 100644 (file)
@@ -437,6 +437,7 @@ void epggrab_done ( void )
 
   pthread_mutex_lock(&global_lock);
   while ((mod = LIST_FIRST(&epggrab_modules)) != NULL) {
+    idnode_save_check(&mod->idnode, 1);
     idnode_unlink(&mod->idnode);
     LIST_REMOVE(mod, link);
     pthread_mutex_unlock(&global_lock);
index 865773f9c6262b40cce8925c8ede87605b5764f4..0123787e79cc98606eb035c26bb454719a4fd57a 100644 (file)
@@ -393,6 +393,8 @@ void epggrab_channel_destroy( epggrab_channel_t *ec, int delconf, int rb_remove
 
   if (ec == NULL) return;
 
+  idnode_save_check(&ec->idnode, delconf);
+
   /* Already linked */
   epggrab_channel_links_delete(ec, 0);
   if (rb_remove)
index 6273781a11e3b422c7565b6dcadf402bf677440d..2915dfe2a6bd3a21a6722ab95f19cf9ffa7526df 100644 (file)
@@ -194,6 +194,7 @@ esfilter_delete(esfilter_t *esf, int delconf)
   if (delconf)
     hts_settings_remove("esfilter/%s", idnode_uuid_as_str(&esf->esf_id, ubuf));
   TAILQ_REMOVE(&esfilters[esf->esf_class], esf, esf_link);
+  idnode_save_check(&esf->esf_id, delconf);
   idnode_unlink(&esf->esf_id);
   free(esf->esf_comment);
   free(esf);
index 972ab2f57f968f9a89eeb9f0be7f141705b31d8f..cf9b2f23861db9eede7f662a52a93b29849210af 100644 (file)
@@ -161,11 +161,7 @@ idnode_unlink(idnode_t *in)
   RB_REMOVE(in->in_domain, in, in_domain_link);
   tvhtrace("idnode", "unlink node %s", idnode_uuid_as_str(in, ubuf));
   idnode_notify(in, "delete");
-
-  if (in->in_save) {
-    TAILQ_REMOVE(&idnodes_save, in->in_save, ise_link);
-    in->in_save = NULL;
-  }
+  assert(in->in_save == NULL);
 }
 
 /**
@@ -1111,6 +1107,29 @@ idnode_save_queue ( idnode_t *self )
   self->in_save = ise;
 }
 
+void
+idnode_save_check ( idnode_t *self, int weak )
+{
+  char filename[PATH_MAX];
+  htsmsg_t *m;
+
+  if (self->in_save == NULL)
+    return;
+
+  TAILQ_REMOVE(&idnodes_save, self->in_save, ise_link);
+  free(self->in_save);
+  self->in_save = NULL;
+
+  if (weak)
+    return;
+
+  m = idnode_savefn(self, filename, sizeof(filename));
+  if (m) {
+    hts_settings_save(m, "%s", filename);
+    htsmsg_destroy(m);
+  }
+}
+
 int
 idnode_write0 ( idnode_t *self, htsmsg_t *c, int optmask, int dosave )
 {
index 8a032d852bcf3b59b43f8b0a2a7fc4d680564879..0b77766af219ca3a55f4a046bdfcbe20ab9e7735 100644 (file)
@@ -212,6 +212,7 @@ htsmsg_t *idclass_serialize0 (const idclass_t *idc, htsmsg_t *list, int optmask,
 htsmsg_t *idnode_serialize0  (idnode_t *self, htsmsg_t *list, int optmask, const char *lang);
 void      idnode_read0  (idnode_t *self, htsmsg_t *m, htsmsg_t *list, int optmask, const char *lang);
 int       idnode_write0 (idnode_t *self, htsmsg_t *m, int optmask, int dosave);
+void      idnode_save_check (idnode_t *self, int weak);
 
 #define idclass_serialize(idc, lang) idclass_serialize0(idc, NULL, 0, lang)
 #define idnode_serialize(in, lang)   idnode_serialize0(in, NULL, 0, lang)
index 4988c55b91898c2de8f8a37715c5d8418897381d..bed5c71195c9d6a642d64d61c49e2c05d458bda5 100644 (file)
@@ -498,6 +498,8 @@ linuxdvb_adapter_del ( const char *path )
           break;
       }
     if (!th) return;
+
+    idnode_save_check(&la->th_id, 1);
   
     /* Delete the frontends */
     for (lfe = LIST_FIRST(&la->la_frontends); lfe != NULL; lfe = next) {
index e72f8284353be993d601fef93fa4fccddd0c2994..93b6278b3427069c9aa340c115e497874ed52d03 100644 (file)
@@ -1396,6 +1396,7 @@ void
 linuxdvb_satconf_ele_destroy ( linuxdvb_satconf_ele_t *ls )
 {
   TAILQ_REMOVE(&ls->lse_parent->ls_elements, ls, lse_link);
+  idnode_save_check(&ls->lse_id, 1);
   idnode_unlink(&ls->lse_id);
   if (ls->lse_lnb)     linuxdvb_lnb_destroy(ls->lse_lnb);
   if (ls->lse_switch)  linuxdvb_switch_destroy(ls->lse_switch);
@@ -1461,6 +1462,7 @@ linuxdvb_satconf_delete ( linuxdvb_satconf_t *ls, int delconf )
     nxt = TAILQ_NEXT(lse, lse_link);
     linuxdvb_satconf_ele_destroy(lse);
   }
+  idnode_save_check(&ls->ls_id, 1);
   idnode_unlink(&ls->ls_id);
   free(ls);
 }
@@ -1518,6 +1520,7 @@ linuxdvb_diseqc_create0
 void
 linuxdvb_diseqc_destroy ( linuxdvb_diseqc_t *ld )
 {
+  idnode_save_check(&ld->ld_id, 1);
   idnode_unlink(&ld->ld_id);
   free((void *)ld->ld_type);
 }
index c33c820a66c03522d73ed35d48a61704d49f88d7..51c4cb95024b39d2612484a5e6314028884663b9 100644 (file)
@@ -1829,6 +1829,8 @@ mpegts_input_delete ( mpegts_input_t *mi, int delconf )
   /* Early shutdown flag */
   mi->mi_running = 0;
 
+  idnode_save_check(&mi->ti_id, delconf);
+
   /* Remove networks */
   while ((mnl = LIST_FIRST(&mi->mi_networks)))
     mpegts_input_del_network(mnl);
index 44c66a6d9101541ca6e8082368fa5d48c3f56280..bb44d7e9add6e621ba41ff221a7b4232e7786523 100644 (file)
@@ -48,6 +48,7 @@ mpegts_mux_instance_delete
 {
   mpegts_mux_instance_t *mmi = (mpegts_mux_instance_t *)tii;
 
+  idnode_save_check(&tii->tii_id, 1);
   idnode_unlink(&tii->tii_id);
   LIST_REMOVE(mmi, mmi_mux_link);
   LIST_REMOVE(tii, tii_input_link);
@@ -660,6 +661,8 @@ mpegts_mux_delete ( mpegts_mux_t *mm, int delconf )
   th_subscription_t *ths;
   char buf[256];
 
+  idnode_save_check(&mm->mm_id, delconf);
+
   mpegts_mux_nice_name(mm, buf, sizeof(buf));
   tvhinfo("mpegts", "%s (%p) - deleting", buf, mm);
   
index bd32e8c41c74796445c432c00d63154d015a430f..af66fe424b3bd6ce7ed3a813775de2e27bc4c6c3 100644 (file)
@@ -721,6 +721,8 @@ satip_device_destroy( satip_device_t *sd )
 
   gtimer_disarm(&sd->sd_destroy_timer);
 
+  idnode_save_check(&sd->th_id, 1);
+
   while ((lfe = TAILQ_FIRST(&sd->sd_frontends)) != NULL)
     satip_frontend_delete(lfe);
 
index ccc8e6acc8ab318467cde8cc04a5de49765b7495..8ec90440a304862bff082ac815d7c8b3333647de 100644 (file)
@@ -307,6 +307,7 @@ satip_satconf_destroy0
 {
   satip_frontend_t *lfe = sfc->sfc_lfe;
   TAILQ_REMOVE(&lfe->sf_satconf, sfc, sfc_link);
+  idnode_save_check(&sfc->sfc_id, 1);
   idnode_unlink(&sfc->sfc_id);
   idnode_set_free(sfc->sfc_networks);
   free(sfc->sfc_name);
index b032c4af8adeee80f3fc562d3dc0a395f964f8b3..a52c03bbd31161b38b4d57de050fddddcc048233 100644 (file)
@@ -446,6 +446,8 @@ tvhdhomerun_device_destroy( tvhdhomerun_device_t *hd )
 
   gtimer_disarm(&hd->hd_destroy_timer);
 
+  idnode_save_check(&hd->th_id, 1);
+
   tvhlog(LOG_INFO, "tvhdhomerun", "Releasing locks for devices");
   while ((lfe = TAILQ_FIRST(&hd->hd_frontends)) != NULL) {
     tvhdhomerun_frontend_delete(lfe);
index 17982a1d5b69c965d7de667ec38cf10c7f09308f..afbcbc275cc5e87849bf85c74f5fe6e901388e2b 100644 (file)
@@ -132,6 +132,7 @@ static void
 profile_delete(profile_t *pro, int delconf)
 {
   char ubuf[UUID_HEX_SIZE];
+  idnode_save_check(&pro->pro_id, delconf);
   pro->pro_enabled = 0;
   if (pro->pro_conf_changed)
     pro->pro_conf_changed(pro);
index 2c3f3d00e9ad02e2f157f204b52e0846f2c7981d..a3ef64490c302d1d842edcc2275ce30d7cf9f93c 100644 (file)
@@ -822,6 +822,8 @@ service_destroy(service_t *t, int delconf)
 
   lock_assert(&global_lock);
 
+  idnode_save_check(&t->s_id, delconf);
+
   if(t->s_delete != NULL)
     t->s_delete(t, delconf);