• Kirill Smelkov's avatar
    golang: Fix race in chan._trysend · eb8a1fef
    Kirill Smelkov authored
    For buffered channel _trysend, on success, was unlocking ch._mu too
    early - before accessing ch._dataq with ch._dataq.popleft().
    
    Without the fix, newly added test breaks as e.g.
    
        golang/golang_test.py::test_chan_buf_send_vs_tryrecv_race Exception in thread Thread-3:
        Traceback (most recent call last):
          File "/usr/lib/python2.7/threading.py", line 801, in __bootstrap_inner
            self.run()
          File "/usr/lib/python2.7/threading.py", line 754, in run
            self.__target(*self.__args, **self.__kwargs)
          File "/home/kirr/src/tools/go/pygolang-master/golang/golang_test.py", line 256, in _
            assert (_, _rx) == (1, None)
        AssertionError: assert (0, 209) == (1, None)
          At index 0 diff: 0 != 1
          Full diff:
          - (0, 209)
          + (1, None)
    
        Exception in thread Thread-2:
        Traceback (most recent call last):
          File "/usr/lib/python2.7/threading.py", line 801, in __bootstrap_inner
            self.run()
          File "/usr/lib/python2.7/threading.py", line 754, in run
            self.__target(*self.__args, **self.__kwargs)
          File "/home/kirr/src/tools/go/pygolang-master/golang/golang_test.py", line 243, in _
            ch.send(i)
          File "/home/kirr/src/tools/go/pygolang-master/golang/__init__.py", line 340, in send
            ok = self._trysend(obj)
          File "/home/kirr/src/tools/go/pygolang-master/golang/__init__.py", line 417, in _trysend
            rx = self._dataq.popleft()
        IndexError: pop from an empty deque
    eb8a1fef
Name
Last commit
Last update
golang Loading commit data...
gpython Loading commit data...
.gitignore Loading commit data...
CHANGELOG.rst Loading commit data...
COPYING Loading commit data...
MANIFEST.in Loading commit data...
README.rst Loading commit data...
setup.py Loading commit data...
tox.ini Loading commit data...