Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 27 Feb 2001 07:43:49 -0500 (EST)
From:      Peter Dufault <dufault@hda.hda.com>
To:        Marc W <mwlist@lanfear.com>
Cc:        freebsd-hackers@FreeBSD.ORG
Subject:   Re: Where can I find out rules on blocking in threads?
Message-ID:  <200102271245.f1RCj5T21997@hda.hda.com>
In-Reply-To: <200102270121.RAA39980@akira.lanfear.com> from Marc W at "Feb 26, 2001 05:21:37 pm"

next in thread | previous in thread | raw e-mail | index | archive | help
>     1. initializes some UI goo (but doesn't start any of it UP) using a
> GUI framework (Qt)
>     2. creates a FIFO, and then spawns a thread
>     3. this new thread then does:
> 
>             fifo = open(fifoPath, O_RDONLY);

...

> 
>     Now, the problem is that when step 3 above blocks on the open(2)
> call (as it should, since the other end of the pipe isn't opened yet),
> the whole application is frozen, and the main thread can't continue
> with GUI processing, and the app appears to die.
> 
>     What is goofy is that this works just fine under Linux.  So,
> FreeBSD has slightly different blocking rules or something -- but I
> don't understand them.  It also hangs under Solaris 8/Intel.
> 
>     So, the question is:  how can I find out what these differences are
> and try to get around them.   I'm using this to limit instances of my
> program to one, and need a named pipe instead of just a lock file so
> that new instances can communicate any arguments they might have been
> given, etc ...  

I think the FreeBSD behavior is wrong, the spec says that when
opening a FIFO with O_NONBLOCK clear that:

> An open() for reading-only shall block the calling thread until a
> thread opens the file for writing.  An open() for writing-only
> shall block the calling thread until a thread opens the file for
> reading.

The FBSD man pages will let you know if something will block or
not, for example, look at the "implementation notes" section for
open.

You can open the fifo non-blocking and then clear O_NONBLOCK using
fcntl, hopefully that will work in all environments.

Peter

--
Peter Dufault (dufault@hda.com)   Realtime development, Machine control,
HD Associates, Inc.               Fail-Safe systems, Agency approval

To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-hackers" in the body of the message




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200102271245.f1RCj5T21997>