summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorzmq810150896 <[email protected]>2023-08-03 21:45:30 +0800
committerGitHub <[email protected]>2023-08-03 21:45:30 +0800
commit2aa1056f1943223d26b0d903fab47b1f5ce6ba5a (patch)
tree0a24ef4e2bee8275b516ac281e4b05297b86680b
parent325c3d2a484fab53e6e3f543a9cd517dd694fb89 (diff)
Add fops for dfs_v2 and rt_set_errno (#7910)
-rw-r--r--components/libc/posix/io/epoll/epoll.c67
-rw-r--r--components/libc/posix/io/eventfd/eventfd.c37
2 files changed, 68 insertions, 36 deletions
diff --git a/components/libc/posix/io/epoll/epoll.c b/components/libc/posix/io/epoll/epoll.c
index 1b63f79929..f5d4cbd938 100644
--- a/components/libc/posix/io/epoll/epoll.c
+++ b/components/libc/posix/io/epoll/epoll.c
@@ -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;
@@ -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;
@@ -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);
}
@@ -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);
}
@@ -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)
{
@@ -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
{
@@ -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);
}
}
@@ -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);
@@ -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;
}
@@ -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;
}
}
@@ -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
@@ -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)
{
@@ -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;
}
diff --git a/components/libc/posix/io/eventfd/eventfd.c b/components/libc/posix/io/eventfd/eventfd.c
index 1d6c79b809..b4dddc00f8 100644
--- a/components/libc/posix/io/eventfd/eventfd.c
+++ b/components/libc/posix/io/eventfd/eventfd.c
@@ -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 =
@@ -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;
@@ -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;
@@ -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)
{
@@ -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);
@@ -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;
@@ -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);
}
}
@@ -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;
@@ -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)
@@ -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;