discuss-gnustep
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: does method invocation involve a lock?


From: Tom Sheffler
Subject: Re: does method invocation involve a lock?
Date: Sat, 22 Sep 2018 08:36:21 -0700

Thank you for the great information. 
FYI - In my use case, I am most interested in the ‘steady-state’ of the program 
after all classes have been loaded.
Cheers - T

> On Sep 21, 2018, at 8:26 AM, David Chisnall <gnustep@theravensnest.org> wrote:
> 
> On 21/09/2018 15:49, Tom Sheffler wrote:
>> This question is for my own research: I’m curious about whether invoking 
>> [obj method] can block.  If obj is allocated, and method is simple, does 
>> method invocation involve a lock.
> 
> If obj is allocated, obj has not had its isa pointer swizzled to a class that 
> has not received any messages, and the class of obj implements the method, 
> then no, the message send itself will not block.
> 
> Message sends in the fast path just look up the implementation in the dtable 
> and jump there.  If the method does not exist, then the first check will see 
> if there is a dtable for the class (dtables are lazily allocated on first 
> message send to the class or an instance of the class).  If there isn't one, 
> then the runtime will try to allocate one and may need to send a +initialize 
> message to the object.
> 
> The +initialize message guarantees that no messages will be sent to the class 
> or its instances from any other thread until the +initialize method has 
> returned.  This gets quite exciting inside the runtime if +initialize throws 
> an exception.  This atomicity guarantee is important for implementing 
> singletons, because it means that you can have a class that has methods like 
> this:
> 
> ```objc
> static Singleton *sharedInstance;
> +(void)initialize
> {
>       sharedInstance = [self new];
> }
> +(Singleton*)sharedInstance
> {
>       return sharedInstance;
> }
> ```
> 
> There is no locking in the +sharedInstance method and none is required, 
> because the runtime guarantees that +initialize will be called precisely once 
> before any calls to +sharedInstance.
> 
> The other situation where locking can occur is if the message send invokes 
> any forwarding mechanisms.  For example, with LanguageKit we had a mode where 
> if you sent a message to an object it would pop up a code editor, ask you to 
> provide an implementation of the method, JIT compile it, insert it into the 
> class, and then return the method.  This, of course, requires blocking the 
> calling thread and so acquires a lock.
> 
> Any of the methods such as -forwardingTargetForSelector: and 
> +instanceMethodForSelector: may acquire locks and can be invoked in between a 
> caller's message send expression and flow control landing in the method 
> implementation.
> 
> David




reply via email to

[Prev in Thread] Current Thread [Next in Thread]