void *SB_Thread::Thread::disp(void *pp_arg) { const char *WHERE = "Thread::start(via)"; char la_name[100]; void *lp_fun; void *lp_ret; lp_fun = SB_CB_TO_PTR(iv_fun); if (gv_sb_trace_thread) { la_name[sizeof(la_name) - 1] = '\0'; strncpy(la_name, ip_name, sizeof(la_name) - 1); trace_where_printf(WHERE, "thread started name=%s, fun=%p, arg=%p\n", la_name, lp_fun, pp_arg); } SB_UTRACE_API_ADD3(SB_UTRACE_API_OP_THREAD_START_DISP1, gettid(), reinterpret_cast<SB_Utrace_API_Info_Type>(lp_fun)); lp_ret = iv_fun(pp_arg); SB_UTRACE_API_ADD3(SB_UTRACE_API_OP_THREAD_EXIT_DISP1, gettid(), reinterpret_cast<SB_Utrace_API_Info_Type>(lp_fun)); if (gv_sb_trace_thread) trace_where_printf(WHERE, "thread exiting name=%s, fun=%p, arg=%p, ret=%p\n", la_name, lp_fun, pp_arg, lp_ret); return lp_ret; }
// // Purpose: A near close to XSIGNALTIMEOUT, but callback is called on to // SB_Export int timer_start_cb(int pv_toval, short pv_parm1, long pv_parm2, short *pp_tleid, Timer_Cb_Type pv_callback) { const char *WHERE = "timer_start_cb"; void *lp_cb; short lv_fserr; SB_API_CTR (lv_zctr, TIMER_START_CB); if (gv_ms_trace_params) { lp_cb = SB_CB_TO_PTR(pv_callback); trace_where_printf(WHERE, "ENTER toval=%d, parm1=%d(0x%x), parm2=%ld(0x%lx), tleid=%p, cb=%p\n", pv_toval, pv_parm1, pv_parm1, pv_parm2, pv_parm2, pfp(pp_tleid), lp_cb); } lv_fserr = sb_timer_start_com(WHERE, false, TIMER_TLE_KIND_CB, pv_toval, pv_parm1, pv_parm2, pp_tleid, 0, NULL, pv_callback); return ms_err_rtn(lv_fserr); }
// // print timer list // void sb_timer_timer_list_print() { char la_info[50]; char la_to[40]; Timer_TLE_Type *lp_tle; Timer_TLE_Type *lp_tle_prev; lp_tle = gp_timer_head; lp_tle_prev = NULL; if (lp_tle != NULL) trace_printf("TIMER timer list\n"); while (lp_tle != NULL) { sb_timer_to_fmt(la_to, lp_tle->iv_to); switch (lp_tle->iv_kind) { case TIMER_TLE_KIND_CB: sprintf(la_info, "cb=%p", SB_CB_TO_PTR(lp_tle->iv_cb)); break; case TIMER_TLE_KIND_COMPQ: sprintf(la_info, "q=%p", pfp(lp_tle->ip_comp_q)); break; default: strcpy(la_info, "?"); SB_util_abort("invalid iv_kind"); // sw fault break; } trace_printf("tle id=%d, addr=%p, p=%p, n=%p, %s, stid=%d, ttid=%d, mgr=%p, to=%s, toval=%d, p1=%d(0x%x), p2=%ld(0x%lx)\n", lp_tle->iv_tleid, pfp(lp_tle), pfp(lp_tle->ip_prev), pfp(lp_tle->ip_next), la_info, lp_tle->iv_stid, lp_tle->iv_ttid, pfp(lp_tle->ip_mgr), la_to, lp_tle->iv_toval, lp_tle->iv_parm1, lp_tle->iv_parm1, lp_tle->iv_parm2, lp_tle->iv_parm2); SB_util_assert_peq(lp_tle->ip_prev, lp_tle_prev); lp_tle_prev = lp_tle; lp_tle = lp_tle->ip_next; } }
// // complete timer list // void sb_timer_timer_list_complete(const char *pp_where) { char la_to[40]; void *lp_cb; SB_Timer_Comp_Queue *lp_comp_q; SB_Ms_Event_Mgr *lp_mgr; Timer_TLE_Type *lp_tle; SB_To lv_over; int lv_status; short lv_tle_tleid; int lv_tle_toval; short lv_tle_parm1; long lv_tle_parm2; SB_To lv_to; lv_to = sb_timer_to_calc(0); // process the head TLEs do { lp_tle = gp_timer_head; if (lp_tle == NULL) break; if (lp_tle->iv_to > lv_to) break; gp_timer_head = gp_timer_head->ip_next; if (gp_timer_head == NULL) gp_timer_tail = NULL; else gp_timer_head->ip_prev = NULL; lp_comp_q = lp_tle->ip_comp_q; if (gv_ms_trace_timer) { lv_over = lv_to - lp_tle->iv_to; sb_timer_to_fmt(la_to, lp_tle->iv_to); switch (lp_tle->iv_kind) { case TIMER_TLE_KIND_CB: lp_cb = SB_CB_TO_PTR(lp_tle->iv_cb); trace_where_printf(pp_where, "callback TLE to cb=%p, stid=%d, tleid=%d, to=%s, over=%lld\n", lp_cb, lp_tle->iv_stid, lp_tle->iv_tleid, la_to, lv_over); break; case TIMER_TLE_KIND_COMPQ: trace_where_printf(pp_where, "adding TLE to comp-q q=%p, stid=%d, ttid=%d, mgr=%p, tleid=%d, to=%s, over=%lld\n", pfp(lp_comp_q), lp_tle->iv_stid, lp_tle->iv_ttid, pfp(lp_tle->ip_mgr), lp_tle->iv_tleid, la_to, lv_over); break; default: SB_util_abort("invalid iv_kind"); // sw fault } } lp_mgr = lp_tle->ip_mgr; lp_tle->ip_next = NULL; lp_tle->ip_prev = NULL; switch (lp_tle->iv_kind) { case TIMER_TLE_KIND_CB: lp_tle->iv_on_list = LIST_NONE; lv_tle_tleid = lp_tle->iv_tleid; lv_tle_toval = lp_tle->iv_toval; lv_tle_parm1 = lp_tle->iv_parm1; lv_tle_parm2 = lp_tle->iv_parm2; sb_timer_tle_free(lp_tle); // unlock mutex so that cb can start another timer lv_status = gv_timer_mutex.unlock(); SB_util_assert_ieq(lv_status, 0); // sw fault lp_tle->iv_cb(lv_tle_tleid, lv_tle_toval, lv_tle_parm1, lv_tle_parm2); lv_status = gv_timer_mutex.lock(); SB_util_assert_ieq(lv_status, 0); // sw fault break; case TIMER_TLE_KIND_COMPQ: lp_comp_q->add(&lp_tle->iv_link); if (gv_ms_trace_timer) sb_timer_comp_q_print(lp_comp_q); lp_tle->iv_on_list = LIST_COMP; lp_mgr->set_event(LREQ, NULL); break; default: SB_util_abort("invalid iv_kind"); // sw fault } } while (gp_timer_head != NULL); }