Hi Nick,

It sounds like this would be relatively easy to bundle up as a test
app.  If you can do so and post it somewhere, I'll think you'll have a
better chance of a helpful response.

Also, are you aware of -[NSObject
performSelector:onThread:withObject:] and friends?

> Assumption #1 - as the threads are both running "currentRunLoop" then I'm
> assuming that each thread has it's own RunLoop instance?

That's correct.

"
+ (NSRunLoop *)currentRunLoop

Return Value
The NSRunLoop object for the current thread.

Discussion
If a run loop does not yet exist for the thread, one is created and returned.
"

-Ken


On Tue, Jul 15, 2008 at 2:45 PM, Nick Kitchener
<[EMAIL PROTECTED]> wrote:
> Hi,
>
> I have a problem with inter-thread communications with
> NSMachPort/NSPortMessage - it works one way after initially working both
> ways..
>
> The application has a main parent thread that spawns a child thread. The
> child thread runs inside an object instance.
>
> The parent passes it's NSMachPort instance through the NSThread
> detachNewSelector to the child.  The parent runs a loop and drives it's
> RunLoop.
>
> The child once spawned creates it's own NSMachPort instance and then
> packages it up and sends it to the parent (which the parent receives
> correctly). This is the classic Apple documented 'checkin'. It then enters
> the classic while(1) { RunLoop ... } to drive the runloop.
>
> Assumption #1 - as the threads are both running "currentRunLoop" then I'm
> assuming that each thread has it's own RunLoop instance? I understand that
> the RunLoop is thread unsafe.
>
> The parent can issue as many messages as it likes to the child process. Each
> message gets to the child thread without a problem - each and every time.
>
> Now comes the interesting bit.
> The child uses a single method for all it's send calls back to the parent
> thread - even the checkin uses it - where it calls [NSPortMessage
> sendMessage: ...]. The observed results are that the initial checkin message
> gets to the parent handlePortMessage: whereas subsequent calls don't show
> any errors but the message does not arrive at handlePortMessage on the
> parent. They just vanish. The child and parent threads continue as if
> nothing has happened. The parent can still issue messages to the child..
>
> I've checked with gdb and the ports are correct at each call. I notice
> there's three threads (the thread that's not mine shows as a posix thread
> that runs __CFSocketManager and just sits at select$DARWIN_EXTSN). This may
> be handling the streams that my child thread manages (I assume).
> Activity monitor sample shows the parent 100% in it's loop. The child 100%
> sat at mach_msg_trap which I see from the Apple opensource is the
> send/receive for messages in the mach kernel.
>
> Has anyone had this occur before? Is it a dead/live lock in the OS due to
> threads using each others ports or is it there's no messages being sent?
>
> I'm a complete beginner to OSX/Cocoa but not threading.
>
> Cheers,
> Nick.
> _______________________________________________
>
> Cocoa-dev mailing list (Cocoa-dev@lists.apple.com)
>
> Please do not post admin requests or moderator comments to the list.
> Contact the moderators at cocoa-dev-admins(at)lists.apple.com
>
> Help/Unsubscribe/Update your Subscription:
> http://lists.apple.com/mailman/options/cocoa-dev/kenferry%40gmail.com
>
> This email sent to [EMAIL PROTECTED]
>
_______________________________________________

Cocoa-dev mailing list (Cocoa-dev@lists.apple.com)

Please do not post admin requests or moderator comments to the list.
Contact the moderators at cocoa-dev-admins(at)lists.apple.com

Help/Unsubscribe/Update your Subscription:
http://lists.apple.com/mailman/options/cocoa-dev/archive%40mail-archive.com

This email sent to [EMAIL PROTECTED]

Reply via email to