mirror of
https://github.com/RT-Thread/rt-thread.git
synced 2026-11-09 20:45:41 +08:00
Add the system call signalfd (#8001)
This commit is contained in:
1 parent
e8e980879e
commit
7c3d966df6
5 files changed
+410
No files matched your search
@@ -0,0 +1,15 @@
|
||||
# RT-Thread building script for component
|
||||
|
||||
from building import *
|
||||
|
||||
cwd = GetCurrentDir()
|
||||
src = []
|
||||
CPPPATH = [cwd]
|
||||
|
||||
if GetDepend('RT_USING_DFS'):
|
||||
if GetDepend('RT_USING_MUSLLIBC'):
|
||||
src += ['signalfd.c']
|
||||
|
||||
group = DefineGroup('POSIX', src, depend = ['RT_USING_SMART'], CPPPATH = CPPPATH)
|
||||
|
||||
Return('group')
|
||||
File diff suppressed because it is too large.
Load diff
@@ -68,6 +68,13 @@ struct rt_lwp_objs
|
||||
struct rt_mem_obj mem_obj;
|
||||
};
|
||||
|
||||
struct rt_lwp_notify
|
||||
{
|
||||
void (*notify)(rt_wqueue_t *signalfd_queue, int signo);
|
||||
rt_wqueue_t *signalfd_queue;
|
||||
rt_slist_t list_node;
|
||||
};
|
||||
|
||||
struct rt_lwp
|
||||
{
|
||||
#ifdef ARCH_MM_MMU
|
||||
@@ -131,6 +138,8 @@ struct rt_lwp
|
||||
int debug;
|
||||
uint32_t bak_first_ins;
|
||||
|
||||
rt_slist_t signalfd_notify_head;
|
||||
|
||||
#ifdef LWP_ENABLE_ASID
|
||||
uint64_t generation;
|
||||
unsigned int asid;
|
||||
|
||||
@@ -392,6 +392,20 @@ void lwp_sigqueue_clear(lwp_sigqueue_t sigq)
|
||||
}
|
||||
}
|
||||
|
||||
static void lwp_signal_notify(rt_slist_t *list_head, lwp_siginfo_t siginfo)
|
||||
{
|
||||
rt_slist_t *node;
|
||||
|
||||
rt_slist_for_each(node, list_head)
|
||||
{
|
||||
struct rt_lwp_notify *n = rt_slist_entry(node, struct rt_lwp_notify, list_node);
|
||||
if (n->notify)
|
||||
{
|
||||
n->notify(n->signalfd_queue, siginfo->ksiginfo.signo);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
rt_err_t lwp_signal_init(struct lwp_signal *sig)
|
||||
{
|
||||
rt_err_t rc;
|
||||
@@ -704,6 +718,7 @@ rt_err_t lwp_signal_kill(struct rt_lwp *lwp, long signo, long code, long value)
|
||||
{
|
||||
need_schedule = _siginfo_deliver_to_lwp(lwp, siginfo);
|
||||
ret = 0;
|
||||
lwp_signal_notify(&lwp->signalfd_notify_head, siginfo);
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -856,6 +871,7 @@ rt_err_t lwp_thread_signal_kill(rt_thread_t thread, long signo, long code, long
|
||||
{
|
||||
need_schedule = _siginfo_deliver_to_thread(thread, siginfo);
|
||||
ret = 0;
|
||||
lwp_signal_notify(&lwp->signalfd_notify_head, siginfo);
|
||||
}
|
||||
else
|
||||
{
|
||||
|
||||
@@ -53,6 +53,10 @@
|
||||
#include <stdio.h> /* rename() */
|
||||
#include <sys/stat.h>
|
||||
#include <sys/statfs.h> /* statfs() */
|
||||
#include <sys/timerfd.h>
|
||||
#ifdef RT_USING_MUSLLIBC
|
||||
#include <sys/signalfd.h>
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#include "mqueue.h"
|
||||
@@ -5416,6 +5420,15 @@ sysret_t sys_epoll_pwait(int fd,
|
||||
return (ret < 0 ? GET_ERRNO() : ret);
|
||||
}
|
||||
|
||||
sysret_t sys_ftruncate(int fd, off_t length)
|
||||
{
|
||||
int ret;
|
||||
|
||||
ret = ftruncate(fd, length);
|
||||
|
||||
return (ret < 0 ? GET_ERRNO() : ret);
|
||||
}
|
||||
|
||||
sysret_t sys_chmod(const char *fileName, mode_t mode)
|
||||
{
|
||||
char *copy_fileName;
|
||||
@@ -5563,6 +5576,54 @@ ssize_t sys_pwrite64(int fd, void *buf, int size, off_t offset)
|
||||
}
|
||||
#endif
|
||||
|
||||
sysret_t sys_timerfd_create(int clockid, int flags)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
sysret_t sys_timerfd_settime(int fd, int flags, const struct itimerspec *new, struct itimerspec *old)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
sysret_t sys_timerfd_gettime(int fd, struct itimerspec *cur)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
sysret_t sys_signalfd(int fd, const sigset_t *mask, int flags)
|
||||
{
|
||||
int ret = 0;
|
||||
sigset_t *kmask = RT_NULL;
|
||||
|
||||
#ifdef RT_USING_MUSLLIBC
|
||||
if (mask == RT_NULL)
|
||||
return -EINVAL;
|
||||
|
||||
if (!lwp_user_accessable((void *)mask, sizeof(struct itimerspec)))
|
||||
{
|
||||
return -EFAULT;
|
||||
}
|
||||
|
||||
kmask = kmem_get(sizeof(*kmask));
|
||||
|
||||
if (kmask)
|
||||
{
|
||||
lwp_get_from_user(kmask, (void *)mask, sizeof(*kmask));
|
||||
ret = signalfd(fd, mask, flags);
|
||||
lwp_put_to_user((void *)mask, kmask, sizeof(*kmask));
|
||||
kmem_put(kmask);
|
||||
}
|
||||
#endif
|
||||
|
||||
return (ret < 0 ? GET_ERRNO() : ret);
|
||||
}
|
||||
|
||||
sysret_t sys_memfd_create()
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
const static struct rt_syscall_def func_table[] =
|
||||
{
|
||||
SYSCALL_SIGN(sys_exit), /* 01 */
|
||||
@@ -5798,6 +5859,13 @@ const static struct rt_syscall_def func_table[] =
|
||||
SYSCALL_SIGN(sys_epoll_create1),
|
||||
SYSCALL_SIGN(sys_epoll_ctl),
|
||||
SYSCALL_SIGN(sys_epoll_pwait),
|
||||
SYSCALL_SIGN(sys_notimpl), /* 195 */
|
||||
SYSCALL_SIGN(sys_timerfd_create),
|
||||
SYSCALL_SIGN(sys_timerfd_settime),
|
||||
SYSCALL_SIGN(sys_timerfd_gettime),
|
||||
SYSCALL_SIGN(sys_signalfd),
|
||||
SYSCALL_SIGN(sys_memfd_create), /* 200 */
|
||||
SYSCALL_SIGN(sys_ftruncate),
|
||||
};
|
||||
|
||||
const void *lwp_get_sys_api(rt_uint32_t number)
|
||||
|
||||
Reference in new issue
Block a user