[vlc-devel] compat pthread_cancel

Rémi Denis-Courmont remi at remlab.net
Sat Jun 11 10:54:34 CEST 2011


Le samedi 11 juin 2011 11:18:30 Jean-Philippe André, vous avez écrit :
> > And then, either this whole thing makes no sense or it relies on
> > super-POSIX properties of Android libc that I don't know and thus
> > cannot review.
> 
> The only super-posix property I remember is that poll() returns whenever
> the process receives a signal. (ppoll does not exist)

I'm not sure what you mean. POSIX poll() certainly returns -1 on signal and 
sets EINTR. Unfortunately, it is not reliable for the reasons that lead to the 
invention of POSIX pselect() and Linux ppoll(). I don't see how Android be any 
better. This problem is intrinsic to the definitions of select(), poll() and 
of asynchronous signals.

> >  > Arf... What parts seem dubious?
> >
> > In my world:
> > * Signal handlers are (unfortunately) per-process, not per-thread.
> 
> Yes, unfortunately. This can indeed lead to issues.

I don't see any issue except for being a waste. And it makes me feel like the 
author of the code did not know what (s)he was doing.

> > * Setting thread keys to zero is pointless.
>
> Indeed, but not an issue.
>
> > * POSIX thread functions are not async-signal-safe, meaning they are not
> > defined within signal handlers.
>
> Thus many FIXME and 'Why?' comments^^
> Unfortunately I didn't find any other easily implementable solution that
> wouldn't be based on signals

Unless Android ensures that those functions are async-signal-safe, which it 
could even though POSIX does not, this does not work. If it does not work, it 
does not belong in the vlc.git.

> and that doesn't add yet another main thread watching the others.

With neither pselect() nor ppoll(), there is really not much practical use for 
signals in a multi-thread context. But this is moot: Within POSIX, there is 
not much a signal handler can do if its thread is blocked in, say, 
pthread_cond_(timed)wait(). Thus signals cannot be used for the purpose of 
cancelling a thread, unless you (can) make assumptions about the C run-time 
beyond POSIX promises.

> Maybe futexes are the way to go, but my knowledge of them is even worse
> than that of pthread^^

Obviously most preemptive implementations of POSIX threads use a reserved 
real-time signal to implement cancellation. But they rely on implementation-
dependent properties, such as atomic memory operations or async-signal-safe 
internal and proprietary functions.

I don't know Android libc, but I doubt this approach will ever work there.

> > * pthread_setcancelstate() is not a cancellation point.
> 
> OK, my bad. Slight misunderstanding/misreading of the API back then. Easy
> to remove the cancellation point here :)
> 
> >  I also don't understand where cancellation cleanup handlers
> > (vlc_cleanup_push and friends) are dealt with.
> 
> They are dealt with by the call to pthread_exit. If there's any
> vlc-specific task to execute, then yes, it's not being taken care of.

Ok. I did not realize that cleanup handlers were correctly handled even though 
cancellation was not.

> The code works, according to experimental testing, but it is not meant to
> be correct. That's one reason why I've never submitted it.


> Btw, cancellation on Android is probably one of the worst ideas we could
> ever have ;-)

It's the least common denominator of POSIX threads and Windows 5. Win32 
Asynchronous Procedure Calls are actually far more flexible than cancellation 
and signals, so POSIX was the portability bottleneck.

-- 
Rémi Denis-Courmont
http://www.remlab.net/
http://fi.linkedin.com/in/remidenis



More information about the vlc-devel mailing list