Skip to content

[components][lwp] Add sigaction support siginfo #10057

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 1 commit into
base: master
Choose a base branch
from
Open
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
17 changes: 15 additions & 2 deletions components/libc/compilers/common/ctime.c
Original file line number Diff line number Diff line change
Expand Up @@ -828,20 +828,27 @@ struct lwp_timer_event_param
pid_t pid;
};
int signo;
union sigval sigval;
};

static void _lwp_timer_event_from_tid(struct rt_work *work, void *param)
{
rt_err_t ret;
struct lwp_timer_event_param *data = rt_container_of(work, struct lwp_timer_event_param, work);
rt_thread_t thread;
lwp_siginfo_ext_t ext;

RT_ASSERT(data->tid);

/* stop others from delete thread */
thread = lwp_tid_get_thread_and_inc_ref(data->tid);
/** The tid of thread is a READ ONLY value, but here still facing the risk of thread already been delete error */
ret = lwp_thread_signal_kill(thread, data->signo, SI_TIMER, 0);
ext = rt_malloc(sizeof(struct lwp_siginfo_ext));
if (ext)
{
ext->sigval = data->sigval;
}
ret = lwp_thread_signal_kill(thread, data->signo, SI_TIMER, ext);
lwp_tid_dec_ref(thread);

if (ret)
Expand All @@ -855,14 +862,20 @@ static void _lwp_timer_event_from_pid(struct rt_work *work, void *param)
rt_err_t ret;
struct lwp_timer_event_param *data = rt_container_of(work, struct lwp_timer_event_param, work);
struct rt_lwp *lwp;
lwp_siginfo_ext_t ext;

lwp_pid_lock_take();
lwp = lwp_from_pid_locked(data->pid);
if (lwp)
lwp_ref_inc(lwp);
lwp_pid_lock_release();

ret = lwp_signal_kill(lwp, data->signo, SI_TIMER, 0);
ext = rt_malloc(sizeof(struct lwp_siginfo_ext));
if (ext)
{
ext->sigval = data->sigval;
}
ret = lwp_signal_kill(lwp, data->signo, SI_TIMER, ext);
if (lwp)
lwp_ref_dec(lwp);

Expand Down
6 changes: 6 additions & 0 deletions components/lwp/lwp_signal.c
Original file line number Diff line number Diff line change
Expand Up @@ -347,6 +347,8 @@ RT_STATIC_ASSERT(lp_width_same, sizeof(void *) == sizeof(long));
rt_inline void siginfo_k2u(lwp_siginfo_t ksigi, siginfo_t *usigi)
{
int signo = ksigi->ksiginfo.signo;

memset(usigi, 0, sizeof(siginfo_t));
usigi->si_code = ksigi->ksiginfo.code;
usigi->si_signo = signo;
usigi->si_pid = ksigi->ksiginfo.from_pid;
Expand All @@ -359,6 +361,10 @@ rt_inline void siginfo_k2u(lwp_siginfo_t ksigi, siginfo_t *usigi)
usigi->si_utime = ksigi->ext->sigchld.stime;
usigi->si_stime = ksigi->ext->sigchld.utime;
}
else
{
usigi->si_value = ksigi->ext->sigval;
}
}

/* deprecated field */
Expand Down
1 change: 1 addition & 0 deletions include/rtdef.h
Original file line number Diff line number Diff line change
Expand Up @@ -804,6 +804,7 @@ typedef struct lwp_siginfo_ext {
clock_t utime;
clock_t stime;
} sigchld;
union sigval sigval;
};
} *lwp_siginfo_ext_t;

Expand Down