static void display_worker_lb()

in native/common/jk_status.c [2237:2649]


static void display_worker_lb(jk_ws_service_t *s,
                              status_endpoint_t *p,
                              lb_worker_t *lb,
                              lb_sub_worker_t *swr,
                              jk_log_context_t *l)
{
    int cmd;
    int mime;
    int read_only = 0;
    int single = 0;
    unsigned int hide_members;
    unsigned int hide_lb_conf;
    unsigned int hide_lb_summary;
    unsigned int hide_ajp_conf;
    const char *arg;
    time_t now = time(NULL);
    unsigned int good = 0;
    unsigned int degraded = 0;
    unsigned int bad = 0;
    int map_count;
    int ms_min;
    int ms_max;
    unsigned int j;
    int pstart = JK_FALSE;
    const char *name = lb->name;
    status_worker_t *w = p->worker;

    JK_TRACE_ENTER(l);
    status_get_string(p, JK_STATUS_ARG_CMD, NULL, &arg, l);
    cmd = status_cmd_int(arg);
    status_get_string(p, JK_STATUS_ARG_MIME, NULL, &arg, l);
    mime = status_mime_int(arg);
    hide_members = status_get_int(p, JK_STATUS_ARG_OPTIONS, 0, l) &
                                  JK_STATUS_ARG_OPTION_NO_MEMBERS;
    hide_lb_conf = status_get_int(p, JK_STATUS_ARG_OPTIONS, 0, l) &
                                  JK_STATUS_ARG_OPTION_NO_LB_CONF;
    hide_lb_summary = status_get_int(p, JK_STATUS_ARG_OPTIONS, 0, l) &
                                     JK_STATUS_ARG_OPTION_NO_LB_SUMMARY;
    hide_ajp_conf = status_get_int(p, JK_STATUS_ARG_OPTIONS, 0, l) &
                                   JK_STATUS_ARG_OPTION_NO_AJP_CONF;
    if (w->read_only) {
        read_only = 1;
    }
    else {
        read_only = status_get_int(p, JK_STATUS_ARG_OPTIONS, 0, l) &
                    JK_STATUS_ARG_OPTION_READ_ONLY;
    }
    if (cmd == JK_STATUS_CMD_SHOW) {
        single = 1;
    }

    if (lb->sequence != lb->s->h.sequence)
        jk_lb_pull(lb, JK_FALSE, l);

    for (j = 0; j < lb->num_of_workers; j++) {
        lb_sub_worker_t *wr = &(lb->lb_workers[j]);
        int rate;
        rate = status_rate(wr, w, l);
        if (rate > 0)
           good++;
        else if (rate < 0)
           bad++;
        else
           degraded++;
    }

    map_count = count_maps(s, name, l);
    ms_min = lb->maintain_time - (int)difftime(now, lb->s->last_maintain_time);
    ms_max = ms_min + lb->maintain_time;
    if (ms_min < 0) {
        ms_min = 0;
    }
    if (ms_max < 0) {
        ms_max = 0;
    }

    if (mime == JK_STATUS_MIME_HTML) {

        jk_puts(s, "<hr/><h3>[");
        if (single) {
            jk_puts(s, "S");
        }
        else {
            status_write_uri(s, p, "S", JK_STATUS_CMD_SHOW, JK_STATUS_MIME_UNKNOWN,
                             name, "", 0, 0, "", l);
        }
        if (!read_only) {
            jk_puts(s, "|");
            status_write_uri(s, p, "E", JK_STATUS_CMD_EDIT, JK_STATUS_MIME_UNKNOWN,
                             name, "", 0, 0, "", l);
            jk_puts(s, "|");
            status_write_uri(s, p, "R", JK_STATUS_CMD_RESET, JK_STATUS_MIME_UNKNOWN,
                             name, "", 0, 0, "", l);
        }
        jk_puts(s, "]&nbsp;&nbsp;");
        jk_putv(s, "Worker Status for ", name, "</h3>\n", NULL);
        if (hide_lb_conf) {
            pstart = JK_TRUE;
            jk_puts(s, "<p>\n");
            if (single) {
                status_write_uri(s, p, "Show LB Configuration", JK_STATUS_CMD_SHOW, JK_STATUS_MIME_UNKNOWN,
                                 NULL, NULL, 0, JK_STATUS_ARG_OPTION_NO_LB_CONF, "", l);
            }
            else {
                status_write_uri(s, p, "Show LB Configuration", JK_STATUS_CMD_LIST, JK_STATUS_MIME_UNKNOWN,
                                 NULL, NULL, 0, JK_STATUS_ARG_OPTION_NO_LB_CONF, "", l);
            }
        }
        if (hide_lb_summary) {
            if (pstart == JK_FALSE)
                jk_puts(s, "<p>\n");
            else
                jk_puts(s, "&nbsp;&nbsp;|&nbsp;&nbsp;");
            pstart = JK_TRUE;
            if (single) {
                status_write_uri(s, p, "Show LB Summary", JK_STATUS_CMD_SHOW, JK_STATUS_MIME_UNKNOWN,
                                 NULL, NULL, 0, JK_STATUS_ARG_OPTION_NO_LB_SUMMARY, "", l);
            }
            else {
                status_write_uri(s, p, "Show LB Summary", JK_STATUS_CMD_LIST, JK_STATUS_MIME_UNKNOWN,
                                 NULL, NULL, 0, JK_STATUS_ARG_OPTION_NO_LB_SUMMARY, "", l);
            }
        }
        if (!hide_members && hide_ajp_conf) {
            if (pstart == JK_FALSE)
                jk_puts(s, "<p>\n");
            else
                jk_puts(s, "&nbsp;&nbsp;|&nbsp;&nbsp;");
            pstart = JK_TRUE;
            if (single) {
                status_write_uri(s, p, "Show AJP Configuration", JK_STATUS_CMD_SHOW, JK_STATUS_MIME_UNKNOWN,
                                 NULL, NULL, 0, JK_STATUS_ARG_OPTION_NO_AJP_CONF, "", l);
            }
            else {
                status_write_uri(s, p, "Show AJP Configuration", JK_STATUS_CMD_LIST, JK_STATUS_MIME_UNKNOWN,
                                 NULL, NULL, 0, JK_STATUS_ARG_OPTION_NO_AJP_CONF, "", l);
            }
        }
        if (hide_members) {
            if (pstart == JK_FALSE)
                jk_puts(s, "<p>\n");
            else
                jk_puts(s, "&nbsp;&nbsp;|&nbsp;&nbsp;");
            pstart = JK_TRUE;
            if (single) {
                status_write_uri(s, p, "Show Balancer Members", JK_STATUS_CMD_SHOW, JK_STATUS_MIME_UNKNOWN,
                                 NULL, NULL, 0, JK_STATUS_ARG_OPTION_NO_MEMBERS, "", l);
            }
            else {
                status_write_uri(s, p, "Show Balancer Members", JK_STATUS_CMD_LIST, JK_STATUS_MIME_UNKNOWN,
                                 NULL, NULL, 0, JK_STATUS_ARG_OPTION_NO_MEMBERS, "", l);
            }
        }
        if (pstart == JK_TRUE)
            jk_puts(s, "</p>\n");

        if (!hide_lb_conf) {
            jk_puts(s, "<table>" JK_STATUS_SHOW_LB_HEAD);
            jk_puts(s, "[");
            status_write_uri(s, p, "Hide", JK_STATUS_CMD_UNKNOWN, JK_STATUS_MIME_UNKNOWN,
                             NULL, NULL, JK_STATUS_ARG_OPTION_NO_LB_CONF, 0, NULL, l);
            jk_puts(s, "]</th></tr>");
            jk_printf(s, l, JK_STATUS_SHOW_LB_ROW,
                      status_worker_type(JK_LB_WORKER_TYPE),
                      jk_get_bool(lb->sticky_session),
                      jk_get_bool(lb->sticky_session_force),
                      lb->retries,
                      jk_lb_get_method(lb, l),
                      jk_lb_get_lock(lb, l),
                      lb->recover_wait_time,
                      lb->error_escalation_time,
                      lb->max_reply_timeouts);
            jk_puts(s, "</table>\n<br/>\n");
        }

        if (!hide_lb_summary) {
            jk_puts(s, "<table><tr>"
                    "<th>Good</th><th>Degraded</th><th>Bad/Stopped</th><th>Busy</th><th>Max Busy</th><th>Next Maintenance</th><th>Last Reset</th><th>[");
            status_write_uri(s, p, "Hide", JK_STATUS_CMD_UNKNOWN, JK_STATUS_MIME_UNKNOWN,
                             NULL, NULL, JK_STATUS_ARG_OPTION_NO_LB_SUMMARY, 0, NULL, l);
            jk_puts(s, "]</th></tr>\n<tr>");
            jk_printf(s, l, "<td>%d</td>", good);
            jk_printf(s, l, "<td>%d</td>", degraded);
            jk_printf(s, l, "<td>%d</td>", bad);
            jk_printf(s, l, "<td>%d</td>", lb->s->busy);
            jk_printf(s, l, "<td>%d</td>", lb->s->max_busy);
            jk_printf(s, l, "<td>%d/%d</td>", ms_min, ms_max);
            jk_printf(s, l, "<td>%d</td>", (int)difftime(now, lb->s->last_reset));
            jk_puts(s, "<td></td></tr>\n</table>\n\n");
        }
    }
    else if (mime == JK_STATUS_MIME_XML) {

        jk_print_xml_start_elt(s, l, w, 2, 0, "balancer");
        jk_print_xml_att_string(s, l, 4, "name", name);
        jk_print_xml_att_string(s, l, 4, "type", status_worker_type(JK_LB_WORKER_TYPE));
        jk_print_xml_att_string(s, l, 4, "sticky_session", jk_get_bool(lb->sticky_session));
        jk_print_xml_att_string(s, l, 4, "sticky_session_force", jk_get_bool(lb->sticky_session_force));
        jk_print_xml_att_int(s, l, 4, "retries", lb->retries);
        jk_print_xml_att_int(s, l, 4, "recover_time", lb->recover_wait_time);
        jk_print_xml_att_int(s, l, 4, "error_escalation_time", lb->error_escalation_time);
        jk_print_xml_att_int(s, l, 4, "max_reply_timeouts", lb->max_reply_timeouts);
        jk_print_xml_att_string(s, l, 4, "method", jk_lb_get_method(lb, l));
        jk_print_xml_att_string(s, l, 4, "lock", jk_lb_get_lock(lb, l));
        jk_print_xml_att_int(s, l, 4, "member_count", lb->num_of_workers);
        jk_print_xml_att_int(s, l, 4, "good", good);
        jk_print_xml_att_int(s, l, 4, "degraded", degraded);
        jk_print_xml_att_int(s, l, 4, "bad", bad);
        jk_print_xml_att_int(s, l, 4, "busy", lb->s->busy);
        jk_print_xml_att_int(s, l, 4, "max_busy", lb->s->max_busy);
        jk_print_xml_att_int(s, l, 4, "map_count", map_count);
        jk_print_xml_att_int(s, l, 4, "time_to_maintenance_min", ms_min);
        jk_print_xml_att_int(s, l, 4, "time_to_maintenance_max", ms_max);
        jk_print_xml_att_long(s, l, 4, "last_reset_at", (long)lb->s->last_reset);
        jk_print_xml_att_int(s, l, 4, "last_reset_ago", (int)difftime(now, lb->s->last_reset));
        jk_print_xml_stop_elt(s, l, 2, 0);

    }
    else if (mime == JK_STATUS_MIME_TXT) {

        jk_puts(s, "Balancer Worker:");
        jk_printf(s, l, " name=%s", name);
        jk_printf(s, l, " type=%s", status_worker_type(JK_LB_WORKER_TYPE));
        jk_printf(s, l, " sticky_session=%s", jk_get_bool(lb->sticky_session));
        jk_printf(s, l, " sticky_session_force=%s", jk_get_bool(lb->sticky_session_force));
        jk_printf(s, l, " retries=%d", lb->retries);
        jk_printf(s, l, " recover_time=%d", lb->recover_wait_time);
        jk_printf(s, l, " error_escalation_time=%d", lb->error_escalation_time);
        jk_printf(s, l, " max_reply_timeouts=%d", lb->max_reply_timeouts);
        jk_printf(s, l, " method=%s", jk_lb_get_method(lb, l));
        jk_printf(s, l, " lock=%s", jk_lb_get_lock(lb, l));
        jk_printf(s, l, " member_count=%d", lb->num_of_workers);
        jk_printf(s, l, " good=%d", good);
        jk_printf(s, l, " degraded=%d", degraded);
        jk_printf(s, l, " bad=%d", bad);
        jk_printf(s, l, " busy=%d", lb->s->busy);
        jk_printf(s, l, " max_busy=%d", lb->s->max_busy);
        jk_printf(s, l, " map_count=%d", map_count);
        jk_printf(s, l, " time_to_maintenance_min=%d", ms_min);
        jk_printf(s, l, " time_to_maintenance_max=%d", ms_max);
        jk_printf(s, l, " last_reset_at=%ld", (long)lb->s->last_reset);
        jk_printf(s, l, " last_reset_ago=%d", (int)difftime(now, lb->s->last_reset));
        jk_puts(s, "\n");

    }
    else if (mime == JK_STATUS_MIME_PROP) {

        jk_print_prop_att_string(s, l, w, NULL, "list", name);
        jk_print_prop_att_string(s, l, w, name, "type", status_worker_type(JK_LB_WORKER_TYPE));
        jk_print_prop_att_string(s, l, w, name, "sticky_session", jk_get_bool(lb->sticky_session));
        jk_print_prop_att_string(s, l, w, name, "sticky_session_force", jk_get_bool(lb->sticky_session_force));
        jk_print_prop_att_int(s, l, w, name, "retries", lb->retries);
        jk_print_prop_att_int(s, l, w, name, "recover_time", lb->recover_wait_time);
        jk_print_prop_att_int(s, l, w, name, "error_escalation_time", lb->error_escalation_time);
        jk_print_prop_att_int(s, l, w, name, "max_reply_timeouts", lb->max_reply_timeouts);
        jk_print_prop_att_string(s, l, w, name, "method", jk_lb_get_method(lb, l));
        jk_print_prop_att_string(s, l, w, name, "lock", jk_lb_get_lock(lb, l));
        jk_print_prop_att_int(s, l, w, name, "member_count", lb->num_of_workers);
        jk_print_prop_att_int(s, l, w, name, "good", good);
        jk_print_prop_att_int(s, l, w, name, "degraded", degraded);
        jk_print_prop_att_int(s, l, w, name, "bad", bad);
        jk_print_prop_att_int(s, l, w, name, "busy", lb->s->busy);
        jk_print_prop_att_int(s, l, w, name, "max_busy", lb->s->max_busy);
        jk_print_prop_att_int(s, l, w, name, "map_count", map_count);
        jk_print_prop_att_int(s, l, w, name, "time_to_maintenance_min", ms_min);
        jk_print_prop_att_int(s, l, w, name, "time_to_maintenance_max", ms_max);
        jk_print_prop_att_long(s, l, w, name, "last_reset_at", (long)lb->s->last_reset);
        jk_print_prop_att_int(s, l, w, name, "last_reset_ago", (int)difftime(now, lb->s->last_reset));

    }

    if (!hide_members) {

        if (mime == JK_STATUS_MIME_HTML) {

            jk_puts(s, "<h4>Balancer Members [");
            if (swr) {
                status_write_uri(s, p, "Show All Members", JK_STATUS_CMD_SHOW, JK_STATUS_MIME_UNKNOWN,
                                 name, "", 0, 0, "", l);
                jk_puts(s, "]&nbsp;&nbsp;[");
            }
            if (single) {
                status_write_uri(s, p, "Hide", JK_STATUS_CMD_SHOW, JK_STATUS_MIME_UNKNOWN,
                                 NULL, NULL, JK_STATUS_ARG_OPTION_NO_MEMBERS, 0, "", l);
            }
            else {
                status_write_uri(s, p, "Hide", JK_STATUS_CMD_LIST, JK_STATUS_MIME_UNKNOWN,
                                 NULL, NULL, JK_STATUS_ARG_OPTION_NO_MEMBERS, 0, "", l);
            }
            jk_puts(s, "]</h4>\n");
            if (!hide_ajp_conf) {
                jk_puts(s, "<table>" JK_STATUS_SHOW_MEMBER_CONF_HEAD);
                jk_puts(s, "[");
                status_write_uri(s, p, "Hide", JK_STATUS_CMD_UNKNOWN, JK_STATUS_MIME_UNKNOWN,
                                 NULL, NULL, JK_STATUS_ARG_OPTION_NO_AJP_CONF, 0, NULL, l);
                jk_puts(s, "]</th></tr>");
                if (swr) {
                    jk_worker_t *jw = (jk_worker_t *)swr->worker;
                    ajp_worker_t *aw = (ajp_worker_t *)jw->worker_private;
                    display_worker_ajp_conf_details(s, p, aw, 1, jw->type, l);
                }
                else
                    for (j = 0; j < lb->num_of_workers; j++) {
                        lb_sub_worker_t *wr = &(lb->lb_workers[j]);
                        jk_worker_t *jw = (jk_worker_t *)wr->worker;
                        ajp_worker_t *aw = (ajp_worker_t *)jw->worker_private;
                        display_worker_ajp_conf_details(s, p, aw, 1, jw->type, l);
                    }
                jk_puts(s, "</table>\n<br/>\n");
            }
            jk_puts(s, "<table>" JK_STATUS_SHOW_MEMBER_HEAD);

        }

        if (swr) {
            const char *sub_name = swr->name;
            ajp_worker_t *aw = (ajp_worker_t *)swr->worker->worker_private;

            if (mime == JK_STATUS_MIME_HTML) {
                jk_puts(s, "<tr>\n<td>[");
                jk_puts(s, "S");
                if (!read_only) {
                    jk_puts(s, "|");
                    status_write_uri(s, p, "E", JK_STATUS_CMD_EDIT, JK_STATUS_MIME_UNKNOWN,
                                     name, sub_name, 0, 0, "", l);
                    jk_puts(s, "|");
                    status_write_uri(s, p, "R", JK_STATUS_CMD_RESET, JK_STATUS_MIME_UNKNOWN,
                                     name, sub_name, 0, 0, "", l);
                    if (swr->s->state == JK_LB_STATE_ERROR) {
                        jk_puts(s, "|");
                        status_write_uri(s, p, "T", JK_STATUS_CMD_RECOVER, JK_STATUS_MIME_UNKNOWN,
                                         name, sub_name, 0, 0, "", l);
                    }
                }
                jk_puts(s, "]");
                jk_puts(s, "&nbsp;</td>");
            }
            display_worker_ajp_details(s, p, aw, swr, lb, ms_min, ms_max, 0, l);
        } else
            for (j = 0; j < lb->num_of_workers; j++) {
                lb_sub_worker_t *wr = &(lb->lb_workers[j]);
                const char *sub_name = wr->name;
                ajp_worker_t *aw = (ajp_worker_t *)wr->worker->worker_private;

                if (mime == JK_STATUS_MIME_HTML) {
                    jk_puts(s, "<tr>\n<td>[");
                    status_write_uri(s, p, "S", JK_STATUS_CMD_SHOW, JK_STATUS_MIME_UNKNOWN,
                                 name, sub_name, 0, 0, "", l);
                    if (!read_only) {
                        jk_puts(s, "|");
                        status_write_uri(s, p, "E", JK_STATUS_CMD_EDIT, JK_STATUS_MIME_UNKNOWN,
                                         name, sub_name, 0, 0, "", l);
                        jk_puts(s, "|");
                        status_write_uri(s, p, "R", JK_STATUS_CMD_RESET, JK_STATUS_MIME_UNKNOWN,
                                         name, sub_name, 0, 0, "", l);
                        if (wr->s->state == JK_LB_STATE_ERROR) {
                            jk_puts(s, "|");
                            status_write_uri(s, p, "T", JK_STATUS_CMD_RECOVER, JK_STATUS_MIME_UNKNOWN,
                                             name, sub_name, 0, 0, "", l);
                        }
                    }
                    jk_puts(s, "]");
                    jk_puts(s, "&nbsp;</td>");
                }
                display_worker_ajp_details(s, p, aw, wr, lb, ms_min, ms_max, 0, l);
            }

        if (mime == JK_STATUS_MIME_HTML) {

            jk_puts(s, "</table><br/>\n");
            if (!read_only) {
                const char *arg;
                status_get_string(p, JK_STATUS_ARG_CMD, NULL, &arg, l);
                status_start_form(s, p, "get", JK_STATUS_CMD_EDIT, NULL, l);
                jk_printf(s, l, JK_STATUS_FORM_HIDDEN_STRING, JK_STATUS_ARG_WORKER, name);
                if (arg)
                    jk_printf(s, l, JK_STATUS_FORM_HIDDEN_STRING, JK_STATUS_ARG_FROM, arg);
                jk_puts(s, "<table><tr><td><b>E</b>dit this attribute for all members:</td><td>");
                jk_putv(s, "<select name=\"", JK_STATUS_ARG_ATTRIBUTE,
                        "\" size=\"1\">\n", NULL);
                jk_putv(s, "<option value=\"", JK_STATUS_ARG_LBM_ACTIVATION, "\">", JK_STATUS_ARG_LBM_TEXT_ACTIVATION, "</option>\n", NULL);
                jk_putv(s, "<option value=\"", JK_STATUS_ARG_LBM_FACTOR, "\">", JK_STATUS_ARG_LBM_TEXT_FACTOR, "</option>\n", NULL);
                jk_putv(s, "<option value=\"", JK_STATUS_ARG_LBM_ROUTE, "\">", JK_STATUS_ARG_LBM_TEXT_ROUTE, "</option>\n", NULL);
                jk_putv(s, "<option value=\"", JK_STATUS_ARG_LBM_REDIRECT, "\">", JK_STATUS_ARG_LBM_TEXT_REDIRECT, "</option>\n", NULL);
                jk_putv(s, "<option value=\"", JK_STATUS_ARG_LBM_DOMAIN, "\">", JK_STATUS_ARG_LBM_TEXT_DOMAIN, "</option>\n", NULL);
                jk_putv(s, "<option value=\"", JK_STATUS_ARG_LBM_DISTANCE, "\">", JK_STATUS_ARG_LBM_TEXT_DISTANCE, "</option>\n", NULL);
                jk_putv(s, "<option value=\"", JK_STATUS_ARG_AJP_CACHE_TO, "\">", JK_STATUS_ARG_AJP_TEXT_CACHE_TO, "</option>\n", NULL);
                jk_putv(s, "<option value=\"", JK_STATUS_ARG_AJP_PING_TO, "\">", JK_STATUS_ARG_AJP_TEXT_PING_TO, "</option>\n", NULL);
                jk_putv(s, "<option value=\"", JK_STATUS_ARG_AJP_CONNECT_TO, "\">", JK_STATUS_ARG_AJP_TEXT_CONNECT_TO, "</option>\n", NULL);
                jk_putv(s, "<option value=\"", JK_STATUS_ARG_AJP_PREPOST_TO, "\">", JK_STATUS_ARG_AJP_TEXT_PREPOST_TO, "</option>\n", NULL);
                jk_putv(s, "<option value=\"", JK_STATUS_ARG_AJP_REPLY_TO, "\">", JK_STATUS_ARG_AJP_TEXT_REPLY_TO, "</option>\n", NULL);
                jk_putv(s, "<option value=\"", JK_STATUS_ARG_AJP_RETRIES, "\">", JK_STATUS_ARG_AJP_TEXT_RETRIES, "</option>\n", NULL);
                jk_putv(s, "<option value=\"", JK_STATUS_ARG_AJP_RETRY_INT, "\">", JK_STATUS_ARG_AJP_TEXT_RETRY_INT, "</option>\n", NULL);
                jk_putv(s, "<option value=\"", JK_STATUS_ARG_AJP_CPING_INT, "\">", JK_STATUS_ARG_AJP_TEXT_CPING_INT, "</option>\n", NULL);
                jk_putv(s, "<option value=\"", JK_STATUS_ARG_AJP_REC_OPTS, "\">", JK_STATUS_ARG_AJP_TEXT_REC_OPTS, "</option>\n", NULL);
                jk_putv(s, "<option value=\"", JK_STATUS_ARG_AJP_BUSY_LIMIT, "\">", JK_STATUS_ARG_AJP_TEXT_BUSY_LIMIT, "</option>\n", NULL);
                jk_putv(s, "<option value=\"", JK_STATUS_ARG_AJP_MAX_PK_SZ, "\">", JK_STATUS_ARG_AJP_TEXT_MAX_PK_SZ, "</option>\n", NULL);
                jk_puts(s, "</select></td><td><input type=\"submit\" value=\"Go\"/></td></tr></table></form>\n");
            }

        }

    }

    if (name)
        display_maps(s, p, name, l);

    if (mime == JK_STATUS_MIME_XML) {
        jk_print_xml_close_elt(s, l, w, 2, "balancer");
    }

    JK_TRACE_EXIT(l);
}