Merged revisions 75818 via svnmerge from

svn+ssh://pythondev@svn.python.org/python/trunk

........
  r75818 | antoine.pitrou | 2009-10-27 18:41:58 +0100 (mar., 27 oct. 2009) | 3 lines

  Issue #7205: Fix a possible deadlock when using a BZ2File object from several threads at once.
........
This commit is contained in:
Antoine Pitrou 2009-10-27 17:46:09 +00:00
parent ab90b90c7b
commit f3a0ff61e0
3 changed files with 27 additions and 1 deletions

View File

@ -7,6 +7,7 @@ from cStringIO import StringIO
import os import os
import subprocess import subprocess
import sys import sys
import threading
import bz2 import bz2
from bz2 import BZ2File, BZ2Compressor, BZ2Decompressor from bz2 import BZ2File, BZ2Compressor, BZ2Decompressor
@ -284,6 +285,23 @@ class BZ2FileTest(BaseTest):
bz2f.close() bz2f.close()
self.assertEqual(xlines, ['Test']) self.assertEqual(xlines, ['Test'])
def testThreading(self):
# Using a BZ2File from several threads doesn't deadlock (issue #7205).
data = "1" * 2**20
nthreads = 10
f = bz2.BZ2File(self.filename, 'wb')
try:
def comp():
for i in range(5):
f.write(data)
threads = [threading.Thread(target=comp) for i in range(nthreads)]
for t in threads:
t.start()
for t in threads:
t.join()
finally:
f.close()
class BZ2CompressorTest(BaseTest): class BZ2CompressorTest(BaseTest):
def testCompress(self): def testCompress(self):

View File

@ -24,6 +24,9 @@ Core and Builtins
Library Library
------- -------
- Issue #7205: Fix a possible deadlock when using a BZ2File object from
several threads at once.
- Issue #7048: Force Decimal.logb to round its result when that result - Issue #7048: Force Decimal.logb to round its result when that result
is too large to fit in the current precision. is too large to fit in the current precision.

View File

@ -78,7 +78,12 @@ typedef fpos_t Py_off_t;
#ifdef WITH_THREAD #ifdef WITH_THREAD
#define ACQUIRE_LOCK(obj) PyThread_acquire_lock(obj->lock, 1) #define ACQUIRE_LOCK(obj) do { \
if (!PyThread_acquire_lock(obj->lock, 0)) { \
Py_BEGIN_ALLOW_THREADS \
PyThread_acquire_lock(obj->lock, 1); \
Py_END_ALLOW_THREADS \
} } while(0)
#define RELEASE_LOCK(obj) PyThread_release_lock(obj->lock) #define RELEASE_LOCK(obj) PyThread_release_lock(obj->lock)
#else #else
#define ACQUIRE_LOCK(obj) #define ACQUIRE_LOCK(obj)