char *test_unshift() { char *val = List_unshift(list); mu_assert(val == test3, "Wrong value on unshfit"); val = List_unshift(list); mu_assert(val == test1, "Wrong value on unshift"); mu_assert(List_count(list) == 0, "Wrong count"); return NULL; }
char *test_unshift() { List_unshift(list, test1); mu_assert(List_first(list) == test1, "Wrong first value"); List_unshift(list, test2); mu_assert(List_first(list) == test2, "Wrong first value"); List_unshift(list, test3); mu_assert(List_first(list) == test3, "Wrong last value."); mu_assert(List_count(list) == 3, "Wrong count on unshift."); return NULL; }
List *List_merge(List *list1, List *list2, List_compare cmp) { List *result = List_create(); // 存放排序好的List // 数据域 void *val = NULL; // 如果list1的数据小,则push之,并unshift list1 // 否则,push list2的数据,并unshift list2 while(List_count(list1) > 0 && List_count(list2) > 0) { if(cmp((char *)List_first(list1) , (char *)List_first(list2)) >= 0) { val = List_unshift(list2); List_push(result, val); } else { val = List_unshift(list1); List_push(result, val); } } // push剩余的数据 if(List_count(list1) > 0) { while(List_count(list1) > 0) { val =List_unshift(list1); List_push(result, val); } } else { while(List_count(list2) > 0) { val =List_unshift(list2); List_push(result, val); } } List_destroy(list1); List_destroy(list2); return result; }
char *test_unshift_shift() { List_unshift(list, tv1); mu_assert(List_first(list) == tv1, "Bad first value."); List_unshift(list, tv2); mu_assert(List_first(list) == tv2, "Bad first value."); List_unshift(list, tv3); mu_assert(List_first(list) == tv3, "Bad first value."); mu_assert(List_size(list) == 3, "Wrong size"); char *out = List_shift(list); mu_assert(out == tv3, "Bad shifted value."); out = List_shift(list); mu_assert(out == tv2, "Bad shifted value."); out = List_shift(list); mu_assert(out == tv1, "Bad shifted value."); mu_assert(List_size(list) == 0, "Wrong size"); return NULL; }
void do_write(evutil_socket_t fd, short events, void *arg) { (void) events; struct fd_state *state = arg; printf("Want to write %d blocks\n", List_count(state->outputs)); while (List_count(state->outputs) > 0) { RtmpOutputMessage *this_output = List_first(state->outputs); printf("Block write: %u\n", this_output->data_left); while (this_output->data_left > 0) { ssize_t result = send(fd, rtmp_output_message_start_at(this_output), this_output->data_left, 0); if (result < 0) { if (errno == EAGAIN) // XXX use evutil macro return; free_fd_state(state); return; } assert(result != 0); this_output->data_left -= result; printf("\tWritten: %d\n", result); if (this_output->data_left == 0) { List_unshift(state->outputs); rtmp_destroy_output_message(this_output); break; } } } event_del(state->write_event); }