idnode_list_mapping_t *ilm;
service_instance_t *si, *next;
profile_t *pro = prch ? prch->prch_pro : NULL;
- int enlisted, r, r1;
+ int r, r1;
lock_assert(&global_lock);
*error = SM_CODE_SVC_NOT_ENABLED;
return NULL;
}
- enlisted = 0;
LIST_FOREACH(ilm, &ch->ch_services, ilm_in2_link) {
s = (service_t *)ilm->ilm_in1;
if (s->s_is_enabled(s, flags)) {
(pro->pro_svfilter == PROFILE_SVF_HD && service_is_hdtv(s)) ||
(pro->pro_svfilter == PROFILE_SVF_UHD && service_is_uhdtv(s))) {
r1 = s->s_enlist(s, ti, sil, flags, weight);
- if (r1 == 0)
- enlisted++;
- else if (r == 0)
+ if (r1 && r == 0)
r = r1;
}
}
}
- if (enlisted == 0) {
+ /* find a valid instance */
+ TAILQ_FOREACH(si, sil, si_link)
+ if (!si->si_error) break;
+ if (si == NULL) {
LIST_FOREACH(ilm, &ch->ch_services, ilm_in2_link) {
s = (service_t *)ilm->ilm_in1;
if (s->s_is_enabled(s, flags)) {
r1 = s->s_enlist(s, ti, sil, flags, weight);
- if (r1 == 0)
- enlisted++;
- else if (r == 0)
+ if (r1 && r == 0)
r = r1;
}
}
}
- if (enlisted)
- r = 0;
+ TAILQ_FOREACH(si, sil, si_link)
+ if (!si->si_error) {
+ r = 0;
+ break;
+ }
} else {
r = s->s_enlist(s, ti, sil, flags, weight);
}