Пример #1
0
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;
}
Пример #2
0
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;
}
Пример #3
0
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;
}
Пример #4
0
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;
}
Пример #5
0
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;
}
Пример #6
0
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;
}
Пример #7
0
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;
}