#include //blocking, returns early if other process is dead. //return value is number of bytes written. uint32_t try_send_ipc(_task_handle_t to, void *buffer, uint32_t size) { const uint32_t size_backup = size; while (size) { uint32_t res = _ipc_send(to, size, buffer); if (!res) { _wait_ipc_read(to); _yield_task(); } else if (res == -1) return size_backup - size; else { size -= res; buffer += res; } } } //blocking, returns early if other process is dead. //return value is number of bytes read. uint32_t read_ipc(_task_handle_t from, void *buffer, uint32_t size) { const uint32_t size_backup = size; while (size) { uint32_t res = _ipc_read(from, size, buffer); if (!res) { _wait_ipc_send(from); _yield_task(); } else if (res == -1) return size_backup - size; else { size -= res; buffer += res; } } } void flush_ipc(_task_handle_t from) { uint8_t buf[4096]; while (_ipc_read(from, 4096, buf)) ; }