void rrnx_list_remove(rrnx_list *list, rrnx_list_item *item) { // Maintain links rrnx_list_item *next = item->next; rrnx_list_item *prev = item->prev; if (next != NULL) { next->prev = prev; } if (prev != NULL) { prev->next = next; } if (list->last == item) { list->last = prev; } if (list->first == item) { list->first = next; } // Free user data free_payload(list, item); // free the node itself free(item); }
void ts_engine_client_uninit(struct ts_engine_client *client) { close(client->fdin); close(client->fdout); free_payload(client); }
int main(void) { uint8_t* data = malloc(1024*sizeof(uint8_t)); data[1023] = 0x20; payload_t* payload = make_payload(data, 1024); printf("data (%p) : %lu\n", data, malloc_size(data)); free(data); printf("data (%p) : %lu\n", data, malloc_size(data)); uint8_t* more = malloc(1024*sizeof(uint8_t)); more[1023] = 0x30; printf("more (%p) : %lu\n", more, malloc_size(more)); tuple_t* tuple1 = make_tuple(1, payload); printf("data (%p) : %lu\n", data, malloc_size(data)); printf("\n"); tuple_t* tuple2 = make_tuple(2, payload); printf("data (%p) : %lu\n", data, malloc_size(data)); printf("payload (%p) : %lu\n", payload, malloc_size(payload->data)); printf("tuple1 (%p) : %lu\n", tuple1->payload->data, malloc_size(tuple1->payload->data)); printf("tuple2 (%p) : %lu\n", tuple2->payload->data, malloc_size(tuple2->payload->data)); printf("\n"); free_payload(payload); printf("data (%p) : %lu\n", data, malloc_size(data)); printf("payload (%p) : %lu\n", payload, malloc_size(payload->data)); printf("tuple1 (%p) : %lu\n", tuple1->payload->data, malloc_size(tuple1->payload->data)); printf("tuple2 (%p) : %lu\n", tuple2->payload->data, malloc_size(tuple2->payload->data)); printf("\n"); free_tuple(tuple1); printf("data (%p) : %lu\n", data, malloc_size(data)); printf("payload (%p) : %lu\n", payload, malloc_size(payload->data)); printf("tuple1 (%p) : %lu\n", tuple1->payload->data, malloc_size(tuple1->payload->data)); printf("tuple2 (%p) : %lu\n", tuple2->payload->data, malloc_size(tuple2->payload->data)); printf("\n"); free_tuple(tuple2); printf("data (%p) : %lu\n", data, malloc_size(data)); printf("payload (%p) : %lu\n", payload, malloc_size(payload->data)); printf("tuple1 (%p) : %lu\n", tuple1->payload->data, malloc_size(tuple1->payload)); printf("tuple2 (%p) : %lu\n", tuple2->payload->data, malloc_size(tuple2->payload)); printf("\n"); exit(EXIT_SUCCESS); }
static int receive_resp(struct ts_engine_client *client) { struct ts_engine_client_resp *resp = &client->resp; int ret; ret = __ts_engine_full_read(client->fdout, resp, sizeof(*resp)); if (ret != sizeof(*resp)) { eng_dbg("read header failed: %d\n", ret); return ERROR; } if (resp->hdr.status != OK) { eng_dbg("resp->hdr.status: %d\n", resp->hdr.status); } if (resp->hdr.length) { free_payload(client); client->payload.data = malloc(resp->hdr.length); if (!client->payload.data) { perror("malloc"); return ERROR; } ret = __ts_engine_full_read(client->fdout, client->payload.data, resp->hdr.length); if (ret < 0) { eng_dbg("__ts_engine_full_read failed\n"); free_payload(client); return ERROR; } } return OK; }
void rrnx_list_free(rrnx_list *list) { if (list == NULL) { // Already deallocated return; } rrnx_list_item *item = list->first; while (item != NULL) { rrnx_list_item *next = item->next; // Free user-defined payload free_payload(list, item); // Free the list item itself. // Don't bother to maintain links. free(item); // Advance item = next; } list->first = NULL; list->last = NULL; // Remove the list itself free(list); }
void free_tuple(tuple_t* tuple) { free_payload(tuple->payload); free(tuple); }