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 {
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; }