mirror of
https://github.com/python/cpython.git
synced 2025-08-15 22:30:42 +00:00
fix subtle refcnt bug
This commit is contained in:
parent
5ae34bfd0b
commit
07432c0ef6
1 changed files with 11 additions and 10 deletions
|
@ -42,6 +42,10 @@ list2set(list, set, fd2obj)
|
||||||
int i, len, v, max = -1;
|
int i, len, v, max = -1;
|
||||||
object *o, *filenomethod, *fno;
|
object *o, *filenomethod, *fno;
|
||||||
|
|
||||||
|
for ( i=0; i<FD_SETSIZE; i++ ) {
|
||||||
|
fd2obj[i] = (object*)0;
|
||||||
|
}
|
||||||
|
|
||||||
FD_ZERO(set);
|
FD_ZERO(set);
|
||||||
len = getlistsize(list);
|
len = getlistsize(list);
|
||||||
for( i=0; i<len; i++ ) {
|
for( i=0; i<len; i++ ) {
|
||||||
|
@ -70,7 +74,6 @@ list2set(list, set, fd2obj)
|
||||||
}
|
}
|
||||||
if ( v > max ) max = v;
|
if ( v > max ) max = v;
|
||||||
FD_SET(v, set);
|
FD_SET(v, set);
|
||||||
XDECREF(fd2obj[v]);
|
|
||||||
fd2obj[v] = o;
|
fd2obj[v] = o;
|
||||||
}
|
}
|
||||||
return max+1;
|
return max+1;
|
||||||
|
@ -115,7 +118,7 @@ select_select(self, args)
|
||||||
object *self;
|
object *self;
|
||||||
object *args;
|
object *args;
|
||||||
{
|
{
|
||||||
object *fd2obj[FD_SETSIZE];
|
object *rfd2obj[FD_SETSIZE], *wfd2obj[FD_SETSIZE], *efd2obj[FD_SETSIZE];
|
||||||
object *ifdlist, *ofdlist, *efdlist;
|
object *ifdlist, *ofdlist, *efdlist;
|
||||||
object *ret, *tout;
|
object *ret, *tout;
|
||||||
fd_set ifdset, ofdset, efdset;
|
fd_set ifdset, ofdset, efdset;
|
||||||
|
@ -152,14 +155,12 @@ select_select(self, args)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
memset((char *)fd2obj, '\0', sizeof(fd2obj));
|
|
||||||
|
|
||||||
/* Convert lists to fd_sets, and get maximum fd number */
|
/* Convert lists to fd_sets, and get maximum fd number */
|
||||||
if( (imax=list2set(ifdlist, &ifdset, fd2obj)) < 0 )
|
if( (imax=list2set(ifdlist, &ifdset, rfd2obj)) < 0 )
|
||||||
return 0;
|
return 0;
|
||||||
if( (omax=list2set(ofdlist, &ofdset, fd2obj)) < 0 )
|
if( (omax=list2set(ofdlist, &ofdset, wfd2obj)) < 0 )
|
||||||
return 0;
|
return 0;
|
||||||
if( (emax=list2set(efdlist, &efdset, fd2obj)) < 0 )
|
if( (emax=list2set(efdlist, &efdset, efd2obj)) < 0 )
|
||||||
return 0;
|
return 0;
|
||||||
max = imax;
|
max = imax;
|
||||||
if ( omax > max ) max = omax;
|
if ( omax > max ) max = omax;
|
||||||
|
@ -177,9 +178,9 @@ select_select(self, args)
|
||||||
if ( n == 0 )
|
if ( n == 0 )
|
||||||
imax = omax = emax = 0; /* Speedup hack */
|
imax = omax = emax = 0; /* Speedup hack */
|
||||||
|
|
||||||
ifdlist = set2list(&ifdset, imax, fd2obj);
|
ifdlist = set2list(&ifdset, imax, rfd2obj);
|
||||||
ofdlist = set2list(&ofdset, omax, fd2obj);
|
ofdlist = set2list(&ofdset, omax, wfd2obj);
|
||||||
efdlist = set2list(&efdset, emax, fd2obj);
|
efdlist = set2list(&efdset, emax, efd2obj);
|
||||||
ret = mkvalue("OOO", ifdlist, ofdlist, efdlist);
|
ret = mkvalue("OOO", ifdlist, ofdlist, efdlist);
|
||||||
XDECREF(ifdlist);
|
XDECREF(ifdlist);
|
||||||
XDECREF(ofdlist);
|
XDECREF(ofdlist);
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue