pok_ret_t pok_blackboard_read (const pok_blackboard_id_t id, const uint64_t timeout, void* data, pok_port_size_t* len) { (void) timeout; if (id > POK_CONFIG_NB_BLACKBOARDS) { return POK_ERRNO_EINVAL; } if (data == NULL) { return POK_ERRNO_EINVAL; } if (pok_blackboards[id].ready != TRUE) { return POK_ERRNO_EINVAL; } /* FIXME : Protect with mutexes when empty, ... */ /* See what is the condition to use the timeout */ pok_event_lock (pok_blackboards[id].lock); memcpy (data, &pok_blackboards_data[pok_blackboards[id].index], pok_blackboards[id].size); pok_event_unlock (pok_blackboards[id].lock); /* FIXME : return right size */ *len = pok_blackboards[id].size; return POK_ERRNO_OK; }
pok_ret_t pok_buffer_create (char* name, const pok_range_t max_nb_messages, const pok_port_size_t max_msg_size, const pok_queueing_discipline_t discipline, pok_buffer_id_t* id) { uint8_t n; pok_ret_t ret; if (first_time) { pok_buffer_init(); first_time = FALSE; } for (n=0 ; n < POK_CONFIG_NB_BUFFERS ; n++) { if (streq (name, pok_buffers_names[n])) { if (pok_buffers[n].ready == TRUE) { return POK_ERRNO_READY; } #ifdef POK_NEEDS_SCHED_O1_SPLIT ret = pok_event_create (&pok_buffers[n].not_full); if (ret != POK_ERRNO_OK) { printf ("\tpok_buffer_create: Err in 'pok_event_create' for not_full event\n"); return ret; } ret = pok_event_create (&pok_buffers[n].not_empty); if (ret != POK_ERRNO_OK) { printf ("\tpok_buffer_create: Err in 'pok_event_create' for not_empty event\n"); return ret; } /* the not-empty has to be set DOWN because a new buffer is empy */ pok_event_lock(pok_buffers[n].not_empty); #else ret = pok_event_create (&pok_buffers[n].lock); if (ret != POK_ERRNO_OK) { // printf ("\tpok_buffer_create: Err in 'pok_event_create'\n"); return ret; } #endif pok_buffers[n].index = pok_buffers_data_index; pok_buffers[n].ready = TRUE; pok_buffers[n].empty = TRUE; pok_buffers[n].size = max_nb_messages * max_msg_size; pok_buffers[n].first_size = -1; pok_buffers[n].off_e = 0; pok_buffers[n].off_b = 0; pok_buffers[n].discipline = discipline; pok_buffers_data_index = pok_buffers_data_index + pok_buffers[n].size; pok_buffers[n].status.nb_messages = 0; pok_buffers[n].status.max_messages = max_nb_messages; pok_buffers[n].status.max_message_size = max_msg_size; pok_buffers[n].status.waiting_processes = 0; *id = n; return POK_ERRNO_OK; } } printf ("\tpok_buffer_create: Name mismatch\n"); return POK_ERRNO_EINVAL; }