STINNER Victor added the comment:

threading.Timer is implemented with threading.Event.wait(timeout) which is 
implemented with threading.Condition.wait(timeout).

threading.Condition.wait(timeout) creates a lock called "waiter" and uses it to 
implement the wait:

   waiter.acquire(True, timeout)

So at the end of the chain, you find a lock created by _thread.allocate_lock() 
and the Lock.acquire(True, timeout) call.

At the C level, a lock is created by PyThread_allocate_lock(). The 
implementation of PyThread_allocate_lock() depends on the platform. Check:

>>> sys.thread_info
sys.thread_info(name='pthread', lock='semaphore', version='NPTL 2.25')

So in my case (Fedora 25), a Python lock is implemented as a semaphore:

* create the lock: sem_init()
* acquire the lock with a timeout: sem_timedwait(thelock, &ts)

The problem is that the sem_timedwait() function of the glibc doesn't allow to 
specify which clock is used:

https://sourceware.org/bugzilla/show_bug.cgi?id=14717

The second problem is that the glibc relies on the Linux kernel, and the kernel 
doesn't support specifiying a clock (extract of the glib bug):

"It seems this would need kernel work"

--

For sys.thread_info.lock == "mutex+cond", PyThread_allocate_lock(timeout) is 
implemented with pthread_mutex_lock() + pthread_cond_timedwait(). The good news 
is that this API allows to specify the clock:

pthread_condattr_init(&attr);
pthread_condattr_setclock(&attr, CLOCK_MONOTONIC);
pthread_cond_init(&cond, &attr);

... I already created bpo-23428 to call "pthread_condattr_setclock(&attr, 
CLOCK_MONOTONIC);" in Python, it was 2 years ago ;-)

----------

_______________________________________
Python tracker <rep...@bugs.python.org>
<https://bugs.python.org/issue31267>
_______________________________________
_______________________________________________
Python-bugs-list mailing list
Unsubscribe: 
https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com

Reply via email to