| FazBrowse GitHub Viewer | Trending | | Home |
| Tools: [Download Repo ZIP] [Original HTTPS Page] |
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,2 @@ | ||
| Modify the following fnctl function to retry if interrupted by a signal | ||
| (EINTR): flock, lockf, fnctl |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| Expand Up | @@ -64,6 +64,7 @@ fcntl_fcntl_impl(PyObject *module, int fd, int code, PyObject *arg) | |
| char *str; | ||
| Py_ssize_t len; | ||
| char buf[1024]; | ||
| int async_err = 0; | ||
|
|
||
| if (arg != NULL) { | ||
| int parse_result; | ||
| Expand All | @@ -75,12 +76,13 @@ fcntl_fcntl_impl(PyObject *module, int fd, int code, PyObject *arg) | |
| return NULL; | ||
| } | ||
| memcpy(buf, str, len); | ||
| Py_BEGIN_ALLOW_THREADS | ||
| ret = fcntl(fd, code, buf); | ||
| Py_END_ALLOW_THREADS | ||
| do { | ||
| Py_BEGIN_ALLOW_THREADS | ||
| ret = fcntl(fd, code, buf); | ||
| Py_END_ALLOW_THREADS | ||
| } while (ret == -1 && errno == EINTR && !(async_err = PyErr_CheckSignals())); | ||
| if (ret < 0) { | ||
| PyErr_SetFromErrno(PyExc_OSError); | ||
| return NULL; | ||
|
Comment thread
Outdated
Copy link
Copy Markdown
Contributor
Author
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Choose a reason Spam Abuse Off Topic Outdated Duplicate Resolved Low QualityThat is something that I do not understand, why before result of PyErr_SetFromErrno(PyExc_OSError) was not returned. The new code is in sync with other modules, now. /repeats
Sorry, something went wrong.
All reactions
|
||
| return !async_err ? PyErr_SetFromErrno(PyExc_OSError) : NULL; | ||
| } | ||
| return PyBytes_FromStringAndSize(buf, len); | ||
| } | ||
| Expand All | @@ -95,12 +97,13 @@ fcntl_fcntl_impl(PyObject *module, int fd, int code, PyObject *arg) | |
| } | ||
| } | ||
|
|
||
| Py_BEGIN_ALLOW_THREADS | ||
| ret = fcntl(fd, code, (int)int_arg); | ||
| Py_END_ALLOW_THREADS | ||
| do { | ||
| Py_BEGIN_ALLOW_THREADS | ||
| ret = fcntl(fd, code, (int)int_arg); | ||
| Py_END_ALLOW_THREADS | ||
| } while (ret == -1 && errno == EINTR && !(async_err = PyErr_CheckSignals())); | ||
| if (ret < 0) { | ||
| PyErr_SetFromErrno(PyExc_OSError); | ||
| return NULL; | ||
| return !async_err ? PyErr_SetFromErrno(PyExc_OSError) : NULL; | ||
| } | ||
| return PyLong_FromLong((long)ret); | ||
| } | ||
| Expand Down Expand Up | @@ -283,11 +286,14 @@ fcntl_flock_impl(PyObject *module, int fd, int code) | |
| /*[clinic end generated code: output=84059e2b37d2fc64 input=b70a0a41ca22a8a0]*/ | ||
| { | ||
| int ret; | ||
| int async_err = 0; | ||
|
|
||
| #ifdef HAVE_FLOCK | ||
| Py_BEGIN_ALLOW_THREADS | ||
| ret = flock(fd, code); | ||
| Py_END_ALLOW_THREADS | ||
| do { | ||
| Py_BEGIN_ALLOW_THREADS | ||
| ret = flock(fd, code); | ||
| Py_END_ALLOW_THREADS | ||
| } while (ret == -1 && errno == EINTR && !(async_err = PyErr_CheckSignals())); | ||
| #else | ||
|
|
||
| #ifndef LOCK_SH | ||
| Expand All | @@ -310,14 +316,15 @@ fcntl_flock_impl(PyObject *module, int fd, int code) | |
| return NULL; | ||
| } | ||
| l.l_whence = l.l_start = l.l_len = 0; | ||
| Py_BEGIN_ALLOW_THREADS | ||
| ret = fcntl(fd, (code & LOCK_NB) ? F_SETLK : F_SETLKW, &l); | ||
| Py_END_ALLOW_THREADS | ||
| do { | ||
| Py_BEGIN_ALLOW_THREADS | ||
| ret = fcntl(fd, (code & LOCK_NB) ? F_SETLK : F_SETLKW, &l); | ||
| Py_END_ALLOW_THREADS | ||
| } while (ret == -1 && errno == EINTR && !(async_err = PyErr_CheckSignals())); | ||
| } | ||
| #endif /* HAVE_FLOCK */ | ||
| if (ret < 0) { | ||
| PyErr_SetFromErrno(PyExc_OSError); | ||
| return NULL; | ||
| return !async_err ? PyErr_SetFromErrno(PyExc_OSError) : NULL; | ||
| } | ||
| Py_RETURN_NONE; | ||
| } | ||
| Expand Down Expand Up | @@ -363,6 +370,7 @@ fcntl_lockf_impl(PyObject *module, int fd, int code, PyObject *lenobj, | |
| /*[clinic end generated code: output=4985e7a172e7461a input=3a5dc01b04371f1a]*/ | ||
| { | ||
| int ret; | ||
| int async_err = 0; | ||
|
|
||
| #ifndef LOCK_SH | ||
| #define LOCK_SH 1 /* shared lock */ | ||
| Expand Down Expand Up | @@ -407,13 +415,14 @@ fcntl_lockf_impl(PyObject *module, int fd, int code, PyObject *lenobj, | |
| return NULL; | ||
| } | ||
| l.l_whence = whence; | ||
| Py_BEGIN_ALLOW_THREADS | ||
| ret = fcntl(fd, (code & LOCK_NB) ? F_SETLK : F_SETLKW, &l); | ||
| Py_END_ALLOW_THREADS | ||
| do { | ||
| Py_BEGIN_ALLOW_THREADS | ||
| ret = fcntl(fd, (code & LOCK_NB) ? F_SETLK : F_SETLKW, &l); | ||
| Py_END_ALLOW_THREADS | ||
| } while (ret == -1 && errno == EINTR && !(async_err = PyErr_CheckSignals())); | ||
| } | ||
| if (ret < 0) { | ||
| PyErr_SetFromErrno(PyExc_OSError); | ||
| return NULL; | ||
| return !async_err ? PyErr_SetFromErrno(PyExc_OSError) : NULL; | ||
| } | ||
| Py_RETURN_NONE; | ||
| } | ||
| Expand Down | ||
| Back | FazBrowse Home | New Git URL |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Choose a reason Spam Abuse Off Topic Outdated Duplicate Resolved Low QualityHere is a race condition that is kind of shared with all other tests in this file. We can not make sure that the function really blocked at least for some time. The race condition would be exposed under heavy load in which the main process was not given resources for at least self.sleep_time.
Sorry, something went wrong.
Uh oh!
There was an error while loading. Please reload this page.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Choose a reason Spam Abuse Off Topic Outdated Duplicate Resolved Low QualityTests are run sequentially, so it's not an issue. Moreover, regrtest ensures that TESTFN is unique between two working processes running Python tests.
Sorry, something went wrong.
Uh oh!
There was an error while loading. Please reload this page.