Skip to content

Commit

Permalink
posix: eventfd: un-inline eventfd_read() and eventfd_write()
Browse files Browse the repository at this point in the history
There is no major benefit to haveing `eventfd_read()` and
`eventfd_write()` as `static inline` functions and it is
arguably much easier to solve the deadlock bug when they
are not `inline`.

Signed-off-by: Christopher Friedt <cfriedt@meta.com>
  • Loading branch information
cfriedt authored and nashif committed Jun 2, 2023
1 parent 0014dd0 commit 90343a1
Show file tree
Hide file tree
Showing 2 changed files with 38 additions and 34 deletions.
36 changes: 2 additions & 34 deletions include/zephyr/posix/sys/eventfd.h
Original file line number Diff line number Diff line change
Expand Up @@ -51,23 +51,7 @@ int eventfd(unsigned int initval, int flags);
*
* @return 0 on success, -1 on error
*/
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, &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;
}
int eventfd_read(int fd, eventfd_t *value);

/**
* @brief Write to an eventfd
Expand All @@ -77,23 +61,7 @@ static inline int eventfd_read(int fd, eventfd_t *value)
*
* @return 0 on success, -1 on error
*/
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, &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;
}
int eventfd_write(int fd, eventfd_t value);

#ifdef __cplusplus
}
Expand Down
36 changes: 36 additions & 0 deletions lib/posix/eventfd.c
Original file line number Diff line number Diff line change
Expand Up @@ -294,3 +294,39 @@ int eventfd(unsigned int initval, int flags)
k_mutex_unlock(&eventfd_mtx);
return fd;
}

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, &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;
}

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, &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;
}

0 comments on commit 90343a1

Please sign in to comment.