Page MenuHomeFreeBSD

D50849.id167975.diff
No OneTemporary

D50849.id167975.diff

diff --git a/sys/kern/sys_eventfd.c b/sys/kern/sys_eventfd.c
--- a/sys/kern/sys_eventfd.c
+++ b/sys/kern/sys_eventfd.c
@@ -40,6 +40,7 @@
#include <sys/mutex.h>
#include <sys/poll.h>
#include <sys/proc.h>
+#include <sys/refcount.h>
#include <sys/selinfo.h>
#include <sys/stat.h>
#include <sys/uio.h>
@@ -102,6 +103,7 @@
uint32_t efd_flags;
struct selinfo efd_sel;
struct mtx efd_lock;
+ int32_t efd_refcount;
};
int
@@ -119,6 +121,7 @@
efd->efd_count = initval;
mtx_init(&efd->efd_lock, "eventfd", NULL, MTX_DEF);
knlist_init_mtx(&efd->efd_sel.si_note, &efd->efd_lock);
+ refcount_init(&efd->efd_refcount, 1);
fflags = FREAD | FWRITE;
if ((flags & EFD_NONBLOCK) != 0)
@@ -128,16 +131,39 @@
return (0);
}
-static int
-eventfd_close(struct file *fp, struct thread *td)
+struct eventfd *
+eventfd_get(struct file *fp)
{
struct eventfd *efd;
+ if (fp->f_data == NULL || fp->f_ops != &eventfdops)
+ return (NULL);
+
efd = fp->f_data;
+ refcount_acquire(&efd->efd_refcount);
+
+ return (efd);
+}
+
+void
+eventfd_put(struct eventfd *efd)
+{
+ if (!refcount_release(&efd->efd_refcount))
+ return;
+
seldrain(&efd->efd_sel);
knlist_destroy(&efd->efd_sel.si_note);
mtx_destroy(&efd->efd_lock);
free(efd, M_EVENTFD);
+}
+
+static int
+eventfd_close(struct file *fp, struct thread *td)
+{
+ struct eventfd *efd;
+
+ efd = fp->f_data;
+ eventfd_put(efd);
return (0);
}
diff --git a/sys/sys/eventfd.h b/sys/sys/eventfd.h
--- a/sys/sys/eventfd.h
+++ b/sys/sys/eventfd.h
@@ -38,8 +38,12 @@
#ifdef _KERNEL
+struct eventfd;
+
int eventfd_create_file(struct thread *td, struct file *fp, uint32_t initval,
int flags);
+struct eventfd *eventfd_get(struct file *fp);
+void eventfd_put(struct eventfd *efd);
#else

File Metadata

Mime Type
text/plain
Expires
Tue, Jun 23, 3:06 AM (1 h, 46 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
34227354
Default Alt Text
D50849.id167975.diff (1 KB)

Event Timeline