Skip to content
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));
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)
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