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; }
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; }