Ejemplo n.º 1
0
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;
}
Ejemplo n.º 2
0
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;
}