Kaydet (Commit) f3a0ff61 authored tarafından Antoine Pitrou's avatar Antoine Pitrou

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.
........
üst ab90b90c
...@@ -7,6 +7,7 @@ from cStringIO import StringIO ...@@ -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): ...@@ -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):
......
...@@ -24,6 +24,9 @@ Core and Builtins ...@@ -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.
......
...@@ -78,7 +78,12 @@ typedef fpos_t Py_off_t; ...@@ -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)
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment