File tree Expand file tree Collapse file tree 6 files changed +257
-93
lines changed Expand file tree Collapse file tree 6 files changed +257
-93
lines changed Original file line number Diff line number Diff line change @@ -469,6 +469,9 @@ _Py_atomic_load_ptr_acquire(const void *obj);
469
469
static inline void
470
470
_Py_atomic_store_ptr_release (void * obj , void * value );
471
471
472
+ static inline void
473
+ _Py_atomic_store_ssize_release (Py_ssize_t * obj , Py_ssize_t value );
474
+
472
475
static inline void
473
476
_Py_atomic_store_int_release (int * obj , int value );
474
477
@@ -484,6 +487,9 @@ _Py_atomic_load_uint64_acquire(const uint64_t *obj);
484
487
static inline uint32_t
485
488
_Py_atomic_load_uint32_acquire (const uint32_t * obj );
486
489
490
+ static inline Py_ssize_t
491
+ _Py_atomic_load_ssize_acquire (const Py_ssize_t * obj );
492
+
487
493
488
494
// --- _Py_atomic_fence ------------------------------------------------------
489
495
Original file line number Diff line number Diff line change @@ -500,6 +500,10 @@ static inline void
500
500
_Py_atomic_store_int_release (int * obj , int value )
501
501
{ __atomic_store_n (obj , value , __ATOMIC_RELEASE ); }
502
502
503
+ static inline void
504
+ _Py_atomic_store_ssize_release (Py_ssize_t * obj , Py_ssize_t value )
505
+ { __atomic_store_n (obj , value , __ATOMIC_RELEASE ); }
506
+
503
507
static inline int
504
508
_Py_atomic_load_int_acquire (const int * obj )
505
509
{ return __atomic_load_n (obj , __ATOMIC_ACQUIRE ); }
@@ -516,6 +520,10 @@ static inline uint32_t
516
520
_Py_atomic_load_uint32_acquire (const uint32_t * obj )
517
521
{ return __atomic_load_n (obj , __ATOMIC_ACQUIRE ); }
518
522
523
+ static inline Py_ssize_t
524
+ _Py_atomic_load_ssize_acquire (const Py_ssize_t * obj )
525
+ { return __atomic_load_n (obj , __ATOMIC_ACQUIRE ); }
526
+
519
527
// --- _Py_atomic_fence ------------------------------------------------------
520
528
521
529
static inline void
Original file line number Diff line number Diff line change @@ -939,6 +939,18 @@ _Py_atomic_store_int_release(int *obj, int value)
939
939
#endif
940
940
}
941
941
942
+ static inline void
943
+ _Py_atomic_store_ssize_release (Py_ssize_t * obj , Py_ssize_t value )
944
+ {
945
+ #if defined(_M_X64 ) || defined(_M_IX86 )
946
+ * (Py_ssize_t volatile * )obj = value ;
947
+ #elif defined(_M_ARM64 )
948
+ __stlr64 ((unsigned __int64 volatile * )obj , (unsigned __int64 )value );
949
+ #else
950
+ # error "no implementation of _Py_atomic_store_ssize_release"
951
+ #endif
952
+ }
953
+
942
954
static inline int
943
955
_Py_atomic_load_int_acquire (const int * obj )
944
956
{
@@ -990,6 +1002,18 @@ _Py_atomic_load_uint32_acquire(const uint32_t *obj)
990
1002
#endif
991
1003
}
992
1004
1005
+ static inline Py_ssize_t
1006
+ _Py_atomic_load_ssize_acquire (const Py_ssize_t * obj )
1007
+ {
1008
+ #if defined(_M_X64 ) || defined(_M_IX86 )
1009
+ return * (Py_ssize_t volatile * )obj ;
1010
+ #elif defined(_M_ARM64 )
1011
+ return (Py_ssize_t )__ldar64 ((unsigned __int64 volatile * )obj );
1012
+ #else
1013
+ # error "no implementation of _Py_atomic_load_ssize_acquire"
1014
+ #endif
1015
+ }
1016
+
993
1017
// --- _Py_atomic_fence ------------------------------------------------------
994
1018
995
1019
static inline void
Original file line number Diff line number Diff line change @@ -879,6 +879,14 @@ _Py_atomic_store_int_release(int *obj, int value)
879
879
memory_order_release );
880
880
}
881
881
882
+ static inline void
883
+ _Py_atomic_store_ssize_release (Py_ssize_t * obj , Py_ssize_t value )
884
+ {
885
+ _Py_USING_STD ;
886
+ atomic_store_explicit ((_Atomic (Py_ssize_t )* )obj , value ,
887
+ memory_order_release );
888
+ }
889
+
882
890
static inline int
883
891
_Py_atomic_load_int_acquire (const int * obj )
884
892
{
@@ -908,7 +916,13 @@ _Py_atomic_load_uint32_acquire(const uint32_t *obj)
908
916
{
909
917
_Py_USING_STD ;
910
918
return atomic_load_explicit ((const _Atomic (uint32_t )* )obj ,
911
- memory_order_acquire );
919
+ }
920
+
921
+ static inline Py_ssize_t
922
+ _Py_atomic_load_ssize_acquire (const Py_ssize_t * obj )
923
+ {
924
+ _Py_USING_STD ;
925
+ return atomic_load_explicit ((const _Atomic (Py_ssize_t )* )obj ,
912
926
}
913
927
914
928
Original file line number Diff line number Diff line change @@ -136,6 +136,11 @@ struct _dictkeysobject {
136
136
/* Kind of keys */
137
137
uint8_t dk_kind ;
138
138
139
+ #ifdef Py_GIL_DISABLED
140
+ /* Lock used to protect shared keys */
141
+ PyMutex dk_mutex ;
142
+ #endif
143
+
139
144
/* Version number -- Reset to 0 by any modification to keys */
140
145
uint32_t dk_version ;
141
146
@@ -145,6 +150,7 @@ struct _dictkeysobject {
145
150
/* Number of used entries in dk_entries. */
146
151
Py_ssize_t dk_nentries ;
147
152
153
+
148
154
/* Actual hash table of dk_size entries. It holds indices in dk_entries,
149
155
or DKIX_EMPTY(-1) or DKIX_DUMMY(-2).
150
156
You can’t perform that action at this time.
0 commit comments