pok_ret_t pok_port_queueing_send (const pok_port_id_t id, const void* data, const pok_port_size_t len, uint64_t timeout) { pok_lockobj_lockattr_t lockattr; (void) lockattr; pok_ret_t ret; if (id > POK_CONFIG_NB_PORTS) { return POK_ERRNO_EINVAL; } if (len <= 0) { return POK_ERRNO_SIZE; } if (data == NULL) { return POK_ERRNO_EINVAL; } if (! pok_own_port (POK_SCHED_CURRENT_PARTITION, id)) { return POK_ERRNO_PORT; } if (pok_ports[id].ready != TRUE) { return POK_ERRNO_PORT; } if (len > pok_ports[id].size) { return POK_ERRNO_SIZE; } if (pok_ports[id].direction != POK_PORT_DIRECTION_OUT) { return POK_ERRNO_DIRECTION; } if (pok_ports[id].partition != POK_SCHED_CURRENT_PARTITION) { return POK_ERRNO_EPERM; } if (pok_ports[id].kind != POK_PORT_KIND_QUEUEING) { return POK_ERRNO_KIND; } ret = pok_lockobj_lock (&pok_ports[id].lock, NULL); if (ret != POK_ERRNO_OK) { return ret; } if (timeout != 0) { timeout = timeout + POK_GETTICK(); } while (len > pok_port_available_size (id)) { if (timeout == 0) { pok_lockobj_unlock (&pok_ports[id].lock, NULL); return POK_ERRNO_FULL; } else { ret = pok_lockobj_eventwait (&pok_ports[id].lock, timeout); if (ret != POK_ERRNO_OK) { pok_lockobj_unlock (&pok_ports[id].lock, NULL); return (ret); } } } pok_port_write (id, data, len); pok_ports[id].must_be_flushed = TRUE; ret = pok_lockobj_unlock (&pok_ports[id].lock, NULL); if (ret != POK_ERRNO_OK) { return ret; } return POK_ERRNO_OK; }
pok_ret_t pok_lockobj_partition_wrapper (const pok_lockobj_id_t id, const pok_lockobj_lockattr_t* attr) { /* First, we check that the locked object belongs to the partition * If not, we return an error */ pok_ret_t ret; if (id < pok_partitions[POK_SCHED_CURRENT_PARTITION].lockobj_index_low) { return POK_ERRNO_EINVAL; } if ( id >= pok_partitions[POK_SCHED_CURRENT_PARTITION].lockobj_index_high) { return POK_ERRNO_EINVAL; } if (pok_partitions_lockobjs[id].kind != attr->obj_kind) { return POK_ERRNO_EINVAL; } switch (attr->operation) { case LOCKOBJ_OPERATION_LOCK: ret = pok_lockobj_lock (&pok_partitions_lockobjs[id], attr); return ret; break; case LOCKOBJ_OPERATION_UNLOCK: { ret = pok_lockobj_unlock (&pok_partitions_lockobjs[id], attr); return ret; break; } case LOCKOBJ_OPERATION_WAIT: { ret = pok_lockobj_eventwait (&pok_partitions_lockobjs[id], attr->time); return ret; break; } case LOCKOBJ_OPERATION_SIGNAL: { ret = pok_lockobj_eventsignal (&pok_partitions_lockobjs[id]); return ret; break; } case LOCKOBJ_OPERATION_BROADCAST: { ret = pok_lockobj_eventbroadcast (&pok_partitions_lockobjs[id]); return ret; break; } default: return POK_ERRNO_EINVAL; } return POK_ERRNO_EINVAL; }