--- multiplexer/en300468ts.c 2010/09/29 21:34:26 1.19 +++ multiplexer/en300468ts.c 2010/09/29 21:36:23 1.20 @@ -1553,59 +1553,41 @@ static enum enumsi alloctab(long pid, lo return e; } -static struct sitab **findtab(struct sitab **pst, long pid, long tableid) -{ - struct sitab *st = *pst; - while (st != NULL) { - if ((st->pid == pid) && (st->tableid == tableid)) { - return pst; - } - pst = &st->next; - st = *pst; - } - return NULL; -} - static void droptab(long pid, long tableid) { struct sitab **pst; struct sitab *st; pst = &runtab; - while ((pst = findtab(pst, pid, tableid)) != NULL) { - st = *pst; - *pst = st->next; - nextversion[st->tableid - TABLEID_FIRST] = (st->version + 1) & 0x1F; - free(st->tab); - free(st); + while ((st = *pst)) { + if ((st->pid == pid) && (st->tableid == tableid)) { + *pst = st->next; + nextversion[st->tableid - TABLEID_FIRST] = (st->version + 1) & 0x1F; + free(st->tab); + free(st); + } else { + pst = &st->next; + } } } static void maketab(long pid, long tableid, long freqmsec, int fd) { - struct sitab **pt; struct sitab *t; enum enumsi e; e = alloctab(pid, tableid); if (e >= 0) { - pt = findtab(&runtab, pid, tableid); - if (pt == NULL) { - t = malloc(sizeof(struct sitab)); + t = malloc(sizeof(struct sitab)); + if (t != NULL) { t->pid = pid; t->tableid = tableid; - t->version = nextversion[tableid - TABLEID_FIRST]; - } else { - t = *pt; - *pt = t->next; - free(t->tab); - t->version = (t->version + 1) & 0x1F; - } - t->freqmsec = freqmsec; - t->esi = e; - t->tab = NULL; - memset(&t->descrnum[0], 0, sizeof(t->descrnum[0])); - memset(&tabnew, 0, sizeof(tabnew)); - tabnew.fd = fd; - newtab = t; + t->freqmsec = freqmsec; + t->esi = e; + t->tab = NULL; + memset(&t->descrnum[0], 0, sizeof(t->descrnum)); + memset(&tabnew, 0, sizeof(tabnew)); + tabnew.fd = fd; + newtab = t; + } } } @@ -2205,13 +2187,14 @@ static void argloop(int f0) newtab->pid); free(newtab->tab); free(newtab); - newtab = NULL; } else { + droptab(newtab->pid, newtab->tableid); + newtab->version = nextversion[newtab->tableid - TABLEID_FIRST]; newtab->soon = tv; newtab->next = runtab; runtab = newtab; - newtab = NULL; } + newtab = NULL; break; case -EAGAIN: if (i > 0) {