ari icon indicating copy to clipboard operation
ari copied to clipboard

native client listen does not call the wg.Done if the context is cancelled (prior to a DialConfig success). Here is code to resolve the problem.

Open daninmadison opened this issue 3 years ago • 1 comments

In the listen function, the for loop checks for a ctx closed. If it is, it exits the function. It needs to call the wg.Done.

If the Connect function is given a wrong details, the initial listen will never succeed the websocket.DialConfig. As a result, the only way to stop this function is to cancel the context. The problem is, the context closed does not call wg.Done prior to the return.

As a result, the Connect will be stuck at the wg.Wait and never return.

Here is code to correct the problem.

func (c *Client) listen(ctx context.Context, wg *sync.WaitGroup) { var signalUp sync.Once

for {
	// Exit if our context has been closed
	if ctx.Err() != nil {
		if wg != nil {
			wg.Done()
		}
		return
	}

daninmadison avatar Feb 13 '23 19:02 daninmadison

I realized the code I pushed earlier this week had a bug. It needs to use the sync once signalUp for the wg.Done.

Pushed a new fix. Just in case that didn't come through correctly, here is the corrected code...

for {
	// Exit if our context has been closed
	if ctx.Err() != nil {
		if wg != nil {
			signalUp.Do(wg.Done)
		}
		return
	}

daninmadison avatar Feb 16 '23 14:02 daninmadison