
    4ja                     N    S r SSKrSSKrSSKJr  SSKrSSKJr   " S S\5      rg)a,  Tests that exercise the C extension from multiple threads.

These tests pass on any Python build but their real purpose is to
catch data races on free-threaded builds (PEP 703) where the GIL is
disabled. The test_free_threading CI job runs these with
``PYTHON_GIL=0`` on a free-threaded interpreter.
    N)TestCase)skip_if_speedups_missingc                   f    \ rS rSrSrSrSrS r\S 5       r	\S 5       r
\S 5       r\S	 5       rS
rg)TestFreeThreading   z>Exercise the C extension from multiple threads simultaneously.   i  c                 X  ^^ [         R                  S:X  a  U R                  S5        / mUU4S jn[        U R                  5       Vs/ s H  n[
        R                  " US9PM     nnU H  nUR                  5         M     U H  nUR                  5         M     T(       a  TS   eg s  snf )N
emscriptenz#threads not available on Emscriptenc                  f   >  T" 5         g ! [          a  n TR                  U 5         S n A g S n A ff = fN)BaseExceptionappend)eerrorsworkers    c/root/lseg-credit/backend/venv/lib/python3.13/site-packages/simplejson/tests/test_free_threading.pywrapped/TestFreeThreading._run_threads.<locals>.wrapped   s,    !  !a  !s    
0+0)targetr   )	sysplatformskipTestrange	N_THREADS	threadingThreadstartjoin)selfr   r   _threadstr   s    `    @r   _run_threadsTestFreeThreading._run_threads   s    <<<'MM?@	! "$..131q ##731 	 3AGGI AFFH )O 3s   B'c                    ^ ^^ [        [        S5      5      S/ SQS.SS.m[        R                  " TSS9mUUU 4S	 jnT R	                  U5        g )
N@   value)   g      @NTF)keylistu   hello é world)numbersnestedstringT	sort_keysc                     > [        TR                  5       H(  n TR                  [        R                  " TSS9T5        M*     g NTr.   )r   N_ITERassertEqual
simplejsondumps)r    dataexpectedr   s    r   r   8TestFreeThreading.test_concurrent_encode.<locals>.worker3   s7    4;;'  $$TT:HF (    r*   r   r4   r5   r#   )r   r   r6   r7   s   ` @@r   test_concurrent_encode(TestFreeThreading.test_concurrent_encode*   sM     E"I%/JK*

 ##DD9	F
 	&!r9   c                 l   ^ ^^ Sm[         R                  " T5      mUUU 4S jnT R                  U5        g )Nz_{"numbers": [1, 2, 3, 4, 5], "nested": {"a": "b", "c": [true, false, null]}, "string": "hello"}c                     > [        TR                  5       H)  n TR                  [        R                  " T5      T5        M+     g r   )r   r2   r3   r4   loads)r    r7   rawr   s    r   r   8TestFreeThreading.test_concurrent_decode.<locals>.workerC   s1    4;;'  !1!1#!6A (r9   )r4   r?   r#   )r   r   r7   r@   s   ` @@r   test_concurrent_decode(TestFreeThreading.test_concurrent_decode:   s5    ! 	
 ##C(	B 	&!r9   c                    ^ ^^ [        [        S5      5      SSS.m[        R                  " TSS9mUUU 4S jnT R	                  U5        g)z6Mix encode and decode on the same data across threads.    Tmix)itemsflagnamer.   c                     > [        TR                  5       HP  n [        R                  " TSS9nTR	                  UT5        TR	                  [        R
                  " U5      T5        MR     g r1   )r   r2   r4   r5   r3   r?   )r    sr6   r@   r   s     r   r   ?TestFreeThreading.test_concurrent_encode_decode.<locals>.workerO   sS    4;;'$$TT:  C(  !1!1!!4d; (r9   Nr:   )r   r   r6   r@   s   ` @@r   test_concurrent_encode_decode/TestFreeThreading.test_concurrent_encode_decodeI   s@     eBi$Ftt4	< 	&!r9   c                    ^ ^^^^ [         R                  " SS9m[         R                  " 5       mS/ SQSS0S.mTR                  T5      mUUUUU 4S jnT R	                  U5        g)	z7A single encoder/decoder instance used by many threads.Tr.   r(   )r(         r,   )abcc                     > [        TR                  5       HE  n TR                  TR                  T5      T5        TR                  TR	                  T5      T5        MG     g r   )r   r2   r3   encodedecode)r    r6   decencr@   r   s    r   r   >TestFreeThreading.test_shared_encoder_instance.<locals>.worker_   sG    4;;'  D!137  C$7 (r9   N)r4   JSONEncoderJSONDecoderrV   r#   )r   r   r6   rX   rY   r@   s   ` @@@@r   test_shared_encoder_instance.TestFreeThreading.test_shared_encoder_instanceW   s\     $$t4$$&Yh-=>jj	8 	8
 	&!r9    N)__name__
__module____qualname____firstlineno____doc__r   r2   r#   r   r;   rB   rM   r]   __static_attributes__r_   r9   r   r   r      sd    HIF( " " " " " " " "r9   r   )	rd   r   r   unittestr   r4   simplejson.tests._helpersr   r   r_   r9   r   <module>rh      s)        >T" T"r9   