mirror of
https://github.com/systemd/systemd.git
synced 2024-11-06 08:26:52 +03:00
async: add asynchronous close() call
This commit is contained in:
parent
7348b3adb3
commit
8a474b0c04
@ -24,6 +24,7 @@
|
||||
|
||||
#include "async.h"
|
||||
#include "log.h"
|
||||
#include "util.h"
|
||||
|
||||
int asynchronous_job(void* (*func)(void *p), void *arg) {
|
||||
pthread_attr_t a;
|
||||
@ -70,3 +71,24 @@ int asynchronous_sync(void) {
|
||||
|
||||
return asynchronous_job(sync_thread, NULL);
|
||||
}
|
||||
|
||||
static void *close_thread(void *p) {
|
||||
safe_close(PTR_TO_INT(p));
|
||||
return NULL;
|
||||
}
|
||||
|
||||
int asynchronous_close(int fd) {
|
||||
int r;
|
||||
|
||||
/* This is supposed to behave similar to safe_close(), but
|
||||
* actually invoke close() asynchronously, so that it will
|
||||
* never block. Ideally the kernel would have an API for this,
|
||||
* but it doesn't, so we work around it, and hide this as a
|
||||
* far away as we can. */
|
||||
|
||||
r = asynchronous_job(close_thread, INT_TO_PTR(fd));
|
||||
if (r < 0)
|
||||
safe_close(fd);
|
||||
|
||||
return -1;
|
||||
}
|
||||
|
@ -22,4 +22,6 @@
|
||||
***/
|
||||
|
||||
int asynchronous_job(void* (*func)(void *p), void *arg);
|
||||
|
||||
int asynchronous_sync(void);
|
||||
int asynchronous_close(int fd);
|
||||
|
Loading…
Reference in New Issue
Block a user