mirror of
https://github.com/systemd/systemd.git
synced 2024-12-23 21:35:11 +03:00
util: *DO NOT* loop for EINTR handling with close_nointr()
See the linked references for why we should not do this.
This commit is contained in:
parent
2a2473d89e
commit
b0ee8068da
@ -183,19 +183,26 @@ bool first_word(const char *s, const char *word) {
|
||||
}
|
||||
|
||||
int close_nointr(int fd) {
|
||||
assert(fd >= 0);
|
||||
|
||||
for (;;) {
|
||||
int r;
|
||||
|
||||
assert(fd >= 0);
|
||||
r = close(fd);
|
||||
if (r >= 0)
|
||||
return r;
|
||||
|
||||
if (errno != EINTR)
|
||||
/* Just ignore EINTR; a retry loop is the wrong
|
||||
* thing to do on Linux.
|
||||
*
|
||||
* http://lkml.indiana.edu/hypermail/linux/kernel/0509.1/0877.html
|
||||
* https://bugzilla.gnome.org/show_bug.cgi?id=682819
|
||||
* http://utcc.utoronto.ca/~cks/space/blog/unix/CloseEINTR
|
||||
* https://sites.google.com/site/michaelsafyan/software-engineering/checkforeintrwheninvokingclosethinkagain
|
||||
*/
|
||||
if (_unlikely_(r < 0 && errno == EINTR))
|
||||
return 0;
|
||||
else if (r >= 0)
|
||||
return r;
|
||||
else
|
||||
return -errno;
|
||||
}
|
||||
}
|
||||
|
||||
void close_nointr_nofail(int fd) {
|
||||
int saved_errno = errno;
|
||||
|
Loading…
Reference in New Issue
Block a user