[Xcb] More pthread stubs.
M Joonas Pihlaja
jpihlaja at cc.helsinki.fi
Wed Mar 10 11:11:56 PST 2010
On Wed, 10 Mar 2010, Jamey Sharp wrote:
> 2010/3/10 Rémi Denis-Courmont <remi at remlab.net>:
> > In principle, the attribute setters should check that the value is valid
> > and return EINVAL if not. In that perspective, at least
> > pthread_condattr_setclock() and pthread_mutexattr_settype() shouldn't
> > blindly return zero. I have not checked the other ones.
>
> I wonder. How much do we care about validating that code linked
> against pthread-stubs is correctly using the API?
I'm hoping for "not very much". As a reference point, HP's equivalent
of pthread-stubs returns zero for nearly every function it provides a
stub for except the thread local variable functions which actually
have working implementations, pthread_self() (returns 1),
pthread_equal() (checks that the args are equal), pthread_create()
(returns ENOSYS), and pthread_attr_init() (also ENOSYS)
http://docs.hp.com/en/1896/pthreads.html
> > Also pthread_mutex_lock() should probably to check against recursive
> > locking if you add pthread_mutexattr_settype(), meaning you add
> > error-checking mutexes.
>
> As you say, Rémi, this is the exception. If somebody asks for an
> error-checking mutex, we'd probably better check for self-deadlock. I
> guess.
Personally I'm not a huge fan of providing checking since we'd need to
actually save some state somewhere, and also we'd need to make some
assumptions about the system's static mutex initializers. While
pthreads itself only supports PTHREAD_MUTEX_INITIALIZER, apps use
non-portable initializers like PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP.
I suppose we could autoconf our way out of this though. *sigh*
> I'd still like to see a response to my post on the cairo list
> about this, explaining why that library actually needs recursive
> mutexes.
It appears that the main motivation is to let the application separate
the concerns of drawing to a surface and having a thread take
exclusive ownership of the resources underlying a "device" backing a
cairo surface.
There are two use cases which together necessitate a recursive mutex:
1) A thread performs a cairo call without explicitly taking the device
lock so the cairo call itself must then take the device lock. This is
required to keep the API simple so that non-device aware users of
cairo can Just Work(tm).
2) A thread wants to take exclusive ownership of the device's
resources while also making cairo calls. The cairo calls again try to
take the device lock as per case 1), but since the thread has already
locked the mutex it must be recursive.
If we only needed to support either one of those use cases, then the
mutex wouldn't need to be recursive. We could say that the user MUST
take the device lock before multithreaded rendering, or NEVER does.
The former option is just plain annoying for the user, and the latter
doesn't let the application establish a single critical region of
ownership where they can perform cairo rendering and twiddle the
device at the same time.
I may have gotten the details wrong since this is pretty new code in
cairo which I'm not intimately familiar with, but as far as I can tell
this is the justification for the recursivity of the lock.
> I'd very much like to take the first commit in the series, "Add a tool
> to create stubs.c from a list of functions," but oh please, don't
> write it in Lua.
[snip]
Okay I can do that. I have to say I find Lua to be much more readable
than m4 though.
> The rest of the commits are just a matter of debating which parts of
> the POSIX thread API we should support and why; and I think that
> discussion needs justification from callers like cairo about why they
> care. Assuming we want all those stubs, I think these patches
> correctly implement them.
Could pthread-stubs gain a policy which would allow more stubs to be
provided without apps needing to prod for each new stub (and wait for
a subsequent release of pthread-stubs) with a specific use case?
Something like the one you outlined last fall, and could go something
like this: "Setters are okay. Getters not so much. Correctly
functioning single threaded apps which don't rely on actual threads
should work as long as long as they don't try to invoke the stubs with
invalid arguments."
Cheers,
Joonas
More information about the Xcb
mailing list