FWIW writing to a channel non-blockingly works like this: select { case ch <- v: default: }
If no communication can proceed (i.e. the write would block) the default case is chosen. On Mon, Jul 5, 2021 at 1:09 PM Erman İmer <ermani...@gmail.com> wrote: > Thank you! I was confused about the highlighted part "For a channel used > for notification of *just one* signal value, a buffer of size 1 is > sufficient.*" *But I am convinced after realizing the single read on the > 289th line. I will also spend some time understanding how Notify writes > signals non-blockingly. > > Best regards > > On Mon, Jul 5, 2021 at 2:01 PM 'Axel Wagner' via golang-nuts < > golang-nuts@googlegroups.com> wrote: > >> The documentation <https://golang.org/pkg/os/signal/#Notify> is actually >> very specific here: >> >> Package signal will not block sending to c: the caller must ensure that c >>> has sufficient buffer space to keep up with the expected signal rate. *For >>> a channel used for notification of just one signal value, a buffer of size >>> 1 is sufficient.* >> >> >> (emphasis mine). This is exactly such a case. We only need one signal >> value to know the context is cancelled. >> >> On Mon, Jul 5, 2021 at 12:55 PM Axel Wagner < >> axel.wagner...@googlemail.com> wrote: >> >>> On Mon, Jul 5, 2021 at 12:41 PM Erman İmer <ermani...@gmail.com> wrote: >>> >>>> I think it is not about the context's cancellation. The signal channel >>>> should have a sufficient buffer size. >>>> >>> >>> 1 is a sufficient buffer size. Note that there is *exactly one* read >>> from c.ch in >>> >>> https://github.com/golang/go/blob/912f0750472dd4f674b69ca1616bfaf377af1805/src/os/signal/signal.go#L287 >>> Therefore, even if the buffer was larger, any extra buffered signals >>> would never be read. So the only possible point to having a larger buffer >>> would be to prevent a writer from blocking on writing to it. >>> >>> However, as the documentation you are quoting is pointing out, `Notify` >>> (the only writer to that channel) writes the signal non-blockingly. >>> Therefore, there is never any danger of `Notify` getting blocked. The >>> sentence you are quoting (making sure there is enough buffer size) is there >>> to assure you have enough buffer space for a signal to get delivered - not >>> to prevent `Notify` from blocking. >>> >>> Lastly, even *if* we needed more buffer space, your assumption that we >>> need as much buffer space as there are signals is wrong. A single signal >>> can be caught multiple times. So *if* we needed to be able to handle >>> multiple signals (we don't - again, there is only one read, which is the >>> one cancelling the context), we would also take into account that aspect. >>> And there just is no actually correct size of the buffer, to make sure >>> *all* signals get delivered - the number of signals that can happen before >>> a reader is ready is unbounded. >>> >>> The code as it is currently is correct. >>> >>> >>> >>> >>>> >>>> Please check the former discussion which determined the Notify >>>> function's description. >>>> https://github.com/dominikh/go-staticcheck/issues/30 >>>> >>>> Best regards >>>> >>>> On Mon, Jul 5, 2021 at 1:28 PM Sean Liao <seankhl...@gmail.com> wrote: >>>> >>>>> What problem are you trying to solve? >>>>> It only makes sense for NotifyContext to receive a single signal since >>>>> a context can only be cancelled once >>>>> >>>>> On Monday, July 5, 2021 at 10:17:49 AM UTC+2 erma...@gmail.com wrote: >>>>> >>>>>> Sorry about the broken link, here is the line: >>>>>> >>>>>> https://github.com/golang/go/blob/912f0750472dd4f674b69ca1616bfaf377af1805/src/os/signal/signal.go#L284 >>>>>> >>>>>> On Monday, July 5, 2021 at 11:15:11 AM UTC+3 erma...@gmail.com wrote: >>>>>> >>>>>>> Hello, >>>>>>> >>>>>>> I have an improvement idea for the following line in the os/signals >>>>>>> package. >>>>>>> >>>>>>> 284 c.ch = make(chan os.Signal, 1) >>>>>>> >>>>>>> Regarding the underlying function's (Notify) description ("the >>>>>>> caller must ensure that channel has sufficient buffer space to keep up >>>>>>> with >>>>>>> the expected signal rate.") the code can be improved like the following >>>>>>> code snippet: >>>>>>> >>>>>>> cap := len(signals) >>>>>>> if cap == 0 { >>>>>>> cap = 1 >>>>>>> } >>>>>>> c.ch = make(chan os.Signal, cap) >>>>>>> >>>>>>> I wanted to discuss here first before opening my first issue :) >>>>>>> >>>>>>> Best regards >>>>>>> >>>>>>> >>>>>>> >>>>>>> -- >>>>> You received this message because you are subscribed to a topic in the >>>>> Google Groups "golang-nuts" group. >>>>> To unsubscribe from this topic, visit >>>>> https://groups.google.com/d/topic/golang-nuts/PpUBZ1hxBbM/unsubscribe. >>>>> To unsubscribe from this group and all its topics, 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/c1cd6bd9-5307-4a71-9caa-f13c354185ccn%40googlegroups.com >>>>> <https://groups.google.com/d/msgid/golang-nuts/c1cd6bd9-5307-4a71-9caa-f13c354185ccn%40googlegroups.com?utm_medium=email&utm_source=footer> >>>>> . >>>>> >>>> >>>> >>>> -- >>>> *Erman İmer* >>>> >>>> -- >>>> 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/CAAYkT3MhFw3nmx6Fduv0wRiy10uC1un3whkwYN%2BVNbJPvtApfA%40mail.gmail.com >>>> <https://groups.google.com/d/msgid/golang-nuts/CAAYkT3MhFw3nmx6Fduv0wRiy10uC1un3whkwYN%2BVNbJPvtApfA%40mail.gmail.com?utm_medium=email&utm_source=footer> >>>> . >>>> >>> -- >> You received this message because you are subscribed to a topic in the >> Google Groups "golang-nuts" group. >> To unsubscribe from this topic, visit >> https://groups.google.com/d/topic/golang-nuts/PpUBZ1hxBbM/unsubscribe. >> To unsubscribe from this group and all its topics, 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/CAEkBMfGrMgVFTAVzZfcruB94rntR6nqWshOC%2Bg%2BTK6FAeaiogw%40mail.gmail.com >> <https://groups.google.com/d/msgid/golang-nuts/CAEkBMfGrMgVFTAVzZfcruB94rntR6nqWshOC%2Bg%2BTK6FAeaiogw%40mail.gmail.com?utm_medium=email&utm_source=footer> >> . >> > > > -- > *Erman İmer* > -- 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/CAEkBMfHQ7q%3DTq0QJKS%2B%2Biagn6OrFEEu8%2BEpEK3QXuKSS9vaB6w%40mail.gmail.com.