[Pharo-project] [squeak-dev] Xtreams : first embryonary port on Squeak

Schwab,Wilhelm K bschwab at anest.ufl.edu
Sun Oct 10 10:39:26 EDT 2010


#fork in a test?  Do you mean like the code below?  The thread running the test waits on something signaled toward the end of the forked thread.  

If you want a watchdog timer, you could fork another thread that waits on a delay, sets an error flag (best to use a shared queue or a mutex to avoid weirdness) and then signals the test semaphore.  You might also want to use #ifCurtailed: to set an error flag and wrap that with #ensure: to signal the semaphore.  You don't necessarily need to be perfect about signaling the semaphore because failure to do so is not much different from your test going into an infinite loop (actually more benign because the stack isn't growing); you'll realize it, break, and figure out what didn't happen or at least "that it didn't" and try again forewarned.  

Does that help?


	"11-09 - try a server and a client in the same image."

		| server port client serverSocket serverSocketStream text thread done read |

	port := 4900.
	done := Semaphore new.

	"11-09 - gag the prompter below"
	serverSocket := nil.

	server := ConnectionQueue portNumber:port queueLength:5.
		client := SocketStream openConnectionToHostNamed:'localhost' port:port.
		[ serverSocket isNil ] whileTrue:[
			serverSocket := server getConnectionOrNil.

		serverSocketStream := SocketStream on:serverSocket.
		text := 'Long live Tux!'.
		serverSocketStream nextPutAll:text; flush.

		"11-09 - this hung up w/o the thread.
		11-09 - as you were; the problem was a lack of #flush on the send side, so there was
		nothing for the client side to read."
		thread := [
			read := client nextMany:text size.
			done signal.
		] forkAt:Processor userBackgroundPriority.
		thread name:'READ'.

		done wait.
		self should:[ read = text ].
		Transcript nextPutAll:'Just to make the point, we read: '; nextPutAll:read; cr; flush.

	] ensure:[
		server destroy.
		serverSocketStream close.
		client close.

	"11-09 - no prompts"
	serverSocket := serverSocket.
	client := client.
	serverSocketStream := serverSocketStream.
	thread := thread.

		NetworkSmokeTestCase prod:#testLocalServerAndClient.

From: pharo-project-bounces at lists.gforge.inria.fr [pharo-project-bounces at lists.gforge.inria.fr] On Behalf Of Nicolas Cellier [nicolas.cellier.aka.nice at gmail.com]
Sent: Sunday, October 10, 2010 7:05 AM
To: The general-purpose Squeak developers list
Cc: Pharo Development
Subject: Re: [Pharo-project] [squeak-dev] Xtreams : first embryonary port on    Squeak

2010/10/10 Levente Uzonyi <leves at elte.hu>:
> On Sun, 10 Oct 2010, Nicolas Cellier wrote:
>> Tests do not all pass. There seems to be a bug in Squeak
>> #replace:from:to:with: when the replacement is the collection itself,
>> moved to the right (this is with a COG VM).
> #replace:from:to:with: is not supposed to work for moves. IIRC the primitive
> version uses memcpy (or strncpy), so moving to the left works just because
> the undelying C function supports it. I used to (ab)use this feature though.
> Levente

OK, since we use memcpy rather than memmove in Squeak VM, I
implemented the trivial work around - move through a motionBuffer
temporary copy.

I now have a single test failing,
XTCollectionWriteStream>>#testReadWriteLargeAmount and this must be
due to my #after:do: simplistic implementation.
Messing with #fork in SUnit TestCase is tricky, and I need help on this point.


Pharo-project mailing list
Pharo-project at lists.gforge.inria.fr

More information about the Pharo-dev mailing list