pike.git / src / modules / _Stdio / file.c

version» Context lines:

pike.git/src/modules/_Stdio/file.c:744:    INT32 r,    int all,    INT_TYPE *err)   {    size_t bytes = r;    struct byte_buffer buf = BUFFER_INIT();    int e = 0;       buffer_set_flags(&buf, BUFFER_GROW_EXACT);    -  THREADS_ALLOW(); -  +     while (bytes) {    size_t len = MINIMUM(DIRECT_BUFSIZE, bytes);    ptrdiff_t i;       /* make space for exactly len bytes plus the terminating null byte */    if (UNLIKELY(!buffer_ensure_space_nothrow(&buf, len+1))) {    buffer_free(&buf);    e = ENOMEM;    break;    }    -  +  THREADS_ALLOW(); +     i = fd_read(fd, buffer_alloc_unsafe(&buf, len), len);    -  +  THREADS_DISALLOW(); +  +  check_threads_etc(); +     if (LIKELY(i >= 0)) {    if ((size_t)i < len) buffer_remove(&buf, len - i);    bytes -= i;    if (!i || !all) break;    } else {    e=errno;    if (e == EINTR) {    e = 0;    buffer_remove(&buf, len);    continue;    }       buffer_free(&buf);    break;    }    }    -  THREADS_DISALLOW(); +     -  check_threads_etc(); -  +     if (e) {    *err = e;    return NULL;    }       if(!SAFE_IS_ZERO(& THIS->event_cbs[PIKE_FD_READ]))    ADD_FD_EVENTS (THIS, PIKE_BIT_FD_READ);       return buffer_finish_pike_string(&buf);   }