Messages in this thread | | | Subject | Re: initialize a mutex into locked state? | From | Oleg Drokin <> | Date | Fri, 17 Jun 2016 10:24:32 -0400 |
| |
On Jun 17, 2016, at 10:19 AM, Peter Zijlstra wrote:
> On Fri, Jun 17, 2016 at 10:14:10AM -0400, Oleg Drokin wrote: >> >> On Jun 17, 2016, at 4:25 AM, Peter Zijlstra wrote: >> >>> On Wed, Jun 15, 2016 at 02:23:35PM -0400, Oleg Drokin wrote: >>>> Hello! >>>> >>>> To my surprise I found out that it's not possible to initialise a mutex into >>>> a locked state. >>>> I discussed it with Arjan and apparently there's no fundamental reason >>>> not to allow this. >>> >>> There is. A mutex _must_ have an owner. If you can initialize it in >>> locked state, you could do so statically, ie. outside of the context of >>> a task. >> >> What's wrong with disallowing only static initializers, but allowing dynamic ones? >> Then there is a clear owner. > > At which point, what wrong with the simple: > > mutex_init(&m); > mutex_lock(&m); > > Sequence? Its obvious, has clear semantics and doesn't extend the API.
The problem is:
spin_lock(somelock); structure = some_internal_list_lookup(list); if (structure) goto out;
init_new_structure(new_structure); mutex_init(&new_structure->s_mutex); mutex_lock(&new_structure->s_mutex); // XXX CANNOT DO THIS UNDER SPINLOCK!
list_add(list, new_structure->s_list); structure = new_structure; out: spin_unlock(somelock); return structure;
| |