示例#1
0
int rt_thread_kill(rt_thread_t tid, int sig)
{
    siginfo_t si;
	rt_base_t level;
	struct siginfo_node *si_node;

    RT_ASSERT(tid != RT_NULL);
    if (!sig_valid(sig)) return -RT_EINVAL;

    dbg_log(DBG_INFO, "send signal: %d\n", sig);
    si.si_errno = RT_EINTR;
    si.si_signo = sig;
    si.si_code  = SI_USER;
    si.si_value.sival_ptr = RT_NULL;

	level = rt_hw_interrupt_disable();
    if (tid->sig_pending & sig_mask(sig))
    {
        /* whether already emits this signal? */
        struct rt_slist_node *node;
        struct siginfo_node  *entry;

		node = (struct rt_slist_node *)tid->si_list;
		rt_hw_interrupt_enable(level);

		/* update sig infor */
		rt_enter_critical();
        for (; (node) != RT_NULL; node = node->next)
        {
            entry = rt_slist_entry(node, struct siginfo_node, list);
            if (entry->si.si_signo == sig)
            {
                memcpy(&(entry->si), &si, sizeof(siginfo_t));
				rt_exit_critical();
                return 0;
            }
        }
		rt_exit_critical();

		/* disable interrupt to protect tcb */
		level = rt_hw_interrupt_disable();
    }
	else
	{
示例#2
0
Signature *signature_to_proto(const tal_t *ctx, const struct signature *sig)
{
    Signature *pb = tal(ctx, Signature);
    signature__init(pb);

    assert(sig_valid(sig));

    /* Kill me now... */
    memcpy(&pb->r1, sig->r, 8);
    memcpy(&pb->r2, sig->r + 8, 8);
    memcpy(&pb->r3, sig->r + 16, 8);
    memcpy(&pb->r4, sig->r + 24, 8);
    memcpy(&pb->s1, sig->s, 8);
    memcpy(&pb->s2, sig->s + 8, 8);
    memcpy(&pb->s3, sig->s + 16, 8);
    memcpy(&pb->s4, sig->s + 24, 8);

    return pb;
}