1 /* go-rec-big.c -- receive something larger than 64 bits on a channel.
3 Copyright 2009 The Go Authors. All rights reserved.
4 Use of this source code is governed by a BSD-style
5 license that can be found in the LICENSE file. */
12 /* Returns true if a value was received, false if the channel is
16 __go_receive_big (struct __go_channel
*channel
, void *val
, _Bool for_select
)
18 uintptr_t element_size
;
23 __go_panic_msg ("receive from nil channel");
25 element_size
= channel
->element_type
->__size
;
26 alloc_size
= (element_size
+ sizeof (uint64_t) - 1) / sizeof (uint64_t);
28 if (!__go_receive_acquire (channel
, for_select
))
30 __builtin_memset (val
, 0, element_size
);
34 offset
= channel
->next_fetch
* alloc_size
;
35 __builtin_memcpy (val
, &channel
->data
[offset
], element_size
);
37 __go_receive_release (channel
);