[Pharo-dev] Don't do this X(

Goubier Thierry thierry.goubier at cea.fr
Wed Apr 2 11:10:14 EDT 2014



Le 02/04/2014 16:33, phil at highoctane.be a écrit :
> On Wed, Apr 2, 2014 at 4:06 PM, Goubier Thierry <thierry.goubier at cea.fr
> <mailto:thierry.goubier at cea.fr>> wrote:
>
>
>
>     Le 02/04/2014 15:59, Sebastian Sastre a écrit :
>
>         Advice:
>
>         Never save a “big" package using monticello (lets say ~2000 classes)
>
>         and then save the image
>
>         Why?
>
>         Because while you don’t have feedback of saving progress* it will be
>         doing something on background (forked save?) and if for any
>         reason you
>         are tempted to do an image save or save and quit, it will save in a
>         state that will prevent the image from opening again
>
>         You have no option but to go to your previous image version or
>         something
>         of the kind
>
>         :(
>
>         *saving a package actually provides /some/ feedback on progress
>         but when
>         the progress bar finishes, the saving doesn’t actually finish and it
>         still have something going on, so you get "silence”
>         (no-feedback) until
>         you get the little monticello window with your new package version
>
>
> Does this mean that once we get the little window, we are safe?
> I am saving a package with containing a lot of Pack-XXX Pack-YYY
> Pack-ZZZ in a 2.0 image as a single Pack-PhilippeBack-nn.mcz thing.
>
> What is the moves to make to be safe?
>
> I already got my image locked at some points in a way that resembles
> what you describe.

I'm looking at the code and I don't understand everything, but, yes, it 
seems there are a few ways to keep doing things while saving the package 
(and maybe locking up things).

MCWorkingCopyBrowser>>basicSaveVersionIn:
basicSaveVersionIn: aRepository
	| newVersion waitForVersion |
	waitForVersion := Semaphore new.
	
	UIManager default defer: [
		newVersion := workingCopy newVersionIn: aRepository.
		waitForVersion signal ].
	
	Processor activeProcess == UIManager default uiProcess
		ifFalse: [ waitForVersion wait ].
	newVersion ifNil: [ ^ self ].
	
	Cursor wait showWhile: [[
		self
			storeVersion: newVersion in: aRepository;
			storeDependencies: newVersion in: aRepository.]
			ensure: [ (MCVersionInspector new version: newVersion) show ]]

It seems asynchronous, but I'm unsure of what it is doing. Progress bar 
is only displayed when doing newVersionIn:, but this is sent to the 
UIManager. And this is done in a fork (see saveVersion), so it's 
probably allways possible to interrupt the thing half-way (or save).

Anybody to explain what is the objective when writing code like that?

Thierry

>
> Phil
>
>     I'll profile that to see what's happening.
>
>     Thierry
>     --
>     Thierry Goubier
>     CEA list
>     Laboratoire des Fondations des Systèmes Temps Réel Embarqués
>     91191 Gif sur Yvette Cedex
>     France
>     Phone/Fax: +33 (0) 1 69 08 32 92
>     <tel:%2B33%20%280%29%201%2069%2008%2032%2092> / 83 95
>
>

-- 
Thierry Goubier
CEA list
Laboratoire des Fondations des Systèmes Temps Réel Embarqués
91191 Gif sur Yvette Cedex
France
Phone/Fax: +33 (0) 1 69 08 32 92 / 83 95




More information about the Pharo-dev mailing list