@@ -2430,10 +2430,8 @@ def test_buffer_protocol(self):
2430
2430
self .assertEqual (f .write (arr ), LENGTH )
2431
2431
self .assertEqual (f .tell (), LENGTH )
2432
2432
2433
- @unittest .skip ("it fails for now, see gh-133885" )
2434
2433
class FreeThreadingMethodTests (unittest .TestCase ):
2435
2434
2436
- @unittest .skipUnless (Py_GIL_DISABLED , 'this test can only possibly fail with GIL disabled' )
2437
2435
@threading_helper .reap_threads
2438
2436
@threading_helper .requires_working_threading ()
2439
2437
def test_compress_locking (self ):
@@ -2470,7 +2468,6 @@ def run_method(method, input_data, output_data):
2470
2468
actual = b'' .join (output ) + rest2
2471
2469
self .assertEqual (expected , actual )
2472
2470
2473
- @unittest .skipUnless (Py_GIL_DISABLED , 'this test can only possibly fail with GIL disabled' )
2474
2471
@threading_helper .reap_threads
2475
2472
@threading_helper .requires_working_threading ()
2476
2473
def test_decompress_locking (self ):
@@ -2506,6 +2503,59 @@ def run_method(method, input_data, output_data):
2506
2503
actual = b'' .join (output )
2507
2504
self .assertEqual (expected , actual )
2508
2505
2506
+ @threading_helper .reap_threads
2507
+ @threading_helper .requires_working_threading ()
2508
+ def test_compress_shared_dict (self ):
2509
+ num_threads = 8
2510
+
2511
+ def run_method (b ):
2512
+ level = threading .get_ident () % 4
2513
+ # sync threads to increase chance of contention on
2514
+ # capsule storing dictionary levels
2515
+ b .wait ()
2516
+ ZstdCompressor (level = level ,
2517
+ zstd_dict = TRAINED_DICT .as_digested_dict )
2518
+ b .wait ()
2519
+ ZstdCompressor (level = level ,
2520
+ zstd_dict = TRAINED_DICT .as_undigested_dict )
2521
+ b .wait ()
2522
+ ZstdCompressor (level = level ,
2523
+ zstd_dict = TRAINED_DICT .as_prefix )
2524
+ threads = []
2525
+
2526
+ b = threading .Barrier (num_threads )
2527
+ for i in range (num_threads ):
2528
+ thread = threading .Thread (target = run_method , args = (b ,))
2529
+
2530
+ threads .append (thread )
2531
+
2532
+ with threading_helper .start_threads (threads ):
2533
+ pass
2534
+
2535
+ @threading_helper .reap_threads
2536
+ @threading_helper .requires_working_threading ()
2537
+ def test_decompress_shared_dict (self ):
2538
+ num_threads = 8
2539
+
2540
+ def run_method (b ):
2541
+ # sync threads to increase chance of contention on
2542
+ # decompression dictionary
2543
+ b .wait ()
2544
+ ZstdDecompressor (zstd_dict = TRAINED_DICT .as_digested_dict )
2545
+ b .wait ()
2546
+ ZstdDecompressor (zstd_dict = TRAINED_DICT .as_undigested_dict )
2547
+ b .wait ()
2548
+ ZstdDecompressor (zstd_dict = TRAINED_DICT .as_prefix )
2549
+ threads = []
2550
+
2551
+ b = threading .Barrier (num_threads )
2552
+ for i in range (num_threads ):
2553
+ thread = threading .Thread (target = run_method , args = (b ,))
2554
+
2555
+ threads .append (thread )
2556
+
2557
+ with threading_helper .start_threads (threads ):
2558
+ pass
2509
2559
2510
2560
2511
2561
if __name__ == "__main__" :
0 commit comments