Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
67 changes: 46 additions & 21 deletions components/libc/posix/io/epoll/epoll.c
Original file line number Diff line number Diff line change
Expand Up @@ -164,7 +164,7 @@ static int epoll_poll(struct dfs_file *file, struct rt_pollreq *req)
fdlist = fdlist->next;
mask = epoll_get_event(fdlist, &fdlist->req);

if (mask & fdlist->epev.events)
if (mask & fdlist->revents)
{
events |= mask | POLLIN | EPOLLRDNORM;
break;
Expand Down Expand Up @@ -221,7 +221,7 @@ static int epoll_rdlist_add(struct rt_fd_list *fdl, rt_uint32_t revents)
if (rdlist != RT_NULL)
{
rdlist->rdl_event = fdl;
rdlist->rdl_event->epev.events = fdl->epev.events & revents;
rdlist->rdl_event->epev.events = fdl->revents & revents;
rdlist->next = ep->rdlist->next;
rdlist->exclusive = 0;
ep->rdlist->next = rdlist;
Expand Down Expand Up @@ -250,7 +250,7 @@ static int epoll_wqueue_callback(struct rt_wqueue_node *wait, void *key)

fdlist = rt_container_of(wait, struct rt_fd_list, wqn);

if (fdlist->epev.events)
if (fdlist->revents)
{
epoll_rdlist_add(fdlist, (rt_ubase_t)key);
}
Expand Down Expand Up @@ -279,10 +279,10 @@ static void epoll_ctl_install(struct rt_fd_list *fdlist, struct rt_eventpoll *ep
{
rt_uint32_t mask = 0;

fdlist->req._key = fdlist->epev.events;
fdlist->req._key = fdlist->revents;

mask = epoll_get_event(fdlist, &fdlist->req);
if (mask & fdlist->epev.events)
if (mask & fdlist->revents)
{
epoll_rdlist_add(fdlist, mask);
}
Expand Down Expand Up @@ -317,6 +317,10 @@ static int epoll_epf_init(int fd)

rt_mutex_init(&ep->lock, EPOLL_MUTEX_NAME, RT_IPC_FLAG_FIFO);

#ifdef RT_USING_DFS_V2
df->fops = &epoll_fops;
#endif

df->vnode = (struct dfs_vnode *)rt_malloc(sizeof(struct dfs_vnode));
if (df->vnode)
{
Expand Down Expand Up @@ -353,13 +357,13 @@ static int epoll_epf_init(int fd)

static int epoll_do_create(int size)
{
rt_err_t ret = 0;
rt_err_t ret = -1;
int status;
int fd;

if (size < 0)
{
ret = -EINVAL;
rt_set_errno(EINVAL);
}
else
{
Expand All @@ -371,12 +375,12 @@ static int epoll_do_create(int size)
if (status < 0)
{
fd_release(fd);
ret = status;
rt_set_errno(-status);
}
}
else
{
ret = fd;
rt_set_errno(-fd);
}
}

Expand Down Expand Up @@ -518,23 +522,31 @@ static int epoll_do_ctl(int epfd, int op, int fd, struct epoll_event *event)
{
struct dfs_file *epdf;
struct rt_eventpoll *ep;
rt_err_t ret = -EINVAL;
rt_err_t ret = 0;

if (op & ~EFD_SHARED_EPOLL_TYPE)
return -EINVAL;
{
rt_set_errno(EINVAL);
return -1;
}

if ((epfd == fd) || (epfd < 0) || (fd < 0) || (event->data.fd != fd))
return -EINVAL;
{
rt_set_errno(EINVAL);
return -1;
}

if (!(event->events & EPOLLEXCLUSIVE_BITS))
return -EINVAL;
{
rt_set_errno(EINVAL);
return -1;
}

epdf = fd_get(epfd);

if (epdf->vnode->data)
{
ep = epdf->vnode->data;
ret = 0;

rt_mutex_take(&ep->lock, RT_WAITING_FOREVER);

Expand All @@ -550,12 +562,18 @@ static int epoll_do_ctl(int epfd, int op, int fd, struct epoll_event *event)
ret = epoll_ctl_mod(epdf, event);
break;
default:
ret = -EINVAL;
rt_set_errno(EINVAL);
break;
}
}

rt_mutex_release(&ep->lock);
if (ret < 0)
{
rt_set_errno(-ret);
ret = -1;
}

rt_mutex_release(&ep->lock);
}

return ret;
}
Expand Down Expand Up @@ -613,13 +631,13 @@ static int epoll_get_event(struct rt_fd_list *fl, rt_pollreq_t *req)
{
if (df->vnode->fops->poll)
{
req->_key = fl->epev.events | POLLERR | POLLHUP;
req->_key = fl->revents | POLLERR | POLLHUP;
mask = df->vnode->fops->poll(df, req);
if (mask < 0)
return mask;
}

mask &= fl->epev.events | EPOLLOUT | POLLERR;
mask &= fl->revents | EPOLLOUT | POLLERR;
}
}

Expand Down Expand Up @@ -659,7 +677,8 @@ static int epoll_do(struct rt_eventpoll *ep, struct epoll_event *events, int max
if (rdlist->rdl_event->revents & EPOLLET)
{
rt_wqueue_remove(&rdlist->rdl_event->wqn);
epoll_get_event(rdlist->rdl_event, &rdlist->rdl_event->req);
mask = epoll_get_event(rdlist->rdl_event, &rdlist->rdl_event->req);
rdlist->rdl_event->epev.events = mask & rdlist->rdl_event->revents;
isfree = 1;
}
else
Expand Down Expand Up @@ -729,7 +748,7 @@ static int epoll_do_wait(int epfd, struct epoll_event *events, int maxevents, in
struct rt_eventpoll *ep;
struct dfs_file *df;
lwp_sigset_t old_sig, new_sig;
rt_err_t ret = -EINVAL;
rt_err_t ret = 0;

if (ss)
{
Expand All @@ -755,6 +774,12 @@ static int epoll_do_wait(int epfd, struct epoll_event *events, int maxevents, in
lwp_thread_signal_mask(rt_thread_self(), LWP_SIG_MASK_CMD_SET_MASK, &old_sig, RT_NULL);
}

if (ret < 0)
{
rt_set_errno(-ret);
ret = -1;
}

return ret;
}

Expand Down
37 changes: 22 additions & 15 deletions components/libc/posix/io/eventfd/eventfd.c
Original file line number Diff line number Diff line change
Expand Up @@ -40,13 +40,13 @@ struct eventfd_ctx
#ifndef RT_USING_DFS_V2
static int eventfd_close(struct dfs_file *file);
static int eventfd_poll(struct dfs_file *file, struct rt_pollreq *req);
static int eventfd_read(struct dfs_file *file, void *buf, size_t count);
static int eventfd_write(struct dfs_file *file, const void *buf, size_t count);
static ssize_t eventfd_read(struct dfs_file *file, void *buf, size_t count);
static ssize_t eventfd_write(struct dfs_file *file, const void *buf, size_t count);
#else
static int eventfd_close(struct dfs_file *file);
static int eventfd_poll(struct dfs_file *file, struct rt_pollreq *req);
static int eventfd_read(struct dfs_file *file, void *buf, size_t count, off_t *pos);
static int eventfd_write(struct dfs_file *file, const void *buf, size_t count, off_t *pos);
static ssize_t eventfd_read(struct dfs_file *file, void *buf, size_t count, off_t *pos);
static ssize_t eventfd_write(struct dfs_file *file, const void *buf, size_t count, off_t *pos);
#endif

static const struct dfs_file_ops eventfd_fops =
Expand Down Expand Up @@ -76,7 +76,6 @@ static int eventfd_poll(struct dfs_file *file, struct rt_pollreq *req)
count = ctx->count;

rt_poll_add(&ctx->reader_queue, req);
rt_poll_add(&ctx->writer_queue, req);

if (count > 0)
events |= POLLIN;
Expand All @@ -91,9 +90,9 @@ static int eventfd_poll(struct dfs_file *file, struct rt_pollreq *req)
}

#ifndef RT_USING_DFS_V2
static int eventfd_read(struct dfs_file *file, void *buf, size_t count)
static ssize_t eventfd_read(struct dfs_file *file, void *buf, size_t count)
#else
static int eventfd_read(struct dfs_file *file, void *buf, size_t count, off_t *pos)
static ssize_t eventfd_read(struct dfs_file *file, void *buf, size_t count, off_t *pos)
#endif
{
struct eventfd_ctx *ctx = (struct eventfd_ctx *)file->vnode->data;
Expand All @@ -107,7 +106,7 @@ static int eventfd_read(struct dfs_file *file, void *buf, size_t count, off_t *p

rt_mutex_take(&ctx->lock, RT_WAITING_FOREVER);

if (ctx->count == 0)
if (ctx->count <= 0)
{
if (file->flags & O_NONBLOCK)
{
Expand Down Expand Up @@ -135,7 +134,6 @@ static int eventfd_read(struct dfs_file *file, void *buf, size_t count, off_t *p
}

ctx->count -= counter_num;

(*buffer) = counter_num;

rt_mutex_release(&ctx->lock);
Expand All @@ -144,9 +142,9 @@ static int eventfd_read(struct dfs_file *file, void *buf, size_t count, off_t *p
}

#ifndef RT_USING_DFS_V2
static int eventfd_write(struct dfs_file *file, const void *buf, size_t count)
static ssize_t eventfd_write(struct dfs_file *file, const void *buf, size_t count)
#else
static int eventfd_write(struct dfs_file *file, const void *buf, size_t count, off_t *pos)
static ssize_t eventfd_write(struct dfs_file *file, const void *buf, size_t count, off_t *pos)
#endif
{
struct eventfd_ctx *ctx = (struct eventfd_ctx *)file->vnode->data;
Expand Down Expand Up @@ -182,7 +180,6 @@ static int eventfd_write(struct dfs_file *file, const void *buf, size_t count, o
/* Release the mutex to avoid a deadlock */
rt_mutex_release(&ctx->lock);
rt_wqueue_wait(&ctx->writer_queue, 0, RT_WAITING_FOREVER);
rt_wqueue_wakeup(&ctx->reader_queue, (void *)POLLIN);
rt_mutex_take(&ctx->lock, RT_WAITING_FOREVER);
}
}
Expand Down Expand Up @@ -232,6 +229,11 @@ static int rt_eventfd_create(struct dfs_file *df, unsigned int count, int flags)
rt_free(ctx);
ret = -ENOMEM;
}

#ifdef RT_USING_DFS_V2
df->fops = &eventfd_fops;
#endif

}

return ret;
Expand All @@ -245,7 +247,10 @@ static int do_eventfd(unsigned int count, int flags)
rt_ssize_t ret = 0;

if (flags & ~EFD_FLAGS_SET)
return -RT_EINVAL;
{
rt_set_errno(EINVAL);
return -1;
}

fd = fd_new();
if (fd >= 0)
Expand All @@ -257,12 +262,14 @@ static int do_eventfd(unsigned int count, int flags)
if (status < 0)
{
fd_release(fd);
ret = status;
rt_set_errno(-status);
ret = -1;
}
}
else
{
ret = fd;
rt_set_errno(-fd);
ret = -1;
}

return ret;
Expand Down