From b0d9ea13085d69364d45b4d9f82416614f51a989 Mon Sep 17 00:00:00 2001 From: Jukka Rissanen Date: Thu, 23 Jul 2020 13:55:46 +0300 Subject: [PATCH] sys: eventfd: Add locking to eventfd_read/write functions The fdtable infrastructure provides a possibility to prevent concurrent access to file descriptor. Use that functionality in eventfd API. Signed-off-by: Jukka Rissanen --- include/posix/sys/eventfd.h | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/include/posix/sys/eventfd.h b/include/posix/sys/eventfd.h index 5b0388e5e64..efce22b8ae6 100644 --- a/include/posix/sys/eventfd.h +++ b/include/posix/sys/eventfd.h @@ -7,6 +7,7 @@ #ifndef ZEPHYR_INCLUDE_POSIX_SYS_EVENTFD_H_ #define ZEPHYR_INCLUDE_POSIX_SYS_EVENTFD_H_ +#include #include #include @@ -53,13 +54,18 @@ int eventfd(unsigned int initval, int flags); static inline int eventfd_read(int fd, eventfd_t *value) { const struct fd_op_vtable *efd_vtable; + struct k_mutex *lock; ssize_t ret; void *obj; - obj = z_get_fd_obj_and_vtable(fd, &efd_vtable); + obj = z_get_fd_obj_and_vtable(fd, &efd_vtable, &lock); + + (void)k_mutex_lock(lock, K_FOREVER); ret = efd_vtable->read(obj, value, sizeof(*value)); + k_mutex_unlock(lock); + return ret == sizeof(eventfd_t) ? 0 : -1; } @@ -74,13 +80,18 @@ static inline int eventfd_read(int fd, eventfd_t *value) static inline int eventfd_write(int fd, eventfd_t value) { const struct fd_op_vtable *efd_vtable; + struct k_mutex *lock; ssize_t ret; void *obj; - obj = z_get_fd_obj_and_vtable(fd, &efd_vtable); + obj = z_get_fd_obj_and_vtable(fd, &efd_vtable, &lock); + + (void)k_mutex_lock(lock, K_FOREVER); ret = efd_vtable->write(obj, &value, sizeof(value)); + k_mutex_unlock(lock); + return ret == sizeof(eventfd_t) ? 0 : -1; }