Only a buffered channel can "hold" anything. If the channel is unbuffered, then you are guaranteed that another goroutine has at least received the item you sent when the send statement returns.
On Mon, Jul 8, 2019 at 9:42 PM Burak Serdar <bser...@ieee.org> wrote: > On Mon, Jul 8, 2019 at 10:14 PM Daniel Eloff <dan.el...@gmail.com> wrote: > > > > If a select statement has multiple channels ready when it runs, then it > will choose one at a random. So if you fire something across a channel that > holds a resource, like an open file descriptor - you have no guarantees > that the other end of the channel receives it. The (possibly full) channel > will get garbage collected later and the resource will leak in that case. > > > > Some code that explains things better than my clumsy prose: > > > > Receiver: > > // Wait on the channel, or for timeout > > select { > > case fd := <-channel: > > return fd, nil > > case <-time.After(queue.timeout): > > return nil, ErrTimeoutElapsed > > } > > > > Sender: > > channel <- fd > > > > What happens when the timeout races with the channel send? I think it's > possible the select handles the timeout in that case and leaves the channel > containing a connection alone. > > > > Am I right that this is a problem? How might I fix this code? > > Interesting problem. Maybe you shouldn't send file descriptors like this? > > One solution could be: > > case <- time.After(queue.timeout): > close(channel) > return nil, errTimeOutElapsed > > and recover from panic on the sending side. > > > > > > > > Thanks, > > Dan > > > > -- > > You received this message because you are subscribed to the Google > Groups "golang-nuts" group. > > To unsubscribe from this group and stop receiving emails from it, send > an email to golang-nuts+unsubscr...@googlegroups.com. > > To view this discussion on the web visit > https://groups.google.com/d/msgid/golang-nuts/5cda1189-2761-4110-8e9e-1d7311fd97fe%40googlegroups.com > . > > For more options, visit https://groups.google.com/d/optout. > > -- > You received this message because you are subscribed to the Google Groups > "golang-nuts" group. > To unsubscribe from this group and stop receiving emails from it, send an > email to golang-nuts+unsubscr...@googlegroups.com. > To view this discussion on the web visit > https://groups.google.com/d/msgid/golang-nuts/CAMV2RqoMh-4w%3DxuFD-1Rk_BOzdDgS%2BiHygNYDBw55me0Sg-eGQ%40mail.gmail.com > . > For more options, visit https://groups.google.com/d/optout. > -- You received this message because you are subscribed to the Google Groups "golang-nuts" group. To unsubscribe from this group and stop receiving emails from it, send an email to golang-nuts+unsubscr...@googlegroups.com. To view this discussion on the web visit https://groups.google.com/d/msgid/golang-nuts/CALRNMm2kh2n8%2BdUS3jOvqCBvOWYpTYazeSNiHhhePHfnY%3DDqqA%40mail.gmail.com. For more options, visit https://groups.google.com/d/optout.