Exemple #1
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;
}
Exemple #2
0
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;
}