Hello lists,
(see http://en.wikipedia.org/wiki/Cell_division for explanation what mitosis is ;)
i just finished another torturing session in slang land, and finally made some of it working :)
I added a two new primitives, which aimed towards creating a new heap by cloning a designated set of objects from existing one. A first primitive is helps you to create a closed graph by reporting a set of objects which is referenced by objects in provided array, but not included in this array itself.
A second primitive is actually serves for creating a baby heap. I takes two array arguments: objects graph, and replacements (or substitutions).
The rules is simple: each object included in first array, should have references to objects which included in this array as well i.e. (objects identityIncludes: (objects at: x) someIvar ) == true
or if its not , then it can be found in a substitutions array. A substitutions array is a flat array of pairs oop -> index, where oop can be any oop, and index is a smallint index of item in objects array. Upon creation of new heap, all refs to oops in 'substitutions' array will be replaced by refs from 'objects' array by taking corresponding index.
Both array arguments should contain oops only (except from indexes in substitutions array) , should not contain duplicates and their intersection should be empty , i.e. (objects intersection: substitutions) isEmpty == true.
All of these rules actually serving to ensure that newly created object memory will form a fully closed graph (hence its oops can be cloned to a standalone object memory).
There are also, an initial example how to create a 'baby' object memory load http://www.squeaksource.com/HydraVM/HydraVM-sig.17.mcz
and do:
HydraClone new cloneIdleProcess
Of course you will need new VM. Sorry, i didn't published an update of sources yet. I can only give you a prebuilt one. Once i had a write access to ftp.squeak.org/HydraVM but i forgot credentials/key to it. (if Box Admins help me with this, i will upload it there). Or, you can write me in private and i will send you binaries.
P.S. I want to give a credit to Klaus D. Witzel who helped me to finish these new features, and inspired to do it :)
Update. you can download binaries from here ftp://ftp.squeak.org/HydraVM/latest_builds/win32/HydraVM-bin-22.02.2009.zip
On Sun, 22 Feb 2009 14:36:30 +0100, Igor Stasenko wrote:
Update. you can download binaries from here ftp://ftp.squeak.org/HydraVM/latest_builds/win32/HydraVM-bin-22.02.2009.zip
Let me add 2-3 bits: first we also have to thank Alexandre "Alex" Bergel and Guillermo "Guille" Adrián Molina for discussing with us earlier approaches to running Smalltalk on n-core CPUs in parallel.
2nd: what expression (HydraClone new cloneIdleProcess) does for you, is it runs the computational task which is described by the corresponding object subgraph, in a *new* native thread (with own heap and instance of HydraVM). Therefore, on your n-core CPU you can expect that computation is spread among the cores. The #cloneIdleProcess example does just what its name says: it runs Smalltalk's idle process ;) as proof of concept.
You Smalltalkers may have other Smalltalk processes that you want to run in parallel on their own native thread; let us know how we can help you with that.
And in case you need communication between two or more .images, Hydra comes with its channel facility.
/Klaus
2009/2/22 Klaus D. Witzel klaus.witzel@cobss.com:
On Sun, 22 Feb 2009 14:36:30 +0100, Igor Stasenko wrote:
Update. you can download binaries from here
ftp://ftp.squeak.org/HydraVM/latest_builds/win32/HydraVM-bin-22.02.2009.zip
Let me add 2-3 bits: first we also have to thank Alexandre "Alex" Bergel and Guillermo "Guille" Adrián Molina for discussing with us earlier approaches to running Smalltalk on n-core CPUs in parallel.
2nd: what expression (HydraClone new cloneIdleProcess) does for you, is it runs the computational task which is described by the corresponding object subgraph, in a *new* native thread (with own heap and instance of HydraVM). Therefore, on your n-core CPU you can expect that computation is spread among the cores. The #cloneIdleProcess example does just what its name says: it runs Smalltalk's idle process ;) as proof of concept.
You Smalltalkers may have other Smalltalk processes that you want to run in parallel on their own native thread; let us know how we can help you with that.
Well I have this web framework thingy where each http connection runs in it's own process. Request processing is quite fast, sometimes below a millisecond. There is potentially a lot sharing going on between those connections for configuration, sessions, continuations and stuff.
Cheers Philippe
On Sun, 22 Feb 2009 16:52:58 +0100, Philippe Marschall wrote:
2009/2/22 Klaus D. Witzel :
On Sun, 22 Feb 2009 14:36:30 +0100, Igor Stasenko wrote:
Update. you can download binaries from here
ftp://ftp.squeak.org/HydraVM/latest_builds/win32/HydraVM-bin-22.02.2009.zip
Let me add 2-3 bits: ...
[...]
You Smalltalkers may have other Smalltalk processes that you want to run in parallel on their own native thread; let us know how we can help you with that.
Well I have this web framework thingy where each http connection runs in it's own process. Request processing is quite fast, sometimes below a millisecond. There is potentially a lot sharing going on between those connections for configuration, sessions, continuations and stuff.
Yeah we thought about that, after exchanging some Qs+As with Lukas (and/or you?) during last Camp Smalltalk, for the general case for Hydra.
Several things are competing for attention/resolution/prototypical work:
1) some [accepted] Socket (and its OS dependent bits) can "belong" only to one native thread (= independent .image) in Hydra. Is this compatible with your web framework's requirements.
2) it must be possible for one native thread to accept a Socket, for another one to read/write it and get rid of it (and of its OS dependent bits). This is not a problem for us at the Smalltalk language/heap level but, until now I did't find an OS guy who said "this works, with guarantee, on these XYZ platforms".
3) when your web framework+app depends on a database "whatsoever", how is this to be shared (if sharing is really needed) between multiple native threads.
4) put yours here
/Klaus
Cheers Philippe
2009/2/22 Klaus D. Witzel klaus.witzel@cobss.com:
On Sun, 22 Feb 2009 16:52:58 +0100, Philippe Marschall wrote:
2009/2/22 Klaus D. Witzel :
On Sun, 22 Feb 2009 14:36:30 +0100, Igor Stasenko wrote:
Update. you can download binaries from here
ftp://ftp.squeak.org/HydraVM/latest_builds/win32/HydraVM-bin-22.02.2009.zip
Let me add 2-3 bits: ...
[...]
You Smalltalkers may have other Smalltalk processes that you want to run in parallel on their own native thread; let us know how we can help you with that.
Well I have this web framework thingy where each http connection runs in it's own process. Request processing is quite fast, sometimes below a millisecond. There is potentially a lot sharing going on between those connections for configuration, sessions, continuations and stuff.
Yeah we thought about that, after exchanging some Qs+As with Lukas (and/or you?) during last Camp Smalltalk, for the general case for Hydra.
Several things are competing for attention/resolution/prototypical work:
- some [accepted] Socket (and its OS dependent bits) can "belong" only to
one native thread (= independent .image) in Hydra. Is this compatible with your web framework's requirements.
- it must be possible for one native thread to accept a Socket, for another
one to read/write it and get rid of it (and of its OS dependent bits). This is not a problem for us at the Smalltalk language/heap level but, until now I did't find an OS guy who said "this works, with guarantee, on these XYZ platforms".
That and 1) do not necessarily need to happen. You could imagine one image/native thread doing all the socket IO and handing the actual work to other images/native threads.
- when your web framework+app depends on a database "whatsoever", how is
this to be shared (if sharing is really needed) between multiple native threads.
Yepp, if you interpret database in a more general sense (a bunch of objects). There is also the question of how coordination happens between multiple images especially on this shared data.
Cheers Philippe
On Sun, 22 Feb 2009 18:18:20 +0100, Philippe Marschall wrote:
2009/2/22 Klaus D. Witzel :
...
Well I have this web framework thingy where each http connection runs in it's own process. Request processing is quite fast, sometimes below a millisecond. There is potentially a lot sharing going on between those connections for configuration, sessions, continuations and stuff.
Yeah we thought about that, after exchanging some Qs+As with Lukas (and/or you?) during last Camp Smalltalk, for the general case for Hydra.
Several things are competing for attention/resolution/prototypical work:
- some [accepted] Socket (and its OS dependent bits) can "belong" only
to one native thread (= independent .image) in Hydra. Is this compatible with your web framework's requirements.
- it must be possible for one native thread to accept a Socket, for
another one to read/write it and get rid of it (and of its OS dependent bits). This is not a problem for us at the Smalltalk language/heap level but, until now I did't find an OS guy who said "this works, with guarantee, on these XYZ platforms".
That and 1) do not necessarily need to happen. You could imagine one image/native thread doing all the socket IO and handing the actual work to other images/native threads.
Yup. And the price tag is a) transfer "task description" to worker thread and b) transfer "result string" back in full or in part(s). And when using Hydra channels for transfer, add c) c-alloc of strings-to-be-transported.
- when your web framework+app depends on a database "whatsoever", how
is this to be shared (if sharing is really needed) between multiple native threads.
Yepp, if you interpret database in a more general sense (a bunch of objects).
... which includes framework/app config update/change. Right.
There is also the question of how coordination happens between multiple images especially on this shared data.
Right. Looks like a topic for the next Camp Smalltalk, with hands-on.
Cheers Philippe
2009/2/22 Klaus D. Witzel klaus.witzel@cobss.com:
On Sun, 22 Feb 2009 18:18:20 +0100, Philippe Marschall wrote:
2009/2/22 Klaus D. Witzel :
...
Well I have this web framework thingy where each http connection runs in it's own process. Request processing is quite fast, sometimes below a millisecond. There is potentially a lot sharing going on between those connections for configuration, sessions, continuations and stuff.
Yeah we thought about that, after exchanging some Qs+As with Lukas (and/or you?) during last Camp Smalltalk, for the general case for Hydra.
Several things are competing for attention/resolution/prototypical work:
- some [accepted] Socket (and its OS dependent bits) can "belong" only
to one native thread (= independent .image) in Hydra. Is this compatible with your web framework's requirements.
- it must be possible for one native thread to accept a Socket, for
another one to read/write it and get rid of it (and of its OS dependent bits). This is not a problem for us at the Smalltalk language/heap level but, until now I did't find an OS guy who said "this works, with guarantee, on these XYZ platforms".
That and 1) do not necessarily need to happen. You could imagine one image/native thread doing all the socket IO and handing the actual work to other images/native threads.
Yup. And the price tag is a) transfer "task description" to worker thread and b) transfer "result string" back in full or in part(s). And when using Hydra channels for transfer, add c) c-alloc of strings-to-be-transported.
- when your web framework+app depends on a database "whatsoever", how is
this to be shared (if sharing is really needed) between multiple native threads.
Yepp, if you interpret database in a more general sense (a bunch of objects).
... which includes framework/app config update/change. Right.
There is also the question of how coordination happens between multiple images especially on this shared data.
Right. Looks like a topic for the next Camp Smalltalk, with hands-on.
We should extend Camp Smalltalk to a week or so. So much to do, so little time.
Cheers Philippe
On Mon, 23 Feb 2009 12:38:29 +0100, Philippe Marschall wrote:
2009/2/22 Klaus D. Witzel :
On Sun, 22 Feb 2009 18:18:20 +0100, Philippe Marschall wrote:
...
Well I have this web framework thingy
...
There is also the question of how coordination happens between multiple images especially on this shared data.
Right. Looks like a topic for the next Camp Smalltalk, with hands-on.
We should extend Camp Smalltalk to a week or so. So much to do, so little time.
Is there something that can be prepared/worked out/dugg into 'till then. Naive: a block diagram, picturing classes, that separates request processing from the app's work and from response [put yours here].
Cheers Philippe
2009/2/23 Klaus D. Witzel klaus.witzel@cobss.com:
On Mon, 23 Feb 2009 12:38:29 +0100, Philippe Marschall wrote:
2009/2/22 Klaus D. Witzel :
On Sun, 22 Feb 2009 18:18:20 +0100, Philippe Marschall wrote:
...
Well I have this web framework thingy
...
There is also the question of how coordination happens between multiple images especially on this shared data.
Right. Looks like a topic for the next Camp Smalltalk, with hands-on.
We should extend Camp Smalltalk to a week or so. So much to do, so little time.
Is there something that can be prepared/worked out/dugg into 'till then. Naive: a block diagram, picturing classes, that separates request processing from the app's work and from response [put yours here].
Sure, it'd probably be best if you could attend a Squeak Stammtisch or Seaside Sprint (all these S) so we could discuss it a bit further.
Cheers Philippe
On Mon, 23 Feb 2009 21:26:20 +0100, Philippe Marschall wrote:
2009/2/23 Klaus D. Witzel :
On Mon, 23 Feb 2009 12:38:29 +0100, Philippe Marschall wrote:
2009/2/22 Klaus D. Witzel :
On Sun, 22 Feb 2009 18:18:20 +0100, Philippe Marschall wrote:
...
> > Well I have this web framework thingy
...
There is also the question of how coordination happens between multiple images especially on this shared data.
Right. Looks like a topic for the next Camp Smalltalk, with hands-on.
We should extend Camp Smalltalk to a week or so. So much to do, so little time.
Is there something that can be prepared/worked out/dugg into 'till then. Naive: a block diagram, picturing classes, that separates request processing from the app's work and from response [put yours here].
Sure, it'd probably be best if you could attend a Squeak Stammtisch or Seaside Sprint (all these S) so we could discuss it a bit further.
I whish there be something like Cobalt[0] ready for primetime, so that every Friday night there be Smalltalk Friday night, nation-wide as with other local holidays and around the globe. Of course there also be (all these S) events but entrance only allowed for Smalltalkers bringing their family members/friends for pro-actively managing the future ;)
Do you happen to know of an (all these S) event planned at/around May?
Cheers Philippe
Hi Klaus--
I wish there were something like Cobalt ready for primetime, so that every Friday night could be Smalltalk Friday night, nationwide as with other local holidays and around the globe.
It seems like they've made a lot of progress recently. What do you think the 2009-02-10 release needs in order to make your idea doable?
-C
-- Craig Latta www.netjam.org next show: 2009-03-13 (www.thishere.org)
On Tue, 24 Feb 2009 08:34:37 +0100, Craig Latta wrote:
Hi Klaus--
I wish there were something like Cobalt ready for primetime, so that every Friday night could be Smalltalk Friday night, nationwide as with other local holidays and around the globe.
It seems like they've made a lot of progress recently.
Right, {been there. done it}.
What do you think the 2009-02-10 release needs in order to make your idea doable?
- usable "installable" for non-platform experts
- tools have to work on the 2+1 platforms (no idea, I myself cannot compare)
- create+provide community-support-contents:
-1 "certify" users so that they can *really* participate -1 and not run away "doesn't work for me/my PC, is crap"
-2 a reception for "where's my party"
-3 host many parties (Kernel, Framework(s), App(s), etc)
The above is *not* much, and I believe Cobalt is getting hotter -- we'll have a Cobalt-hot summer :)
-C
-- Craig Latta www.netjam.org next show: 2009-03-13 (www.thishere.org)
2009/2/24 Klaus D. Witzel klaus.witzel@cobss.com:
On Mon, 23 Feb 2009 21:26:20 +0100, Philippe Marschall wrote:
2009/2/23 Klaus D. Witzel :
On Mon, 23 Feb 2009 12:38:29 +0100, Philippe Marschall wrote:
2009/2/22 Klaus D. Witzel :
On Sun, 22 Feb 2009 18:18:20 +0100, Philippe Marschall wrote:
...
>> >> Well I have this web framework thingy
...
There is also the question of how coordination happens between multiple images especially on this shared data.
Right. Looks like a topic for the next Camp Smalltalk, with hands-on.
We should extend Camp Smalltalk to a week or so. So much to do, so little time.
Is there something that can be prepared/worked out/dugg into 'till then. Naive: a block diagram, picturing classes, that separates request processing from the app's work and from response [put yours here].
Sure, it'd probably be best if you could attend a Squeak Stammtisch or Seaside Sprint (all these S) so we could discuss it a bit further.
I whish there be something like Cobalt[0] ready for primetime, so that every Friday night there be Smalltalk Friday night, nation-wide as with other local holidays and around the globe. Of course there also be (all these S) events but entrance only allowed for Smalltalkers bringing their family members/friends for pro-actively managing the future ;)
Do you happen to know of an (all these S) event planned at/around May?
Not yet, we'll keep you informed.
Cheers Philippe
Perhaps naively, I simply downloaded the binaries and used them to open a 3.10 dev image, which seemed to work fine, FreeType and all...
So...from the helpful doits, it seems that you prepare a second image that carries out the native processes for you? Or can you run several native threads within the current image?
Very interesting...and what is most impressive is that someone relatively unsophisticated like me could just open an image with the new VM, load the HydraVM package from Squeaksource and get have HydraVM isHydra return true!
A short example of creating a "lengthy process" running in it's own thread would be great...you know, something that just counts for a really long time or something.
This is very interesting!
Rob
On Sun, Feb 22, 2009 at 10:09 AM, Klaus D. Witzel klaus.witzel@cobss.comwrote:
On Sun, 22 Feb 2009 14:36:30 +0100, Igor Stasenko wrote:
Update.
you can download binaries from here
ftp://ftp.squeak.org/HydraVM/latest_builds/win32/HydraVM-bin-22.02.2009.zip
Let me add 2-3 bits: first we also have to thank Alexandre "Alex" Bergel and Guillermo "Guille" Adrián Molina for discussing with us earlier approaches to running Smalltalk on n-core CPUs in parallel.
2nd: what expression (HydraClone new cloneIdleProcess) does for you, is it runs the computational task which is described by the corresponding object subgraph, in a *new* native thread (with own heap and instance of HydraVM). Therefore, on your n-core CPU you can expect that computation is spread among the cores. The #cloneIdleProcess example does just what its name says: it runs Smalltalk's idle process ;) as proof of concept.
You Smalltalkers may have other Smalltalk processes that you want to run in parallel on their own native thread; let us know how we can help you with that.
And in case you need communication between two or more .images, Hydra comes with its channel facility.
/Klaus
-- "If at first, the idea is not absurd, then there is no hope for it". Albert Einstein
On Sun, 22 Feb 2009 18:53:24 +0100, Rob Rothwell wrote:
Perhaps naively, I simply downloaded the binaries and used them to open a 3.10 dev image, which seemed to work fine, FreeType and all...
:)
So...from the helpful doits, it seems that you prepare a second image that carries out the native processes for you?
Yes, "classic" Hydra loads the second .image from file and mitosis Hydra populates (the second) an empty .image from am arrayOfObjects passed in.
Or can you run several native threads within the current image?
*run* within the current .image: No. *clone* from within the current .image: Yes.
Very interesting...and what is most impressive is that someone relatively unsophisticated like me could just open an image with the new VM, load the HydraVM package from Squeaksource and get have HydraVM isHydra return true!
A nice compliment for Igor who hacked this :)
A short example of creating a "lengthy process" running in it's own thread would be great...you know, something that just counts for a really long time or something.
Like (123456 factorial) ? you want to see one of the cores running at 100% (instead of the idle loop); message understood :)
This is very interesting!
Rob
...
On Sun, Feb 22, 2009 at 1:38 PM, Klaus D. Witzel klaus.witzel@cobss.comwrote:
Yes, "classic" Hydra loads the second .image from file and mitosis Hydra populates (the second) an empty .image from am arrayOfObjects passed in.
Ok...this is just, well, fun, but I can't quite figure out how to get a second image loaded with the #doIt channel "working." I figure it's because I don't have the image I created it from set up right? All I did was go down the line of in the Helpful doits workspace:
"Sanity check, are we running HydraVM?" HydraVM isHydra [true]
"To prepare an image for running in background thread (careful, VM will quit if you run this)" HydraVM saveAsHeadlessImage: 'test.image' [current image shut down and created another image]
"To run previously prepared image" HydraVM loadAndRunNewImage: 'test.image' [seemed to work]
"How many interpreters VM currently running" HydraVM interpreterInstanceCount [2...this is good!]
"Test to check if main image listening for #transcript channel ..." HydraChannel send: 'Transcript test' to: (HydraInterpreter current) channel: #transcript [true after the following line]
"... if not, try doing this first: " HydraTranscript install
"Simple test to check if second image listens #doIt channel " HydraChannel hasChannel: #doIt at: (HydraInterpreter at: 2) [false]
Drat!!!
" ... and has Transcript global var replaced to redirect all input to main image" (HydraInterpreter at: 2) doIt: 'Transcript show: ''Doit Test'''
"Do you like to install something to secondary image?" (HydraInterpreter at: 2) doIt: '(HTTPSocket httpGet: '' installer.pbwiki.com/f/Installer.st'') fileIn '
"Do you like to save it? " (HydraInterpreter at: 2) doIt: 'Smalltalk snapshot: true andQuit: false '
Take care,
Rob
2009/2/22 Rob Rothwell r.j.rothwell@gmail.com:
On Sun, Feb 22, 2009 at 1:38 PM, Klaus D. Witzel klaus.witzel@cobss.com wrote:
Yes, "classic" Hydra loads the second .image from file and mitosis Hydra populates (the second) an empty .image from am arrayOfObjects passed in.
Ok...this is just, well, fun, but I can't quite figure out how to get a second image loaded with the #doIt channel "working." I figure it's because I don't have the image I created it from set up right? All I did was go down the line of in the Helpful doits workspace:
"Sanity check, are we running HydraVM?" HydraVM isHydra [true]
"To prepare an image for running in background thread (careful, VM will quit if you run this)" HydraVM saveAsHeadlessImage: 'test.image' [current image shut down and created another image]
"To run previously prepared image" HydraVM loadAndRunNewImage: 'test.image' [seemed to work]
"How many interpreters VM currently running" HydraVM interpreterInstanceCount [2...this is good!]
"Test to check if main image listening for #transcript channel ..." HydraChannel send: 'Transcript test' to: (HydraInterpreter current) channel: #transcript [true after the following line]
"... if not, try doing this first: " HydraTranscript install
"Simple test to check if second image listens #doIt channel " HydraChannel hasChannel: #doIt at: (HydraInterpreter at: 2) [false]
Drat!!!
Yep.. in 3.10 this not working.. It looks like there are some crap in image startup method. As a workaround, you can register the #doIt channel in your base image:
HydraVM registerDoItChannel. and only then do HydraVM saveAsHeadlessImage: 'test.image'
should work ok.
" ... and has Transcript global var replaced to redirect all input to main image" (HydraInterpreter at: 2) doIt: 'Transcript show: ''Doit Test'''
"Do you like to install something to secondary image?" (HydraInterpreter at: 2) doIt: '(HTTPSocket httpGet: ''installer.pbwiki.com/f/Installer.st'') fileIn '
"Do you like to save it? " (HydraInterpreter at: 2) doIt: 'Smalltalk snapshot: true andQuit: false '
Take care,
Rob
2009/2/23 Igor Stasenko siguctua@gmail.com:
2009/2/22 Rob Rothwell r.j.rothwell@gmail.com:
On Sun, Feb 22, 2009 at 1:38 PM, Klaus D. Witzel klaus.witzel@cobss.com wrote:
Yes, "classic" Hydra loads the second .image from file and mitosis Hydra populates (the second) an empty .image from am arrayOfObjects passed in.
Ok...this is just, well, fun, but I can't quite figure out how to get a second image loaded with the #doIt channel "working." I figure it's because I don't have the image I created it from set up right? All I did was go down the line of in the Helpful doits workspace:
"Sanity check, are we running HydraVM?" HydraVM isHydra [true]
"To prepare an image for running in background thread (careful, VM will quit if you run this)" HydraVM saveAsHeadlessImage: 'test.image' [current image shut down and created another image]
"To run previously prepared image" HydraVM loadAndRunNewImage: 'test.image' [seemed to work]
"How many interpreters VM currently running" HydraVM interpreterInstanceCount [2...this is good!]
"Test to check if main image listening for #transcript channel ..." HydraChannel send: 'Transcript test' to: (HydraInterpreter current) channel: #transcript [true after the following line]
"... if not, try doing this first: " HydraTranscript install
"Simple test to check if second image listens #doIt channel " HydraChannel hasChannel: #doIt at: (HydraInterpreter at: 2) [false]
Drat!!!
Yep.. in 3.10 this not working.. It looks like there are some crap in image startup method. As a workaround, you can register the #doIt channel in your base image:
HydraVM registerDoItChannel. and only then do HydraVM saveAsHeadlessImage: 'test.image'
should work ok.
oh it looks like that probles is deeper than i thought.. need to look at it more closely.
" ... and has Transcript global var replaced to redirect all input to main image" (HydraInterpreter at: 2) doIt: 'Transcript show: ''Doit Test'''
"Do you like to install something to secondary image?" (HydraInterpreter at: 2) doIt: '(HTTPSocket httpGet: ''installer.pbwiki.com/f/Installer.st'') fileIn '
"Do you like to save it? " (HydraInterpreter at: 2) doIt: 'Smalltalk snapshot: true andQuit: false '
Take care,
Rob
-- Best regards, Igor Stasenko AKA sig.
Okay, here's updated VM
ftp://ftp.squeak.org/HydraVM/latest_builds/win32/HydraVM-bin-27.02.2009.zip
bug with channels are now fixed (in fact it is bug with code generator :))
Everything should work ok now i.e. channels + heap cloning.
Also, i uploaded the updated VMMaker:
http://www.squeaksource.com/HydraVM/VMMaker-sig.85
and platform sources:
http://squeakvm.org/svn/squeak/branches/HydraVM
I got all the way up to 10000 factorial! (Stressing, no doubt, the amount of data flowing through the channels...)
(Not happy at 11000...!)
Fun stuff...
Rob
On Thu, Feb 26, 2009 at 6:41 PM, Igor Stasenko siguctua@gmail.com wrote:
Okay, here's updated VM
ftp://ftp.squeak.org/HydraVM/latest_builds/win32/HydraVM-bin-27.02.2009.zip
bug with channels are now fixed (in fact it is bug with code generator :))
Everything should work ok now i.e. channels + heap cloning.
Also, i uploaded the updated VMMaker:
http://www.squeaksource.com/HydraVM/VMMaker-sig.85
and platform sources:
http://squeakvm.org/svn/squeak/branches/HydraVM
-- Best regards, Igor Stasenko AKA sig.
On Fri, 27 Feb 2009 00:41:44 +0100, Igor Stasenko wrote:
Okay, here's updated VM
ftp://ftp.squeak.org/HydraVM/latest_builds/win32/HydraVM-bin-27.02.2009.zip
bug with channels are now fixed (in fact it is bug with code generator :))
Everything should work ok now i.e. channels + heap cloning.
Also, i uploaded the updated VMMaker:
This loads into a Squeak3.10.2-7179-basic.image, *after* resolving FFIConstants, KlattResonatorIndices by hand (Monticello does not know what shared classes are).
and platform sources:
This compiles fine with the mingw tool chain.
Thanks for the good work Igor !
Klaus D. Witzel escreveu:
On Sun, 22 Feb 2009 18:53:24 +0100, Rob Rothwell wrote:
Perhaps naively, I simply downloaded the binaries and used them to open a 3.10 dev image, which seemed to work fine, FreeType and all...
:)
So...from the helpful doits, it seems that you prepare a second image that carries out the native processes for you?
Yes, "classic" Hydra loads the second .image from file and mitosis Hydra populates (the second) an empty .image from am arrayOfObjects passed in.
Did the same. I loaded Hydra upon a "dev" image to which I included VMMaker (otherwise the VMMaker supplied with Hydra fails to load). Then I created a 'hydra.image' via: HydraVM saveAsHeadlessImage: 'hydra.image'. Next I tried (via workspace):
HydraVM loadAndRunNewImage: 'hydra.image'.
and it caused the following error: 'HydraVM class(Object)>>primitiveFailed ...
2009/2/26 Casimiro de Almeida Barreto casimiro.barreto@gmail.com:
Klaus D. Witzel escreveu:
On Sun, 22 Feb 2009 18:53:24 +0100, Rob Rothwell wrote:
Perhaps naively, I simply downloaded the binaries and used them to open a 3.10 dev image, which seemed to work fine, FreeType and all...
:)
So...from the helpful doits, it seems that you prepare a second image that carries out the native processes for you?
Yes, "classic" Hydra loads the second .image from file and mitosis Hydra populates (the second) an empty .image from am arrayOfObjects passed in.
Did the same. I loaded Hydra upon a "dev" image to which I included VMMaker (otherwise the VMMaker supplied with Hydra fails to load). Then I created a 'hydra.image' via: HydraVM saveAsHeadlessImage: 'hydra.image'. Next I tried (via workspace):
HydraVM loadAndRunNewImage: 'hydra.image'.
and it caused the following error: 'HydraVM class(Object)>>primitiveFailed ...
are you sure you running HydraVM? (HydraVM isHydra "print-it") You can do save-as-headless-image using any VM, but to run second image you need Hydra VM.
Igor Stasenko escreveu:
(...)
are you sure you running HydraVM? (HydraVM isHydra "print-it") You can do save-as-headless-image using any VM, but to run second image you need Hydra VM.
I was unable to build HydraVM under linux. After:
$ cd conf $ ./configure --prefix=/usr ... $ make
It was not able to find interp_prototypes.h ...
gcc -g -O2 -fomit-frame-pointer -DLSB_FIRST=1 -DHAVE_CONFIG_H -DSQUEAK_BUILTIN_PLUGIN -I/home/casimiro/Softwares/squeak/platforms/unix/config -I/home/casimiro/Softwares/squeak/platforms/unix/vm -I/home/casimiro/Softwares/squeak/platforms/Cross/vm -I/home/casimiro/Softwares/squeak/platforms/unix/src/vm -I/home/casimiro/Softwares/squeak/platforms/Cross/vm -I/home/casimiro/Softwares/squeak/platforms/unix/src/vm -I/home/casimiro/Softwares/squeak/platforms/unix/vm -I/home/casimiro/Softwares/squeak/platforms/Cross/plugins/FilePlugin -I/home/casimiro/Softwares/squeak/platforms/unix/plugins/B3DAcceleratorPlugin -I/home/casimiro/Softwares/squeak/platforms/unix/config -I/home/casimiro/Softwares/squeak/platforms/unix/vm -I/home/casimiro/Softwares/squeak/platforms/Cross/vm -I/home/casimiro/Softwares/squeak/platforms/unix/src/vm -c -o gnu-interp.o gnu-interp.c In file included from /home/casimiro/Softwares/squeak/platforms/unix/vm/sqGnu.h:36, from gnu-interp.c:8: /home/casimiro/Softwares/squeak/platforms/Cross/vm/sq.h:166:31: error: interp_prototypes.h: Arquivo ou diretório não encontrado In file included from /home/casimiro/Softwares/squeak/platforms/unix/vm/sqGnu.h:36, from gnu-interp.c:8: /home/casimiro/Softwares/squeak/platforms/Cross/vm/sq.h:175: error: expected ‘)’ before ‘sqInt’ /home/casimiro/Softwares/squeak/platforms/Cross/vm/sq.h:176: error: expected ‘)’ before ‘sqInt’ /home/casimiro/Softwares/squeak/platforms/Cross/vm/sq.h:177: warning: parameter names (without types) in function declaration /home/casimiro/Softwares/squeak/platforms/Cross/vm/sq.h:180: error: expected ‘)’ before ‘sqInt’ /home/casimiro/Softwares/squeak/platforms/Cross/vm/sq.h:181: error: expected ‘)’ before ‘sqInt’ /home/casimiro/Softwares/squeak/platforms/Cross/vm/sq.h:185: error: expected ‘)’ before ‘sqInt’ /home/casimiro/Softwares/squeak/platforms/Cross/vm/sq.h:199: warning: parameter names (without types) in function declaration /home/casimiro/Softwares/squeak/platforms/Cross/vm/sq.h:200: warning: parameter names (without types) in function declaration /home/casimiro/Softwares/squeak/platforms/Cross/vm/sq.h:201: warning: parameter names (without types) in function declaration /home/casimiro/Softwares/squeak/platforms/Cross/vm/sq.h:202: warning: parameter names (without types) in function declaration /home/casimiro/Softwares/squeak/platforms/Cross/vm/sq.h:206: warning: parameter names (without types) in function declaration /home/casimiro/Softwares/squeak/platforms/Cross/vm/sq.h:333: error: expected ‘)’ before ‘sqInt’ /home/casimiro/Softwares/squeak/platforms/Cross/vm/sq.h:336: error: expected ‘)’ before ‘sqInputEvent’ /home/casimiro/Softwares/squeak/platforms/Cross/vm/sq.h:341: error: expected ‘)’ before ‘char’ /home/casimiro/Softwares/squeak/platforms/Cross/vm/sq.h:342: warning: parameter names (without types) in function declaration /home/casimiro/Softwares/squeak/platforms/Cross/vm/sq.h:343: error: expected ‘)’ before ‘sqInt’ /home/casimiro/Softwares/squeak/platforms/Cross/vm/sq.h:344: error: expected ‘)’ before ‘sqInt’ /home/casimiro/Softwares/squeak/platforms/Cross/vm/sq.h:345: warning: parameter names (without types) in function declaration /home/casimiro/Softwares/squeak/platforms/Cross/vm/sq.h:360: warning: parameter names (without types) in function declaration /home/casimiro/Softwares/squeak/platforms/Cross/vm/sq.h:361: warning: parameter names (without types) in function declaration /home/casimiro/Softwares/squeak/platforms/Cross/vm/sq.h:362: warning: parameter names (without types) in function declaration /home/casimiro/Softwares/squeak/platforms/Cross/vm/sq.h:363: warning: parameter names (without types) in function declaration /home/casimiro/Softwares/squeak/platforms/Cross/vm/sq.h:425: warning: parameter names (without types) in function declaration /home/casimiro/Softwares/squeak/platforms/Cross/vm/sq.h:431: warning: ‘struct vmEventQueue’ declared inside parameter list /home/casimiro/Softwares/squeak/platforms/Cross/vm/sq.h:431: warning: its scope is only this definition or declaration, which is probably not what you want /home/casimiro/Softwares/squeak/platforms/Cross/vm/sq.h:432: warning: ‘struct vmEventQueue’ declared inside parameter list /home/casimiro/Softwares/squeak/platforms/Cross/vm/sq.h:432: warning: ‘struct vmEvent’ declared inside parameter list /home/casimiro/Softwares/squeak/platforms/Cross/vm/sq.h:433: warning: ‘struct vmEventQueue’ declared inside parameter list gnu-interp.c: In function ‘snapshot’: gnu-interp.c:21340: error: ‘imageName’ undeclared (first use in this function) gnu-interp.c:21340: error: (Each undeclared identifier is reported only once gnu-interp.c:21340: error: for each function it appears in.) gnu-interp.c: In function ‘writeImageFileIO’: gnu-interp.c:22626: error: ‘imageName’ undeclared (first use in this function) gnu-interp.c: In function ‘writeImageFile’: gnu-interp.c:22664: error: ‘imageName’ undeclared (first use in this function) make[1]: ** [gnu-interp.o] Erro 1 make: ** [vm/vm.a] Erro 2
2009/2/27 Casimiro de Almeida Barreto casimiro.barreto@gmail.com:
Igor Stasenko escreveu:
(...)
are you sure you running HydraVM? (HydraVM isHydra "print-it") You can do save-as-headless-image using any VM, but to run second image you need Hydra VM.
I was unable to build HydraVM under linux.
Hydra wasn't ported on linux yet. Initially i created a Win32 VM. Then Matthew Fulmer started linux port, but it wasn't finished. There is also a Mac port, made by John M McIntosh , and he reported that he were able to run it. But its not complete - a lot of plugins need additional porting.
After:
$ cd conf $ ./configure --prefix=/usr ... $ make
It was not able to find interp_prototypes.h ...
gcc -g -O2 -fomit-frame-pointer -DLSB_FIRST=1 -DHAVE_CONFIG_H -DSQUEAK_BUILTIN_PLUGIN -I/home/casimiro/Softwares/squeak/platforms/unix/config -I/home/casimiro/Softwares/squeak/platforms/unix/vm -I/home/casimiro/Softwares/squeak/platforms/Cross/vm -I/home/casimiro/Softwares/squeak/platforms/unix/src/vm -I/home/casimiro/Softwares/squeak/platforms/Cross/vm -I/home/casimiro/Softwares/squeak/platforms/unix/src/vm -I/home/casimiro/Softwares/squeak/platforms/unix/vm -I/home/casimiro/Softwares/squeak/platforms/Cross/plugins/FilePlugin -I/home/casimiro/Softwares/squeak/platforms/unix/plugins/B3DAcceleratorPlugin -I/home/casimiro/Softwares/squeak/platforms/unix/config -I/home/casimiro/Softwares/squeak/platforms/unix/vm -I/home/casimiro/Softwares/squeak/platforms/Cross/vm -I/home/casimiro/Softwares/squeak/platforms/unix/src/vm -c -o gnu-interp.o gnu-interp.c In file included from /home/casimiro/Softwares/squeak/platforms/unix/vm/sqGnu.h:36, from gnu-interp.c:8: /home/casimiro/Softwares/squeak/platforms/Cross/vm/sq.h:166:31: error: interp_prototypes.h: Arquivo ou diretório não encontrado In file included from /home/casimiro/Softwares/squeak/platforms/unix/vm/sqGnu.h:36, from gnu-interp.c:8: /home/casimiro/Softwares/squeak/platforms/Cross/vm/sq.h:175: error: expected ‘)’ before ‘sqInt’ /home/casimiro/Softwares/squeak/platforms/Cross/vm/sq.h:176: error: expected ‘)’ before ‘sqInt’ /home/casimiro/Softwares/squeak/platforms/Cross/vm/sq.h:177: warning: parameter names (without types) in function declaration /home/casimiro/Softwares/squeak/platforms/Cross/vm/sq.h:180: error: expected ‘)’ before ‘sqInt’ /home/casimiro/Softwares/squeak/platforms/Cross/vm/sq.h:181: error: expected ‘)’ before ‘sqInt’ /home/casimiro/Softwares/squeak/platforms/Cross/vm/sq.h:185: error: expected ‘)’ before ‘sqInt’ /home/casimiro/Softwares/squeak/platforms/Cross/vm/sq.h:199: warning: parameter names (without types) in function declaration /home/casimiro/Softwares/squeak/platforms/Cross/vm/sq.h:200: warning: parameter names (without types) in function declaration /home/casimiro/Softwares/squeak/platforms/Cross/vm/sq.h:201: warning: parameter names (without types) in function declaration /home/casimiro/Softwares/squeak/platforms/Cross/vm/sq.h:202: warning: parameter names (without types) in function declaration /home/casimiro/Softwares/squeak/platforms/Cross/vm/sq.h:206: warning: parameter names (without types) in function declaration /home/casimiro/Softwares/squeak/platforms/Cross/vm/sq.h:333: error: expected ‘)’ before ‘sqInt’ /home/casimiro/Softwares/squeak/platforms/Cross/vm/sq.h:336: error: expected ‘)’ before ‘sqInputEvent’ /home/casimiro/Softwares/squeak/platforms/Cross/vm/sq.h:341: error: expected ‘)’ before ‘char’ /home/casimiro/Softwares/squeak/platforms/Cross/vm/sq.h:342: warning: parameter names (without types) in function declaration /home/casimiro/Softwares/squeak/platforms/Cross/vm/sq.h:343: error: expected ‘)’ before ‘sqInt’ /home/casimiro/Softwares/squeak/platforms/Cross/vm/sq.h:344: error: expected ‘)’ before ‘sqInt’ /home/casimiro/Softwares/squeak/platforms/Cross/vm/sq.h:345: warning: parameter names (without types) in function declaration /home/casimiro/Softwares/squeak/platforms/Cross/vm/sq.h:360: warning: parameter names (without types) in function declaration /home/casimiro/Softwares/squeak/platforms/Cross/vm/sq.h:361: warning: parameter names (without types) in function declaration /home/casimiro/Softwares/squeak/platforms/Cross/vm/sq.h:362: warning: parameter names (without types) in function declaration /home/casimiro/Softwares/squeak/platforms/Cross/vm/sq.h:363: warning: parameter names (without types) in function declaration /home/casimiro/Softwares/squeak/platforms/Cross/vm/sq.h:425: warning: parameter names (without types) in function declaration /home/casimiro/Softwares/squeak/platforms/Cross/vm/sq.h:431: warning: ‘struct vmEventQueue’ declared inside parameter list /home/casimiro/Softwares/squeak/platforms/Cross/vm/sq.h:431: warning: its scope is only this definition or declaration, which is probably not what you want /home/casimiro/Softwares/squeak/platforms/Cross/vm/sq.h:432: warning: ‘struct vmEventQueue’ declared inside parameter list /home/casimiro/Softwares/squeak/platforms/Cross/vm/sq.h:432: warning: ‘struct vmEvent’ declared inside parameter list /home/casimiro/Softwares/squeak/platforms/Cross/vm/sq.h:433: warning: ‘struct vmEventQueue’ declared inside parameter list gnu-interp.c: In function ‘snapshot’: gnu-interp.c:21340: error: ‘imageName’ undeclared (first use in this function) gnu-interp.c:21340: error: (Each undeclared identifier is reported only once gnu-interp.c:21340: error: for each function it appears in.) gnu-interp.c: In function ‘writeImageFileIO’: gnu-interp.c:22626: error: ‘imageName’ undeclared (first use in this function) gnu-interp.c: In function ‘writeImageFile’: gnu-interp.c:22664: error: ‘imageName’ undeclared (first use in this function) make[1]: ** [gnu-interp.o] Erro 1 make: ** [vm/vm.a] Erro 2
-- ############################################################################### # Este e-mail pode conter informações confidenciais/privadas e # destina-se somente aos destinatários especificados no cabeçalho # (campos To:, Cc:, CCo:) # # O repasse de parte ou da totalidade deste e-mail para outros # usuários ou para listas de discussão deve ser autorizado # explicitamente por casimiro.barreto@gmail.com # # Esta mensagem é digitalmente assinada utilizando-se algorítimo # PGP (gnuPG). A chave pública para o usuário casimiro.barreto@gmail.com # pode ser obtida em: http://pgp.mit.edu #
#
# # This message may contain confidential/private information and # is directed only to the recipients specified in the message # header (fields To:, Cc:, CCo:). # # Forwarding part or the totality of this message to other people # requires explicit authorization from casimiro.barreto@gmail.com # # This message is digitally signed using GnuPG (PGP algorithm). Public # key for casimiro.barreto@gmail.com may be recovered from: # http://pgp.mit.edu # ###############################################################################
On 27-Feb-09, at 9:25 AM, Igor Stasenko wrote:
Hydra wasn't ported on linux yet. Initially i created a Win32 VM. Then Matthew Fulmer started linux port, but it wasn't finished. There is also a Mac port, made by John M McIntosh , and he reported that he were able to run it. But its not complete - a lot of plugins need additional porting.
Last spring I ported Hyrda to the macintosh carbon VM, it ran, but there were problems with Sockets, plus it was a moving target, then Igor took some time off, so I shelved further effort.
At thistime I don't see really building a new one (unless some has funding). Did I mention it's a moving target?
However out of it I did separate out all the platform support API from what VMMaker generates and requires. That effort then was folded into the iPhone VM and documentation on the isqueak.org site.
-- = = = ======================================================================== John M. McIntosh johnmci@smalltalkconsulting.com Corporate Smalltalk Consulting Ltd. http://www.smalltalkconsulting.com = = = ========================================================================
2009/2/27 John M McIntosh johnmci@smalltalkconsulting.com:
On 27-Feb-09, at 9:25 AM, Igor Stasenko wrote:
Hydra wasn't ported on linux yet. Initially i created a Win32 VM. Then Matthew Fulmer started linux port, but it wasn't finished. There is also a Mac port, made by John M McIntosh , and he reported that he were able to run it. But its not complete - a lot of plugins need additional porting.
Last spring I ported Hyrda to the macintosh carbon VM, it ran, but there were problems with Sockets, plus it was a moving target, then Igor took some time off, so I shelved further effort.
At thistime I don't see really building a new one (unless some has funding). Did I mention it's a moving target?
You are right, it is highly experimental, and initially was developed as a proof of concept.
However out of it I did separate out all the platform support API from what VMMaker generates and requires. That effort then was folded into the iPhone VM and documentation on the isqueak.org site.
--
John M. McIntosh johnmci@smalltalkconsulting.com Corporate Smalltalk Consulting Ltd. http://www.smalltalkconsulting.com ===========================================================================
Klaus D. Witzel wrote:
2nd: what expression (HydraClone new cloneIdleProcess) does for you, is it runs the computational task which is described by the corresponding object subgraph, in a *new* native thread (with own heap and instance of
Just trying to understand this...
Does the object subgraph have to be complete (include all objects, classes and methods) to run the task?
Or is there a way objects/code can be loaded on demand like (If I understand this correctly) Craig's Spoon system does?
Would it be possibel to save the so created (minimal) image to reuse it later?
Michael
On Sun, 22 Feb 2009 19:57:48 +0100, Michael Rueger wrote:
Klaus D. Witzel wrote:
2nd: what expression (HydraClone new cloneIdleProcess) does for you, is it runs the computational task which is described by the corresponding object subgraph, in a *new* native thread (with own heap and instance of
Just trying to understand this...
Does the object subgraph have to be complete (include all objects, classes and methods) to run the task?
Yes, except the unsent messages and unreferenced variables, they can be nil'ed using the substitution array. Example: many fields of Class(es) are for use by the IDE only, just nil'em.
Or is there a way objects/code can be loaded on demand like (If I understand this correctly) Craig's Spoon system does?
No. Spoon's dynamicity is not part of Hydra mitosis (and in order to add it, Spoon must be added).
Would it be possibel to save the so created (minimal) image to reuse it later?
Yes: do transfer the corresponding method then put it [the method] to work. "classic" Hydra can then load+run the saved .image as usual.
And if that .image also contains sufficient GUI,etc objects, even the non-Hydra VM can load+run it and render it for your use.
Michael
Hi--
Michael Rueger wrote:
...is there a way objects/code can be loaded on demand like (if I understand this correctly) Craig's Spoon system does?
(Yes, Spoon does that.)
Klaus responds:
No. Spoon's dynamism is not part of Hydra mitosis (and in order to add it, Spoon must be added).
(Igor and I would like to do this.)
-C
-- Craig Latta www.netjam.org next show: 2009-03-13 (www.thishere.org)
Hi Igor,
On Sun, Feb 22, 2009 at 2:36 PM, Igor Stasenko siguctua@gmail.com wrote:
you can download binaries from here
hot. 8-) I can't wait to try!
Thanks,
Michael
Interesting. Is this conceptually different from making a snapshot using image segments and move this over to a different Hydra instance?
Cheers, - Andreas
Igor Stasenko wrote:
Hello lists,
(see http://en.wikipedia.org/wiki/Cell_division for explanation what mitosis is ;)
i just finished another torturing session in slang land, and finally made some of it working :)
I added a two new primitives, which aimed towards creating a new heap by cloning a designated set of objects from existing one. A first primitive is helps you to create a closed graph by reporting a set of objects which is referenced by objects in provided array, but not included in this array itself.
A second primitive is actually serves for creating a baby heap. I takes two array arguments: objects graph, and replacements (or substitutions).
The rules is simple: each object included in first array, should have references to objects which included in this array as well i.e. (objects identityIncludes: (objects at: x) someIvar ) == true
or if its not , then it can be found in a substitutions array. A substitutions array is a flat array of pairs oop -> index, where oop can be any oop, and index is a smallint index of item in objects array. Upon creation of new heap, all refs to oops in 'substitutions' array will be replaced by refs from 'objects' array by taking corresponding index.
Both array arguments should contain oops only (except from indexes in substitutions array) , should not contain duplicates and their intersection should be empty , i.e. (objects intersection: substitutions) isEmpty == true.
All of these rules actually serving to ensure that newly created object memory will form a fully closed graph (hence its oops can be cloned to a standalone object memory).
There are also, an initial example how to create a 'baby' object memory load http://www.squeaksource.com/HydraVM/HydraVM-sig.17.mcz
and do:
HydraClone new cloneIdleProcess
Of course you will need new VM. Sorry, i didn't published an update of sources yet. I can only give you a prebuilt one. Once i had a write access to ftp.squeak.org/HydraVM but i forgot credentials/key to it. (if Box Admins help me with this, i will upload it there). Or, you can write me in private and i will send you binaries.
P.S. I want to give a credit to Klaus D. Witzel who helped me to finish these new features, and inspired to do it :)
On Sun, 22 Feb 2009 18:19:33 +0100, Andreas Raab wrote:
Interesting. Is this conceptually different from making a snapshot using image segments and move this over to a different Hydra instance?
In principle: Yes.
Hydra mitosis tranfers all objects required by contractual obligation with the VM (special objects array, methods, context, process, scheduler, method dictionaries, classes, language level constants, etc).
This all has to be closed under #pointsTo: for each fixed/indexed field in transit.
And it populates an empty instance of ObjectMemory.
Cheers,
- Andreas
[...]
2009/2/22 Klaus D. Witzel klaus.witzel@cobss.com:
On Sun, 22 Feb 2009 18:19:33 +0100, Andreas Raab wrote:
Interesting. Is this conceptually different from making a snapshot using image segments and move this over to a different Hydra instance?
In principle: Yes.
Hydra mitosis tranfers all objects required by contractual obligation with the VM (special objects array, methods, context, process, scheduler, method dictionaries, classes, language level constants, etc).
Yes, this is why an example object memory (HydraClone new cloneIdleProcess) having 650 objects. I had to build a correct special objects array, which obliged to include: 256 character objects 32 special selectors and 80 objects in quiescentProcessLists.
This all has to be closed under #pointsTo: for each fixed/indexed field in transit.
And it populates an empty instance of ObjectMemory.
Cheers,
- Andreas
[...]
-- "If at first, the idea is not absurd, then there is no hope for it". Albert Einstein
squeak-dev@lists.squeakfoundation.org