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