cps_api_object_t cps_api_receive_object(cps_api_channel_t handle,size_t len) { if (len==0) return NULL; cps_api_object_guard og(cps_api_object_create()); t_std_error rc = STD_ERR_OK; do { if (cps_api_object_get_reserve_len(og.get()) < len) { if (!cps_api_object_reserve(og.get(),len)) break; } int by = std_read(handle,cps_api_object_array(og.get()),len,true,&rc); if (by!=(int)len) break; if (!cps_api_object_received(og.get(),len)) break; return og.release(); } while (0); EV_LOG(ERR,DSAPI,0,"CPS IPC","Was not able to read the object - MSG (%X)",rc); return NULL; }
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; }