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;
}
Exemple #2
0
//
// 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);
}
Exemple #3
0
//
// 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;
    }
}
Exemple #4
0
//
// 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);
}