> On Dec 15, 2015, at 5:32 PM, Kevin Ballard <ke...@sb.org> wrote:
> 
>> On Tue, Dec 15, 2015, at 01:38 PM, Greg Parker via swift-dev wrote:
>> 
>> Another solution is to use a handoff lock algorithm. This is what libobjc 
>> does now. The lock owner stores its thread ID in the lock. Each lock waiter 
>> yields to the owner thread specifically, donating its priority and resolving 
>> the inversion. This scheme has theoretical holes when multiple locks are 
>> involved, but in practice we haven't seen any problems.
>> 
>> As far as I know the spinlock that libobjc now uses is not API.
> 
> It's not. I checked earlier today against the copy of the objc runtime I have 
> (from opensource.apple.com; my copy is slightly out of date, at version 647, 
> but it's new enough). The runtime defines a type spinlock_t that's backed by 
> something called os_lock_handoff_s. It also imports a header 
> <os/lock_private.h>, which is presumably where this type is defined. I 
> already updated my radar to suggest that perhaps this type would be a good 
> candidate to expose.
> 
> Incidentally, if I wanted to implement my own spinlock like this, how can you 
> yield to a specific thread? I'm only aware of pthread_yield_np(), which 
> doesn't take a target thread.

It uses Mach's thread_switch() and passes a Mach thread port. It also uses a 
private option flag; I don't know if any of the public ones are good enough to 
solve the problem.


-- 
Greg Parker     gpar...@apple.com     Runtime Wrangler


_______________________________________________
swift-dev mailing list
swift-dev@swift.org
https://lists.swift.org/mailman/listinfo/swift-dev

Reply via email to