Exemplo n.º 1
0
uint64_t
__go_receive_small_closed (struct __go_channel *channel, _Bool for_select,
                           _Bool *received)
{
    uintptr_t element_size;
    uint64_t ret;

    if (channel == NULL)
        __go_panic_msg ("receive from nil channel");

    element_size = channel->element_type->__size;
    __go_assert (element_size <= sizeof (uint64_t));

    if (!__go_receive_acquire (channel, for_select))
    {
        if (received != NULL)
            *received = 0;
        return 0;
    }

    ret = channel->data[channel->next_fetch];

    __go_receive_release (channel);

    if (received != NULL)
        *received = 1;

    return ret;
}
_Bool
__go_receive_big (struct __go_channel *channel, void *val, _Bool for_select)
{
  uintptr_t element_size;
  size_t alloc_size;
  size_t offset;

  if (channel == NULL)
    {
      /* Block forever.  */
      __go_select (0, 0, NULL, NULL);
    }

  element_size = channel->element_type->__size;
  alloc_size = (element_size + sizeof (uint64_t) - 1) / sizeof (uint64_t);

  if (!__go_receive_acquire (channel, for_select))
    {
      __builtin_memset (val, 0, element_size);
      return 0;
    }

  offset = channel->next_fetch * alloc_size;
  __builtin_memcpy (val, &channel->data[offset], element_size);

  __go_receive_release (channel);

  return 1;
}
Exemplo n.º 3
0
uint64_t
__go_receive_small_closed (struct __go_channel *channel, _Bool for_select,
                           _Bool *received)
{
    uintptr_t element_size;
    uint64_t ret;

    if (channel == NULL)
    {
        /* Block forever.  */
        __go_select (0, 0, NULL, NULL);
    }

    element_size = channel->element_type->__size;
    __go_assert (element_size <= sizeof (uint64_t));

    if (!__go_receive_acquire (channel, for_select))
    {
        if (received != NULL)
            *received = 0;
        return 0;
    }

    ret = channel->data[channel->next_fetch];

    __go_receive_release (channel);

    if (received != NULL)
        *received = 1;

    return ret;
}
_Bool
__go_receive_nonblocking_big (struct __go_channel* channel, void *val)
{
  size_t alloc_size;
  size_t offset;

  alloc_size = ((channel->element_size + sizeof (uint64_t) - 1)
		/ sizeof (uint64_t));

  int data = __go_receive_nonblocking_acquire (channel);
  if (data != RECEIVE_NONBLOCKING_ACQUIRE_DATA)
    {
      __builtin_memset (val, 0, channel->element_size);
      if (data == RECEIVE_NONBLOCKING_ACQUIRE_NODATA)
	return 0;
      else
	{
	  /* Channel is closed.  */
	  return 1;
	}
    }

  offset = channel->next_fetch * alloc_size;
  __builtin_memcpy (val, &channel->data[offset], channel->element_size);

  __go_receive_release (channel);

  return 1;
}