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/CAAYkT3NpSo8xc_1vcyo_0VNe2mAO07_aMa_b6K4YV0keO44R1w%40mail.gmail.com.