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 "async.h"
|
||||||
#include "log.h"
|
#include "log.h"
|
||||||
|
#include "util.h"
|
||||||
|
|
||||||
int asynchronous_job(void* (*func)(void *p), void *arg) {
|
int asynchronous_job(void* (*func)(void *p), void *arg) {
|
||||||
pthread_attr_t a;
|
pthread_attr_t a;
|
||||||
@ -70,3 +71,24 @@ int asynchronous_sync(void) {
|
|||||||
|
|
||||||
return asynchronous_job(sync_thread, NULL);
|
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_job(void* (*func)(void *p), void *arg);
|
||||||
|
|
||||||
int asynchronous_sync(void);
|
int asynchronous_sync(void);
|
||||||
|
int asynchronous_close(int fd);
|
||||||
|
Loading…
Reference in New Issue
Block a user