Use signal.setitimer instead of signal.alarm.
This gives us more precise timeouts, so that when _try_read hits a race condition, we don't suffer as badly.
This commit is contained in:
parent
d0607d0091
commit
80aafaf290
1 changed files with 2 additions and 2 deletions
4
jwack.py
4
jwack.py
|
|
@ -59,7 +59,7 @@ def _try_read(fd, n):
|
||||||
assert(state.is_flushed())
|
assert(state.is_flushed())
|
||||||
oldh = signal.signal(signal.SIGALRM, _timeout)
|
oldh = signal.signal(signal.SIGALRM, _timeout)
|
||||||
try:
|
try:
|
||||||
signal.alarm(1) # emergency fallback
|
signal.setitimer(signal.ITIMER_REAL, 0.01, 0.01) # emergency fallback
|
||||||
try:
|
try:
|
||||||
b = os.read(_fds[0], 1)
|
b = os.read(_fds[0], 1)
|
||||||
except OSError, e:
|
except OSError, e:
|
||||||
|
|
@ -69,7 +69,7 @@ def _try_read(fd, n):
|
||||||
else:
|
else:
|
||||||
raise
|
raise
|
||||||
finally:
|
finally:
|
||||||
signal.alarm(0)
|
signal.setitimer(signal.ITIMER_REAL, 0, 0)
|
||||||
signal.signal(signal.SIGALRM, oldh)
|
signal.signal(signal.SIGALRM, oldh)
|
||||||
return b and b or None # None means EOF
|
return b and b or None # None means EOF
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue