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 <jukka.rissanen@linux.intel.com>
This commit is contained in:
Jukka Rissanen 2020-07-23 13:55:46 +03:00 committed by Kumar Gala
commit b0d9ea1308

View file

@ -7,6 +7,7 @@
#ifndef ZEPHYR_INCLUDE_POSIX_SYS_EVENTFD_H_
#define ZEPHYR_INCLUDE_POSIX_SYS_EVENTFD_H_
#include <zephyr.h>
#include <sys/fdtable.h>
#include <sys/types.h>
@ -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;
}