Author: Brian Kearns <[email protected]>
Branch: use-file-star-for-file
Changeset: r73582:77e9e65012f3
Date: 2014-09-17 13:08 -0400
http://bitbucket.org/pypy/pypy/changeset/77e9e65012f3/
Log: release gil around fread
diff --git a/rpython/rlib/rfile.py b/rpython/rlib/rfile.py
--- a/rpython/rlib/rfile.py
+++ b/rpython/rlib/rfile.py
@@ -101,7 +101,7 @@
c_fgets = llexternal('fgets', [rffi.CCHARP, rffi.INT, FILEP], rffi.CCHARP)
c_fread = llexternal('fread', [rffi.CCHARP, rffi.SIZE_T, rffi.SIZE_T, FILEP],
- rffi.SIZE_T)
+ rffi.SIZE_T, releasegil=False)
c_fwrite = llexternal('fwrite', [rffi.CCHARP, rffi.SIZE_T, rffi.SIZE_T, FILEP],
rffi.SIZE_T)
@@ -334,50 +334,58 @@
raise IOError("File not open for writing")
def _fread(self, buf, n, stream):
+ before = rffi.aroundstate.before
+ if before: before()
+
if not self._univ_newline:
- return c_fread(buf, 1, n, stream)
+ i = c_fread(buf, 1, n, stream)
+ else:
+ i = 0
+ newlinetypes = self._newlinetypes
+ skipnextlf = self._skipnextlf
+ assert n >= 0
+ while n:
+ dst = rffi.ptradd(buf, i)
+ nread = c_fread(dst, 1, n, stream)
+ assert nread <= n
+ if nread == 0:
+ break
- i = 0
- newlinetypes = self._newlinetypes
- skipnextlf = self._skipnextlf
- assert n >= 0
- while n:
- dst = rffi.ptradd(buf, i)
- nread = c_fread(dst, 1, n, stream)
- assert nread <= n
- if nread == 0:
- break
+ j = 0
+ n -= nread
+ shortread = n != 0
+ while nread:
+ nread -= 1
+ c = dst[j]
+ j += 1
+ if c == '\r':
+ buf[i] = '\n'
+ i += 1
+ skipnextlf = True
+ elif skipnextlf and c == '\n':
+ skipnextlf = False
+ newlinetypes |= NEWLINE_CRLF
+ n += 1
+ else:
+ if c == '\n':
+ newlinetypes |= NEWLINE_LF
+ elif skipnextlf:
+ newlinetypes |= NEWLINE_CR
+ buf[i] = c
+ i += 1
+ skipnextlf = False
+ if shortread:
+ if skipnextlf and c_feof(stream):
+ newlinetypes |= NEWLINE_CR
+ break
+ self._newlinetypes = newlinetypes
+ self._skipnextlf = skipnextlf
- j = 0
- n -= nread
- shortread = n != 0
- while nread:
- nread -= 1
- c = dst[j]
- j += 1
- if c == '\r':
- buf[i] = '\n'
- i += 1
- skipnextlf = True
- elif skipnextlf and c == '\n':
- skipnextlf = False
- newlinetypes |= NEWLINE_CRLF
- n += 1
- else:
- if c == '\n':
- newlinetypes |= NEWLINE_LF
- elif skipnextlf:
- newlinetypes |= NEWLINE_CR
- buf[i] = c
- i += 1
- skipnextlf = False
- if shortread:
- if skipnextlf and c_feof(stream):
- newlinetypes |= NEWLINE_CR
- break
- self._newlinetypes = newlinetypes
- self._skipnextlf = skipnextlf
+ after = rffi.aroundstate.after
+ if after: after()
return i
+ _fread._gctransformer_hint_close_stack_ = True
+ _fread._dont_inline_ = True
def _new_buffersize(self, currentsize):
ll_file = self._ll_file
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit