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
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
@@ -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));
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

我有错过了什么吗?这里有对应的内存分配,后续没有释放的,会出现泄漏的情况?

if (ext)
{
ext->sigval = data->sigval;
}
ret = lwp_thread_signal_kill(thread, data->signo, SI_TIMER, ext);
lwp_tid_dec_ref(thread);

if (ret)
@@ -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);

6 changes: 6 additions & 0 deletions components/lwp/lwp_signal.c
Original file line number Diff line number Diff line change
@@ -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;
@@ -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 */
1 change: 1 addition & 0 deletions include/rtdef.h
Original file line number Diff line number Diff line change
@@ -804,6 +804,7 @@ typedef struct lwp_siginfo_ext {
clock_t utime;
clock_t stime;
} sigchld;
union sigval sigval;
};
} *lwp_siginfo_ext_t;