static void match_request_response(ipmi_packet_data_t * data, const ipmi_header_t * hdr, guint flags) { /* get current frame */ ipmi_frame_data_t * rs_frame = data->curr_frame; /* get current command data */ ipmi_cmd_data_t * rs_data = rs_frame->cmd_data[data->curr_level]; /* check if parse response for the first time */ if (!rs_data) { ipmi_request_t * rq; /* allocate command data */ rs_data = wmem_new0(wmem_file_scope(), ipmi_cmd_data_t); /* search for matching request */ rq = get_matched_request(data, hdr, flags); /* check if matching request is found */ if (rq) { /* get request frame data */ ipmi_frame_data_t * rq_frame = get_frame_data(data, rq->frame_num); /* get command data */ ipmi_cmd_data_t * rq_data = rq_frame->cmd_data[rq->nest_level]; /* save matched frame numbers */ rq_data->matched_frame_num = data->curr_frame_num; rs_data->matched_frame_num = rq->frame_num; /* copy saved command data information */ rs_data->saved_data[0] = rq_data->saved_data[0]; rs_data->saved_data[1] = rq_data->saved_data[1]; /* remove request from the list */ wmem_list_remove(data->request_list, rq); /* delete request data */ wmem_free(wmem_file_scope(), rq); } /* save command data pointer in frame */ rs_frame->cmd_data[data->curr_level] = rs_data; } }
static void wmem_test_list(void) { wmem_allocator_t *allocator; wmem_list_t *list; wmem_list_frame_t *frame; unsigned int i; allocator = wmem_allocator_new(WMEM_ALLOCATOR_STRICT); list = wmem_list_new(allocator); g_assert(list); g_assert(wmem_list_count(list) == 0); frame = wmem_list_head(list); g_assert(frame == NULL); for (i=0; i<CONTAINER_ITERS; i++) { wmem_list_prepend(list, GINT_TO_POINTER(i)); g_assert(wmem_list_count(list) == i+1); frame = wmem_list_head(list); g_assert(frame); g_assert(wmem_list_frame_data(frame) == GINT_TO_POINTER(i)); } wmem_strict_check_canaries(allocator); i = CONTAINER_ITERS - 1; frame = wmem_list_head(list); while (frame) { g_assert(wmem_list_frame_data(frame) == GINT_TO_POINTER(i)); i--; frame = wmem_list_frame_next(frame); } i = 0; frame = wmem_list_tail(list); while (frame) { g_assert(wmem_list_frame_data(frame) == GINT_TO_POINTER(i)); i++; frame = wmem_list_frame_prev(frame); } i = CONTAINER_ITERS - 2; while (wmem_list_count(list) > 1) { wmem_list_remove(list, GINT_TO_POINTER(i)); i--; } wmem_list_remove(list, GINT_TO_POINTER(CONTAINER_ITERS - 1)); g_assert(wmem_list_count(list) == 0); g_assert(wmem_list_head(list) == NULL); g_assert(wmem_list_tail(list) == NULL); for (i=0; i<CONTAINER_ITERS; i++) { wmem_list_append(list, GINT_TO_POINTER(i)); g_assert(wmem_list_count(list) == i+1); frame = wmem_list_head(list); g_assert(frame); } wmem_strict_check_canaries(allocator); i = 0; frame = wmem_list_head(list); while (frame) { g_assert(wmem_list_frame_data(frame) == GINT_TO_POINTER(i)); i++; frame = wmem_list_frame_next(frame); } i = CONTAINER_ITERS - 1; frame = wmem_list_tail(list); while (frame) { g_assert(wmem_list_frame_data(frame) == GINT_TO_POINTER(i)); i--; frame = wmem_list_frame_prev(frame); } wmem_destroy_allocator(allocator); list = wmem_list_new(NULL); for (i=0; i<CONTAINER_ITERS; i++) { wmem_list_prepend(list, GINT_TO_POINTER(i)); } g_assert(wmem_list_count(list) == CONTAINER_ITERS); wmem_destroy_list(list); }