@@ -705,9 +705,7 @@ static PyType_Spec ThreadHandle_Type_spec = {
705
705
706
706
typedef struct {
707
707
PyObject_HEAD
708
- PyThread_type_lock lock_lock ;
709
- PyObject * in_weakreflist ;
710
- char locked ; /* for sanity checking */
708
+ PyMutex lock ;
711
709
} lockobject ;
712
710
713
711
static int
@@ -722,15 +720,7 @@ lock_dealloc(PyObject *op)
722
720
{
723
721
lockobject * self = (lockobject * )op ;
724
722
PyObject_GC_UnTrack (self );
725
- if (self -> in_weakreflist != NULL ) {
726
- PyObject_ClearWeakRefs ((PyObject * ) self );
727
- }
728
- if (self -> lock_lock != NULL ) {
729
- /* Unlock the lock so it's safe to free it */
730
- if (self -> locked )
731
- PyThread_release_lock (self -> lock_lock );
732
- PyThread_free_lock (self -> lock_lock );
733
- }
723
+ PyObject_ClearWeakRefs ((PyObject * ) self );
734
724
PyTypeObject * tp = Py_TYPE (self );
735
725
tp -> tp_free ((PyObject * )self );
736
726
Py_DECREF (tp );
@@ -798,13 +788,12 @@ lock_PyThread_acquire_lock(PyObject *op, PyObject *args, PyObject *kwds)
798
788
return NULL ;
799
789
}
800
790
801
- PyLockStatus r = acquire_timed (self -> lock_lock , timeout );
791
+ PyLockStatus r = _PyMutex_LockTimed (& self -> lock , timeout ,
792
+ _PY_LOCK_HANDLE_SIGNALS | _PY_LOCK_DETACH );
802
793
if (r == PY_LOCK_INTR ) {
803
794
return NULL ;
804
795
}
805
796
806
- if (r == PY_LOCK_ACQUIRED )
807
- self -> locked = 1 ;
808
797
return PyBool_FromLong (r == PY_LOCK_ACQUIRED );
809
798
}
810
799
@@ -836,13 +825,11 @@ lock_PyThread_release_lock(PyObject *op, PyObject *Py_UNUSED(ignored))
836
825
{
837
826
lockobject * self = (lockobject * )op ;
838
827
/* Sanity check: the lock must be locked */
839
- if (! self -> locked ) {
828
+ if (_PyMutex_TryUnlock ( & self -> lock ) < 0 ) {
840
829
PyErr_SetString (ThreadError , "release unlocked lock" );
841
830
return NULL ;
842
831
}
843
832
844
- self -> locked = 0 ;
845
- PyThread_release_lock (self -> lock_lock );
846
833
Py_RETURN_NONE ;
847
834
}
848
835
@@ -870,7 +857,7 @@ static PyObject *
870
857
lock_locked_lock (PyObject * op , PyObject * Py_UNUSED (ignored ))
871
858
{
872
859
lockobject * self = (lockobject * )op ;
873
- return PyBool_FromLong (( long ) self -> locked );
860
+ return PyBool_FromLong (PyMutex_IsLocked ( & self -> lock ) );
874
861
}
875
862
876
863
PyDoc_STRVAR (locked_doc ,
@@ -890,21 +877,15 @@ lock_repr(PyObject *op)
890
877
{
891
878
lockobject * self = (lockobject * )op ;
892
879
return PyUnicode_FromFormat ("<%s %s object at %p>" ,
893
- self -> locked ? "locked" : "unlocked" , Py_TYPE (self )-> tp_name , self );
880
+ PyMutex_IsLocked ( & self -> lock ) ? "locked" : "unlocked" , Py_TYPE (self )-> tp_name , self );
894
881
}
895
882
896
883
#ifdef HAVE_FORK
897
884
static PyObject *
898
885
lock__at_fork_reinit (PyObject * op , PyObject * Py_UNUSED (args ))
899
886
{
900
- lockobject * self = (lockobject * )op ;
901
- if (_PyThread_at_fork_reinit (& self -> lock_lock ) < 0 ) {
902
- PyErr_SetString (ThreadError , "failed to reinitialize lock at fork" );
903
- return NULL ;
904
- }
905
-
906
- self -> locked = 0 ;
907
-
887
+ lockobject * self = (lockobject * )op ;
888
+ _PyMutex_at_fork_reinit (& self -> lock );
908
889
Py_RETURN_NONE ;
909
890
}
910
891
#endif /* HAVE_FORK */
@@ -970,18 +951,12 @@ A lock is not owned by the thread that locked it; another thread may\n\
970
951
unlock it. A thread attempting to lock a lock that it has already locked\n\
971
952
will block until another thread unlocks it. Deadlocks may ensue." );
972
953
973
- static PyMemberDef lock_type_members [] = {
974
- {"__weaklistoffset__" , Py_T_PYSSIZET , offsetof(lockobject , in_weakreflist ), Py_READONLY },
975
- {NULL },
976
- };
977
-
978
954
static PyType_Slot lock_type_slots [] = {
979
955
{Py_tp_dealloc , lock_dealloc },
980
956
{Py_tp_repr , lock_repr },
981
957
{Py_tp_doc , (void * )lock_doc },
982
958
{Py_tp_methods , lock_methods },
983
959
{Py_tp_traverse , lock_traverse },
984
- {Py_tp_members , lock_type_members },
985
960
{Py_tp_new , lock_new },
986
961
{0 , 0 }
987
962
};
@@ -990,7 +965,7 @@ static PyType_Spec lock_type_spec = {
990
965
.name = "_thread.lock" ,
991
966
.basicsize = sizeof (lockobject ),
992
967
.flags = (Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC |
993
- Py_TPFLAGS_IMMUTABLETYPE ),
968
+ Py_TPFLAGS_IMMUTABLETYPE | Py_TPFLAGS_MANAGED_WEAKREF ),
994
969
.slots = lock_type_slots ,
995
970
};
996
971
@@ -1340,16 +1315,7 @@ newlockobject(PyObject *module)
1340
1315
if (self == NULL ) {
1341
1316
return NULL ;
1342
1317
}
1343
-
1344
- self -> lock_lock = PyThread_allocate_lock ();
1345
- self -> locked = 0 ;
1346
- self -> in_weakreflist = NULL ;
1347
-
1348
- if (self -> lock_lock == NULL ) {
1349
- Py_DECREF (self );
1350
- PyErr_SetString (ThreadError , "can't allocate lock" );
1351
- return NULL ;
1352
- }
1318
+ self -> lock = (PyMutex ){0 };
1353
1319
return self ;
1354
1320
}
1355
1321
0 commit comments