pok_ret_t pok_port_virtual_destination (const pok_port_id_t id, const uint32_t n, uint32_t* result) { uint32_t val; if (id >= POK_CONFIG_NB_PORTS) { return POK_ERRNO_PORT; } if (! pok_own_port (POK_SCHED_CURRENT_PARTITION, id)) { return POK_ERRNO_PORT; } if (pok_ports_kind[id] != POK_PORT_KIND_VIRTUAL) { return POK_ERRNO_PORT; } if (n > pok_ports_nb_destinations[id]) { return POK_ERRNO_PORT; } val = (uint32_t) pok_ports_destinations[id][n]; *result = val; return POK_ERRNO_OK; }
pok_ret_t pok_port_queueing_status (const pok_port_id_t id, pok_port_queueing_status_t* status) { if (id > POK_CONFIG_NB_PORTS) { return POK_ERRNO_EINVAL; } if (! pok_own_port (POK_SCHED_CURRENT_PARTITION, id)) { return POK_ERRNO_PORT; } if (pok_ports[id].ready == FALSE) { return POK_ERRNO_EINVAL; } if (pok_ports[id].kind != POK_PORT_KIND_QUEUEING) { return POK_ERRNO_EINVAL; } if (pok_ports[id].partition != POK_SCHED_CURRENT_PARTITION) { return POK_ERRNO_EINVAL; } status->size = pok_ports[id].size; status->direction = pok_ports[id].direction; status->waiting_processes = 0; return POK_ERRNO_OK; }
pok_ret_t pok_port_sampling_status (const pok_port_id_t id, pok_port_sampling_status_t* status) { if (id > POK_CONFIG_NB_PORTS) { return POK_ERRNO_EINVAL; } if (! pok_own_port (POK_SCHED_CURRENT_PARTITION, id)) { return POK_ERRNO_PORT; } if (pok_ports[id].ready == FALSE) { return POK_ERRNO_EINVAL; } if (pok_ports[id].kind != POK_PORT_KIND_SAMPLING) { return POK_ERRNO_EINVAL; } if (pok_ports[id].partition != POK_SCHED_CURRENT_PARTITION) { return POK_ERRNO_EINVAL; } status->size = pok_ports[id].size; status->direction = pok_ports[id].direction; status->refresh = pok_ports[id].refresh; if ( (pok_ports[id].last_receive + pok_ports[id].refresh) < POK_GETTICK()) { status->validity = FALSE; } else { status->validity = TRUE; } return POK_ERRNO_OK; }
pok_ret_t pok_port_virtual_get_global (const pok_port_id_t local, pok_port_id_t* global) { if (local >= POK_CONFIG_NB_PORTS) { return POK_ERRNO_PORT; } if (! pok_own_port (POK_SCHED_CURRENT_PARTITION, local)) { return POK_ERRNO_PORT; } if (pok_ports_kind[local] != POK_PORT_KIND_VIRTUAL) { return POK_ERRNO_PORT; } *global = (pok_port_id_t) pok_local_ports_to_global_ports[local]; return POK_ERRNO_OK; }
pok_ret_t pok_port_virtual_id (char* name, pok_port_id_t* id) { uint8_t i; for (i = 0; i < POK_CONFIG_NB_PORTS ; i++) { if ( (strcmp (name, pok_ports_names[i]) == 0) && (pok_ports_kind[i] == POK_PORT_KIND_VIRTUAL)) { if (! pok_own_port (POK_SCHED_CURRENT_PARTITION, i)) { return POK_ERRNO_PORT; } *id = i; return POK_ERRNO_OK; } } return POK_ERRNO_NOTFOUND; }
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_port_queueing_send ( const pok_port_id_t id, const void* data, const pok_port_size_t len, uint64_t timeout) { (void) timeout; if (id > POK_CONFIG_NB_PORTS) { #ifdef POK_QD printf("(id > POK_CONFIG_NB_PORTS id: %d\n", id); #endif return POK_ERRNO_EINVAL; } if ((len <=0 ) || (len > pok_ports[id].max_message_size)) { return POK_ERRNO_SIZE; } if (data == POK_NULL) { #ifdef POK_QD printf("data == POK_NULL \n"); #endif 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 (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; } // check if the port is already full if (pok_ports[id].all_tokens_full) { return POK_ERRNO_UNAVAILABLE; }else { #ifdef POK_QD printf("writing token....\n"); printf(" writing token in pok_ports[%d].first_empty %d\n",id,pok_ports[id].first_empty); #endif pok_ports[id].tokens[pok_ports[id].first_empty].empty = FALSE; pok_ports[id].tokens[pok_ports[id].first_empty].msg_slot = (unsigned char *)data; pok_ports[id].tokens[pok_ports[id].first_empty].size = len; #ifdef POK_QD printf(" message size: %d\n", pok_ports[id].tokens[pok_ports[id].first_empty].size); printf(" message in message_slot: %c\n", pok_ports[id].tokens[pok_ports[id].first_empty].msg_slot[0]); #endif pok_ports[id].first_empty = (pok_ports[id].first_empty +1) % pok_ports[id].max_nb_messages; if (pok_ports[id].all_tokens_empty){ pok_ports[id].all_tokens_empty = FALSE; pok_ports[id].first_not_empty = 0; } if (pok_ports[id].first_empty == pok_ports[id].first_not_empty){ pok_ports[id].all_tokens_full = TRUE; } #ifdef POK_QD printf (" pok_ports[id].first_empty %d\n",pok_ports[id].first_empty); printf (" pok_ports[id].first_not_empty %d\n",pok_ports[id].first_not_empty); #endif } return POK_ERRNO_OK; }