| // Copyright 2010 The Go Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style |
| // license that can be found in the LICENSE file. |
| |
| package runtime |
| #include "config.h" |
| #include "channel.h" |
| |
| typedef _Bool bool; |
| typedef unsigned char byte; |
| typedef struct __go_channel chan; |
| |
| /* Do a nonblocking channel receive. */ |
| |
| func chanrecv2(c *chan, val *byte) (pres bool) { |
| if (c->element_size > 8) { |
| return __go_receive_nonblocking_big(c, val); |
| } else { |
| struct __go_receive_nonblocking_small rs; |
| union { |
| char b[8]; |
| uint64_t v; |
| } u; |
| |
| rs = __go_receive_nonblocking_small (c); |
| if (!rs.__success) { |
| __builtin_memset(val, 0, c->element_size); |
| return 0; |
| } |
| u.v = rs.__val; |
| #ifndef WORDS_BIGENDIAN |
| __builtin_memcpy(val, u.b, c->element_size); |
| #else |
| __builtin_memcpy(val, u.b + 8 - c->element_size, |
| c->element_size); |
| #endif |
| return 1; |
| } |
| } |