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:
parent
dde03c6770
commit
b0d9ea1308
1 changed files with 13 additions and 2 deletions
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue