[squeak-dev] Reassessing the hack in WriteStream>>nextChunkPut:

David T. Lewis lewis at mail.msen.com
Mon Mar 9 00:38:56 UTC 2015


On Sun, Mar 08, 2015 at 10:39:32PM +0100, Andreas Wacknitz wrote:
> Am 08.03.15 21:38, schrieb David T. Lewis:
> >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:
> >>>>
> >>>>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.
> 
> FWIW, Solaris 10 (SPARC), OpenSolaris (SPARC) and openindiana (x64) 
> print the same as your Ubuntu installation does.

Thanks Andreas,

This confirms that it is not an OS bug (my apologies to Ubuntu).

I also tried Levente's change to ClassDescription>>classComment:stamp:
to use InMidstOfFileinNotification, and reverted WriteStream>>nextChunkPut:
back to the original version (yo 8/13/2003) to remove the flush. It works
fine on my Ubuntu system.

I think Levente's fix is the right thing to do. Levente, do you want
to commit the change?

Dave






More information about the Squeak-dev mailing list