[Newbies] Re: Read a filestream (named pipe) with a timeout

dsl101 dl3 at pale-eds.co.uk
Fri Jan 10 12:13:40 UTC 2014


Hi Ron,

Thanks for that - but I can only see #dataAvailable for Sockets, not for
FileStream (named pipes). I think the same kind of thing is available for
pipes (you can do `pipe size` to see how much data is there), but it still
doesn't wait. I'm trying to avoid a busy loop waiting for the data - like
this:

start := DateAndTime millisecondClockValue.
(pipe size < 32) & (DateAndTime millisecondClockValue - start < 3000)
ifTrue: [
(Delay forMilliseconds 50) wait.
]
pipe size = 32 ifTrue: [
"Get data"
] ifFalse: [
"Deal with timeout"
]

The shorter the 'wait', the more responsive the code is to data arriving on
the pipe, but the more CPU it will use as it spins round the loop. The
longer the 'wait', the more lag it has for data coming back. That's what
I'm trying to avoid by blocking on the read, but with a way to escape after
some timeout.

I'm guessing the call to 'pipe next:' is a primitive, and blocks there,
which is why valueWithin:onTimeout: doesn't return after the timeout, but
does eventually return the correct answer. So, I'm guessing I'll have to do
something like this:

   - Set up a semaphore
   - Fork the blocking read process, which will signal the semaphore if it
   ever returns its 32 bytes
   - In the main thread, wait for up to 3 seconds for the semaphore to be
   signalled
   - If the semaphore times out, kill the forked process

Obviously there's a potential race at the end there, but the worst case is
we throw away data which was returned at the last moment. Is there anything
else you can see wrong with this approach?

Thanks,

Dave


On Thu, Jan 9, 2014 at 9:16 PM, Ron Teitelbaum [via Smalltalk] <
ml-node+s1294792n4735547h61 at n4.nabble.com> wrote:

> Hi Dave,
>
> See #dataAvailable  and #recieveAvailableData.
>
> It's never good to call for data if you don't know you have any.  Better
> to
> setup a wait for data until call instead.
>
> All the best,
>
> Ron Teitelbaum
> Head Of Engineering
> 3d Immersive Collaboration Consulting
> [hidden email] <http://user/SendEmail.jtp?type=node&node=4735547&i=0>
> Follow Me On Twitter: @RonTeitelbaum
> www.3dicc.com
> https://www.google.com/+3dicc
>
>
> > -----Original Message-----
> > From: [hidden email]<http://user/SendEmail.jtp?type=node&node=4735547&i=1>[mailto:
> beginners-
> > [hidden email] <http://user/SendEmail.jtp?type=node&node=4735547&i=2>]
> On Behalf Of dsl101
> > Sent: Thursday, January 09, 2014 10:16 AM
> > To: [hidden email]<http://user/SendEmail.jtp?type=node&node=4735547&i=3>
> > Subject: [Newbies] Read a filestream (named pipe) with a timeout
> >
> > I'm using Squeak 4.2 and working on the smalltalk end of a named pipe
> > connection, which sends a message to the named pipe server with:
> >
> > msg := 'Here''s Johnny!!!!'.
> > pipe nextPutAll: msg; flush.
> >
> > It should then receive an acknowledgement, which will be a 32-byte md5
> hash of
> > the received message (which the smalltalk app can then verify). It's
> possible the
> > named pipe server may have gone away or otherwise been unable to deal
> with
> > the request, and so I'd like to set a timeout on reading the
> acknowledgement.
> > I've tried using this:
> >
> > ack := [ pipe next: 32 ] valueWithin: (Duration seconds: 3)
> onTimeout: [
> > 'timeout'. ].
> >
> > and then made the pipe server pause artificially to test the code. But
> the
> > smalltalk thread blocks on the read and doesn't carry on (even after the
> > timeout), although if I then get the pipe server to send the correct
> response
> > (after a 5 second delay, for example), the value of 'ack' is 'timeout'.
> Obviously
> > the timeout did what it's supposed to do, but couldn't 'unblock' the
> blocking
> > read on the pipe.
> >
> > Is there a way to accomplish this even with a blocking FileStream read?
> I'd rather
> > avoid a busy wait on there being 32 characters available if at all
> possible.
> >
> > Thanks,
> >
> > Dave
> >
> >
> >
> > --
> > View this message in context:
> http://forum.world.st/Read-a-filestream-named-
> > pipe-with-a-timeout-tp4735456.html
> > Sent from the Squeak - Beginners mailing list archive at Nabble.com.
> > _______________________________________________
> > Beginners mailing list
> > [hidden email] <http://user/SendEmail.jtp?type=node&node=4735547&i=4>
> > http://lists.squeakfoundation.org/mailman/listinfo/beginners
>
>
> _______________________________________________
> Beginners mailing list
> [hidden email] <http://user/SendEmail.jtp?type=node&node=4735547&i=5>
> http://lists.squeakfoundation.org/mailman/listinfo/beginners
>
>
> ------------------------------
>  If you reply to this email, your message will be added to the discussion
> below:
>
> http://forum.world.st/Read-a-filestream-named-pipe-with-a-timeout-tp4735456p4735547.html
>  To unsubscribe from Read a filestream (named pipe) with a timeout, click
> here<http://forum.world.st/template/NamlServlet.jtp?macro=unsubscribe_by_code&node=4735456&code=ZGwzQHBhbGUtZWRzLmNvLnVrfDQ3MzU0NTZ8MTEyNTU4NzUzMg==>
> .
> NAML<http://forum.world.st/template/NamlServlet.jtp?macro=macro_viewer&id=instant_html%21nabble%3Aemail.naml&base=nabble.naml.namespaces.BasicNamespace-nabble.view.web.template.NabbleNamespace-nabble.view.web.template.NodeNamespace&breadcrumbs=notify_subscribers%21nabble%3Aemail.naml-instant_emails%21nabble%3Aemail.naml-send_instant_email%21nabble%3Aemail.naml>
>




--
View this message in context: http://forum.world.st/Read-a-filestream-named-pipe-with-a-timeout-tp4735456p4735661.html
Sent from the Squeak - Beginners mailing list archive at Nabble.com.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.squeakfoundation.org/pipermail/beginners/attachments/20140110/c1c48d08/attachment.htm


More information about the Beginners mailing list