static int setup(void **state) { struct test_data *data = malloc(sizeof(struct test_data)); if (data == NULL) return -1; data->head = malloc(sizeof(struct list_item)); data->tail_minus_1 = malloc(sizeof(struct list_item)); data->tail = malloc(sizeof(struct list_item)); if (data->head == NULL || data->tail_minus_1 == NULL || data->tail == NULL) { free(data->head); free(data->tail_minus_1); free(data->tail); free(data); return -1; } list_init(data->head); list_init(data->tail_minus_1); list_init(data->tail); list_item_append(data->tail_minus_1, data->head); list_item_append(data->tail, data->head); *state = data; return 0; }
void ipc_platform_send_msg(struct ipc *ipc) { struct ipc_msg *msg; uint32_t flags; spin_lock_irq(&ipc->lock, flags); /* any messages to send ? */ if (list_is_empty(&ipc->shared_ctx->msg_list)) { ipc->shared_ctx->dsp_pending = 0; goto out; } /* now send the message */ msg = list_first_item(&ipc->shared_ctx->msg_list, struct ipc_msg, list); mailbox_dspbox_write(0, msg->tx_data, msg->tx_size); list_item_del(&msg->list); ipc->shared_ctx->dsp_msg = msg; tracev_ipc("ipc: msg tx -> 0x%x", msg->header); /* now interrupt host to tell it we have message sent */ list_item_append(&msg->list, &ipc->shared_ctx->empty_list); out: spin_unlock_irq(&ipc->lock, flags); }
ListNode *list_append (List *list, void *data) { ListNode *node; if (!list) { error (InvalidArgument); return NULL; } if (!size_t_add (list->count, 1, NULL)) { error (Overflow); return NULL; } if (!(node = memory_create (sizeof (ListNode)))) { error (FunctionCall); return NULL; } node->data = data; return (ListNode *)list_item_append (list, (ListItem *)node); }