[squeak-dev] Reassessing the hack in WriteStream>>nextChunkPut: (was: Squeak 4.6 release update)

David T. Lewis lewis at mail.msen.com
Sun Mar 8 20:38:34 UTC 2015


On Sun, Mar 08, 2015 at 08:49:40PM +0100, Tobias Pape wrote:
> 
> On 08.03.2015, at 20:43, Levente Uzonyi <leves at elte.hu> wrote:
> 
> > On Sun, 8 Mar 2015, Tobias Pape wrote:
> > 
> >> Hi,
> >> 
> >> thanks for taking the time to check!
> >> 
> >> 
> >> On 08.03.2015, at 20:03, Levente Uzonyi <leves at elte.hu> wrote:
> >> 
> >>> 
> >>> #flush is pretty costly, and IMO it's called way too often if it's in
> >>> #nextChunkPut:. The most common workaround to avoid frequent calls is to use InMidstOfFileinNotification to check if it's a bulk write, and flush only once in those cases. For some reason this technique is not used in case of class comments.
> >>> I changed the last lines of ClassDescription >> #classComment:stamp: in my image to
> >>> 
> >>> 	self organization classComment: (RemoteString newString: aString onFileNumber: 2) stamp: aStamp.
> >>> 	InMidstOfFileinNotification signal ifFalse: [file flush].
> >>> 	SystemChangeNotifier uniqueInstance classCommented: self.
> >>> 
> >>> Then removed the #flush from WriteStream >> #nextChunkPut:, and it seems to me that the problem is gone.
> >> 
> >> Can you tell me whether the Changes file is read/written via one stream or two?
> >> I understood its  two file descriptors but are these two in different streams or
> >> the same stream?
> > 
> > Of course, those are two (or more) different streams. We use SourceFiles at: 2 for writing and CurrentReadOnlySourceFiles at: 2 for reading.
> 
> Darn; if it had been a ReadWriteStream, one could say that we'd only really needed #flush when
> we switch from writing to reading mode?.
> So it is more elaborate.
> 

I am attaching a small C program that shows the problem. This uses the
same kind of fseek/ftell calls used in the VM FilePlugin. This confirms
the different C runtime behaviour. On my Ubuntu system, an explicit
flush is required, and on my SuSE box, no flush is required.

Levente is probably right in saying that this is not an OS bug. It may
just be different behaviour in different versions of libc.

Dave


-------------- next part --------------
A non-text attachment was scrubbed...
Name: teststreams.c
Type: text/x-csrc
Size: 1354 bytes
Desc: not available
Url : http://lists.squeakfoundation.org/pipermail/squeak-dev/attachments/20150308/8e54614b/teststreams-0001.c


More information about the Squeak-dev mailing list