extern "C" cps_api_return_code_t cps_api_get_objs(cps_api_object_t filt, cps_api_object_list_t obj_list,
        size_t retry_count, size_t ms_delay_between) {

    cps_api_return_code_t rc;
    cps_api_get_params_t get_req;

    if ((rc=cps_api_get_request_init(&get_req))!=cps_api_ret_code_OK) return rc;

    cps_api_get_request_guard rg(&get_req);

    cps_api_object_t obj = cps_api_object_list_create_obj_and_append(get_req.filters);
    if (obj==nullptr) return cps_api_ret_code_ERR;
    if (!cps_api_object_clone(obj,filt)) return cps_api_ret_code_ERR;

    if (ms_delay_between==0) ms_delay_between = BASIC_WAIT_TIME;
    ms_delay_between = MILLI_TO_MICRO(ms_delay_between);

    cps_api_object_list_t _tmp_lst = get_req.list;
    get_req.list = obj_list;

    bool inf = retry_count==0;
    while (inf || (retry_count >0) ) {
        rc = cps_api_get(&get_req);
        if (rc==cps_api_ret_code_OK) break;
        if (!inf) --retry_count;
        std_usleep(ms_delay_between);
    }
    get_req.list = _tmp_lst;
    return rc;
}
extern "C" cps_api_return_code_t cps_api_commit_one(cps_api_operation_types_t type,
        cps_api_object_t obj, size_t retry_count, size_t ms_delay_between) {

    cps_api_transaction_params_t tr;

    if (cps_api_transaction_init(&tr)!=cps_api_ret_code_OK) {
        return cps_api_ret_code_ERR;
    }
    cps_api_transaction_guard tr_g(&tr);

    cps_api_key_set_attr(cps_api_object_key(obj),type);

    if (!cps_api_object_list_append(tr.change_list,obj)) {
        return cps_api_ret_code_ERR;
    }
    bool inf = retry_count==0;

    if (ms_delay_between==0) ms_delay_between = BASIC_WAIT_TIME;
    ms_delay_between = MILLI_TO_MICRO(ms_delay_between);

    cps_api_return_code_t rc = cps_api_ret_code_ERR;
    while (inf || (retry_count >0) ) {
        rc = cps_api_commit(&tr);
        if (rc==cps_api_ret_code_OK) {
            //since this will be erased by the caller remove it from the transaction list
            break;
        }
        if (!inf) --retry_count;
        std_usleep(ms_delay_between);
    }
    cps_api_object_list_remove(tr.change_list,0);
    return rc;
}
void nas_switch_wait_for_sys_base_mac(hal_mac_addr_t *mac_base) {
    while (true) {
        if (nas_switch_get_sys_mac_base(mac_base)== STD_ERR_OK) {
            break;
        }
        EV_LOG(TRACE,NAS_COM, 0, "NAS-COM-MAC","Failed to get system mac..");
        std_usleep(MILLI_TO_MICRO(500));
    }
}
void std_thread_pool_context_t::do_shutdown() {
    shutdown = true;
    size_t ix = 0;
    size_t mx = list.size();
    for ( ; ix < mx ; ++ix ) {
        lock();
        signal();
        unlock();
    }
    std_condition_var_destroy(&m_cond);
    std_mutex_destroy(&m_lock);
    std_usleep(SHUTDOWN_WAIT_TIME);
}
static cps_api_return_code_t _cps_api_event_service_publish_msg(cps_api_event_service_handle_t handle,
        cps_api_object_t msg) {

    STD_ASSERT(msg!=NULL);
    STD_ASSERT(handle!=NULL);

    cps_api_key_t *_okey = cps_api_object_key(msg);

    if (cps_api_key_get_len(_okey) < CPS_OBJ_KEY_SUBCAT_POS) {
        //likely invalid message
        return cps_api_ret_code_ERR;
    }

    std_event_key_t key;
    cps_api_to_std_key(&key,_okey);

    cps_api_to_std_event_map_t *p = handle_to_data(handle);

    int retry = (int)p->retry;
    for (; retry > 0 ; --retry) {
        std_mutex_simple_lock_guard lg(&p->lock);
        if (!__connect_to_service(handle)) {
            std_usleep(MILLI_TO_MICRO(1));
            continue;
        }

        t_std_error rc = std_client_publish_msg_data(
                handle_to_std_handle(handle), &key,
                cps_api_object_array(msg),
                cps_api_object_to_array_len(msg));
        if (rc!=STD_ERR_OK) {
            __close_channel(handle);
        } else {
            return cps_api_ret_code_OK;
        }
    }
    return cps_api_ret_code_ERR;
}
static cps_api_return_code_t _cps_api_wait_for_event(
        cps_api_event_service_handle_t handle,
        cps_api_object_t msg) {

    std_event_msg_t m;
    while (true) {
        std_event_client_handle h;
        cps_api_to_std_event_map_t *p = handle_to_data(handle);

        {
            std_mutex_simple_lock_guard lg(&p->lock);

            if (!__connect_to_service(handle)) {
                //retry every 50ms
                std_usleep(MILLI_TO_MICRO(50));
                continue;
            }

            h = handle_to_std_handle(handle);
        }

        if (std_client_wait_for_event_data(h,&m, cps_api_object_array(msg),
                cps_api_object_get_reserve_len(msg))!=STD_ERR_OK) {
            __close_channel(handle);
            continue;
        }

        if (!cps_api_object_received(msg,m.data_len)) {
            EV_LOG(ERR,DSAPI,0,"CPS-EV-RX","Invalid message received... returning to client");
            __close_channel(handle);
            continue;
        }
        break;
    }
    return cps_api_ret_code_OK;

}