From: Jaroslav Kysela Date: Fri, 23 Oct 2015 12:25:23 +0000 (+0200) Subject: epggrab: XMLTV / PyXML - don't use one global lock for whole input X-Git-Tag: v4.2.1~1799 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=aa17168f5a9f83058f0d26c3acc9b3b31c7a91d0;p=thirdparty%2Ftvheadend.git epggrab: XMLTV / PyXML - don't use one global lock for whole input --- diff --git a/src/epg.c b/src/epg.c index e25116270..aae95c023 100644 --- a/src/epg.c +++ b/src/epg.c @@ -117,6 +117,8 @@ void epg_updated ( void ) { epg_object_t *eo; + lock_assert(&global_lock); + /* Remove unref'd */ while ((eo = LIST_FIRST(&epg_object_unref))) { tvhtrace("epg", diff --git a/src/epggrab/module.c b/src/epggrab/module.c index d662d2a4c..d3b46e881 100644 --- a/src/epggrab/module.c +++ b/src/epggrab/module.c @@ -227,12 +227,9 @@ void epggrab_module_parse( void *m, htsmsg_t *data ) /* Parse */ memset(&stats, 0, sizeof(stats)); - pthread_mutex_lock(&global_lock); time(&tm1); save |= mod->parse(mod, data, &stats); time(&tm2); - if (save) epg_updated(); - pthread_mutex_unlock(&global_lock); htsmsg_destroy(data); /* Debug stats */ diff --git a/src/epggrab/module/pyepg.c b/src/epggrab/module/pyepg.c index 4834fc75a..9fddbd5eb 100644 --- a/src/epggrab/module/pyepg.c +++ b/src/epggrab/module/pyepg.c @@ -377,27 +377,43 @@ static int _pyepg_parse_schedule static int _pyepg_parse_epg ( epggrab_module_t *mod, htsmsg_t *data, epggrab_stats_t *stats ) { - int save = 0; + int gsave = 0, save; htsmsg_t *tags; htsmsg_field_t *f; if ((tags = htsmsg_get_map(data, "tags")) == NULL) return 0; HTSMSG_FOREACH(f, tags) { + save = 0; if (strcmp(f->hmf_name, "channel") == 0 ) { - save |= _pyepg_parse_channel(mod, htsmsg_get_map_by_field(f), stats); + pthread_mutex_lock(&global_lock); + save = _pyepg_parse_channel(mod, htsmsg_get_map_by_field(f), stats); + pthread_mutex_unlock(&global_lock); } else if (strcmp(f->hmf_name, "brand") == 0 ) { - save |= _pyepg_parse_brand(mod, htsmsg_get_map_by_field(f), stats); + pthread_mutex_lock(&global_lock); + save = _pyepg_parse_brand(mod, htsmsg_get_map_by_field(f), stats); + if (save) epg_updated(); + pthread_mutex_unlock(&global_lock); } else if (strcmp(f->hmf_name, "series") == 0 ) { - save |= _pyepg_parse_season(mod, htsmsg_get_map_by_field(f), stats); + pthread_mutex_lock(&global_lock); + save = _pyepg_parse_season(mod, htsmsg_get_map_by_field(f), stats); + if (save) epg_updated(); + pthread_mutex_unlock(&global_lock); } else if (strcmp(f->hmf_name, "episode") == 0 ) { - save |= _pyepg_parse_episode(mod, htsmsg_get_map_by_field(f), stats); + pthread_mutex_lock(&global_lock); + save = _pyepg_parse_episode(mod, htsmsg_get_map_by_field(f), stats); + if (save) epg_updated(); + pthread_mutex_unlock(&global_lock); } else if (strcmp(f->hmf_name, "schedule") == 0 ) { - save |= _pyepg_parse_schedule(mod, htsmsg_get_map_by_field(f), stats); + pthread_mutex_lock(&global_lock); + save = _pyepg_parse_schedule(mod, htsmsg_get_map_by_field(f), stats); + if (save) epg_updated(); + pthread_mutex_unlock(&global_lock); } + gsave |= save; } - return save; + return gsave; } static int _pyepg_parse diff --git a/src/epggrab/module/xmltv.c b/src/epggrab/module/xmltv.c index 2c300c402..8286e95df 100644 --- a/src/epggrab/module/xmltv.c +++ b/src/epggrab/module/xmltv.c @@ -654,7 +654,7 @@ static int _xmltv_parse_channel static int _xmltv_parse_tv (epggrab_module_t *mod, htsmsg_t *body, epggrab_stats_t *stats) { - int save = 0; + int gsave = 0, save; htsmsg_t *tags; htsmsg_field_t *f; @@ -662,13 +662,20 @@ static int _xmltv_parse_tv return 0; HTSMSG_FOREACH(f, tags) { + save = 0; if(!strcmp(f->hmf_name, "channel")) { - save |= _xmltv_parse_channel(mod, htsmsg_get_map_by_field(f), stats); + pthread_mutex_lock(&global_lock); + save = _xmltv_parse_channel(mod, htsmsg_get_map_by_field(f), stats); + pthread_mutex_unlock(&global_lock); } else if(!strcmp(f->hmf_name, "programme")) { - save |= _xmltv_parse_programme(mod, htsmsg_get_map_by_field(f), stats); + pthread_mutex_lock(&global_lock); + save = _xmltv_parse_programme(mod, htsmsg_get_map_by_field(f), stats); + if (save) epg_updated(); + pthread_mutex_unlock(&global_lock); } + gsave |= save; } - return save; + return gsave; } static int _xmltv_parse