@@ -701,9 +701,7 @@ static PyType_Spec ThreadHandle_Type_spec = {
701
701
702
702
typedef struct {
703
703
PyObject_HEAD
704
- PyThread_type_lock lock_lock ;
705
- PyObject * in_weakreflist ;
706
- char locked ; /* for sanity checking */
704
+ PyMutex lock ;
707
705
} lockobject ;
708
706
709
707
static int
@@ -717,15 +715,7 @@ static void
717
715
lock_dealloc (lockobject * self )
718
716
{
719
717
PyObject_GC_UnTrack (self );
720
- if (self -> in_weakreflist != NULL ) {
721
- PyObject_ClearWeakRefs ((PyObject * ) self );
722
- }
723
- if (self -> lock_lock != NULL ) {
724
- /* Unlock the lock so it's safe to free it */
725
- if (self -> locked )
726
- PyThread_release_lock (self -> lock_lock );
727
- PyThread_free_lock (self -> lock_lock );
728
- }
718
+ PyObject_ClearWeakRefs ((PyObject * ) self );
729
719
PyTypeObject * tp = Py_TYPE (self );
730
720
tp -> tp_free ((PyObject * )self );
731
721
Py_DECREF (tp );
@@ -790,13 +780,12 @@ lock_PyThread_acquire_lock(lockobject *self, PyObject *args, PyObject *kwds)
790
780
if (lock_acquire_parse_args (args , kwds , & timeout ) < 0 )
791
781
return NULL ;
792
782
793
- PyLockStatus r = acquire_timed (self -> lock_lock , timeout );
783
+ PyLockStatus r = _PyMutex_LockTimed (& self -> lock , timeout ,
784
+ _PY_LOCK_HANDLE_SIGNALS | _PY_LOCK_DETACH );
794
785
if (r == PY_LOCK_INTR ) {
795
786
return NULL ;
796
787
}
797
788
798
- if (r == PY_LOCK_ACQUIRED )
799
- self -> locked = 1 ;
800
789
return PyBool_FromLong (r == PY_LOCK_ACQUIRED );
801
790
}
802
791
@@ -827,13 +816,11 @@ static PyObject *
827
816
lock_PyThread_release_lock (lockobject * self , PyObject * Py_UNUSED (ignored ))
828
817
{
829
818
/* Sanity check: the lock must be locked */
830
- if (! self -> locked ) {
819
+ if (_PyMutex_TryUnlock ( & self -> lock ) < 0 ) {
831
820
PyErr_SetString (ThreadError , "release unlocked lock" );
832
821
return NULL ;
833
822
}
834
823
835
- self -> locked = 0 ;
836
- PyThread_release_lock (self -> lock_lock );
837
824
Py_RETURN_NONE ;
838
825
}
839
826
@@ -860,7 +847,7 @@ Release the lock.");
860
847
static PyObject *
861
848
lock_locked_lock (lockobject * self , PyObject * Py_UNUSED (ignored ))
862
849
{
863
- return PyBool_FromLong (( long ) self -> locked );
850
+ return PyBool_FromLong (PyMutex_IsLocked ( & self -> lock ) );
864
851
}
865
852
866
853
PyDoc_STRVAR (locked_doc ,
@@ -879,20 +866,14 @@ static PyObject *
879
866
lock_repr (lockobject * self )
880
867
{
881
868
return PyUnicode_FromFormat ("<%s %s object at %p>" ,
882
- self -> locked ? "locked" : "unlocked" , Py_TYPE (self )-> tp_name , self );
869
+ PyMutex_IsLocked ( & self -> lock ) ? "locked" : "unlocked" , Py_TYPE (self )-> tp_name , self );
883
870
}
884
871
885
872
#ifdef HAVE_FORK
886
873
static PyObject *
887
874
lock__at_fork_reinit (lockobject * self , PyObject * Py_UNUSED (args ))
888
875
{
889
- if (_PyThread_at_fork_reinit (& self -> lock_lock ) < 0 ) {
890
- PyErr_SetString (ThreadError , "failed to reinitialize lock at fork" );
891
- return NULL ;
892
- }
893
-
894
- self -> locked = 0 ;
895
-
876
+ _PyMutex_at_fork_reinit (& self -> lock );
896
877
Py_RETURN_NONE ;
897
878
}
898
879
#endif /* HAVE_FORK */
@@ -958,18 +939,12 @@ A lock is not owned by the thread that locked it; another thread may\n\
958
939
unlock it. A thread attempting to lock a lock that it has already locked\n\
959
940
will block until another thread unlocks it. Deadlocks may ensue." );
960
941
961
- static PyMemberDef lock_type_members [] = {
962
- {"__weaklistoffset__" , Py_T_PYSSIZET , offsetof(lockobject , in_weakreflist ), Py_READONLY },
963
- {NULL },
964
- };
965
-
966
942
static PyType_Slot lock_type_slots [] = {
967
943
{Py_tp_dealloc , (destructor )lock_dealloc },
968
944
{Py_tp_repr , (reprfunc )lock_repr },
969
945
{Py_tp_doc , (void * )lock_doc },
970
946
{Py_tp_methods , lock_methods },
971
947
{Py_tp_traverse , lock_traverse },
972
- {Py_tp_members , lock_type_members },
973
948
{Py_tp_new , lock_new },
974
949
{0 , 0 }
975
950
};
@@ -978,7 +953,7 @@ static PyType_Spec lock_type_spec = {
978
953
.name = "_thread.lock" ,
979
954
.basicsize = sizeof (lockobject ),
980
955
.flags = (Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC |
981
- Py_TPFLAGS_IMMUTABLETYPE ),
956
+ Py_TPFLAGS_IMMUTABLETYPE | Py_TPFLAGS_MANAGED_WEAKREF ),
982
957
.slots = lock_type_slots ,
983
958
};
984
959
@@ -1320,16 +1295,7 @@ newlockobject(PyObject *module)
1320
1295
if (self == NULL ) {
1321
1296
return NULL ;
1322
1297
}
1323
-
1324
- self -> lock_lock = PyThread_allocate_lock ();
1325
- self -> locked = 0 ;
1326
- self -> in_weakreflist = NULL ;
1327
-
1328
- if (self -> lock_lock == NULL ) {
1329
- Py_DECREF (self );
1330
- PyErr_SetString (ThreadError , "can't allocate lock" );
1331
- return NULL ;
1332
- }
1298
+ self -> lock = (PyMutex ){0 };
1333
1299
return self ;
1334
1300
}
1335
1301
0 commit comments