om,
Okay, attached is part of my current attempt at implementing my Sphere design. There's also a sketch of how I envision the system working.
The yellow part is supposed to be the Sphere class itself. Unlike Environment, it doesn't directly support an instance of Smalltalk, instead its role is merely to provide the structure and support the core services as listed in the "SphereInterfaceBase" class.
The reason for this design decision is that it will, hopefully/eventually be relatively language agnostic such that it will be possible to write language bindings such that you can write spheres in the language of your choice. -- hence the Intercal joke. -- heck, intercal 2 can't be any worse than its predecessor! ;)
The "CPU" and "MEMORY" modules provide the interface between the Sphere system and whatever the heck is running the code for this sphere.
The little purple spheres are nested spheres which are managed by the sphere system. -- By necessity, the entire Sphere framework must be in the same language.
The "interface" and "outerface" are callbacks to the intercal 2/whatever code. (or to some code in a parent environment)
One security issue with the interface and outerface is that they must be invulnerable to modification in any way yet still accessable to the varrious modules.
Visability:
The outerface must be visable to other spheres in the system and the parent environment. It must be callable in a fairly elegant fassion and be able to return session classes and objects in such a way that a call to a session object will be transmitted to the providing sphere in such a way that is exclusive to any other communication.
The interface is inherited from the base class and may be extended by the sphere's code and _ONLY_ by the sphere's code. It automaticly becomes the base class for any sub-spheres...
This may pose a problem because spheres should be dynamicly loadable, -- it should be possible to load a sphere within any sphere which has compatible interfaces. This means that the inheritance mechanism just mentioned must be agnostic to the actual name of the class being inherited!!! =P
(If this were easy I would have done it myself. =( )
The top-level problem is that I'm only an intermediate level Squeak programer trying to design a meta-meta class. =P
Come to think of it, my feeble and confused mind had a different idea about this long ago... The key to my older design was that the CPU needed to have enough features for the intercal/etc environment to basically run its own kernel....
I think this design will also work and, if done correctly, will redily lend itself towards the more ambitious nested-kernel design. =)
-- I will post with increasing frequency untill something happens... I really _NEED_ this OS!!! =\
Object subclass: #Sphere instanceVariableNames: 'Name interfaces Outerfaces Memory Supervisor Subordinants tasks visitingTasks MyPriority allowRecursiveCalls ' classVariableNames: '' poolDictionaries: '' category: 'Sphere-Base'! !Sphere commentStamp: 'ATG 10/16/2003 17:00' prior: 0! This is the base class for a system oriented operating system called "sphere".
For reasons of system durability, this class is to be used to manage the actual spheres and not directly linked to any Sphere software. This is neccessary to enhance compatibility across versions and through time. !
!Sphere methodsFor: 'accessing' stamp: 'ATG 10/17/2003 16:29'! changeNameTo: aNewName
"om."
Name _ aNewName. ! !
!Sphere methodsFor: 'accessing' stamp: 'ATG 10/19/2003 17:33'! interface: newInterface interfaces _ newInterface. ! !
!Sphere methodsFor: 'accessing' stamp: 'ATG 10/17/2003 16:51'! name ^Name.! !
!Sphere methodsFor: 'accessing' stamp: 'ATG 10/19/2003 17:35'! outerface: newOuterface Outerfaces _ newOuterface. ! !
!Sphere methodsFor: 'error handling' stamp: 'AFG 10/4/2002 14:14'! serverFailure "should a server this sphere depend on fail..." self die. ! !
!Sphere methodsFor: 'initialization' stamp: 'ATG 12/18/2003 19:02'! initialize super initialize. Name _ 'UNUSED'.
" a generic sphere doesn't need an interface... " " interfaces _ SphereInterfaceBase new. Outerfaces _ SphereOuterfaceBase new. " Memory _ BogusMemory new. Subordinants _ Array new. tasks _ Heap new. visitingTasks _ Collection new. allowRecursiveCalls _ true.! !
!Sphere methodsFor: 'as yet unclassified' stamp: 'ATG 10/17/2003 17:01'! addSubordinant: aSubordinantSphere
Subordinants add: aSubordinantSphere.! !
!Sphere methodsFor: 'as yet unclassified' stamp: 'ATG 10/17/2003 16:48'! assignMemory: aVirtualMemoryProvider
Memory _ aVirtualMemoryProvider.! !
!Sphere methodsFor: 'as yet unclassified' stamp: 'ATG 10/17/2003 21:56'! doToAllChildren: aBlock
Subordinants do: aBlock.! !
!Sphere methodsFor: 'as yet unclassified' stamp: 'ATG 10/17/2003 17:03'! extTryService: aMessage! !
!Sphere methodsFor: 'as yet unclassified' stamp: 'ATG 10/17/2003 17:04'! intTryService: aMessage! !
!Sphere methodsFor: 'as yet unclassified' stamp: 'ATG 10/17/2003 21:27'! memorySize
^ Memory size.! !
!Sphere methodsFor: 'as yet unclassified' stamp: 'ATG 10/17/2003 16:46'! parent
^ Supervisor.! !
!Sphere methodsFor: 'as yet unclassified' stamp: 'ATG 10/17/2003 16:47'! parent: aNewSupervisor
Supervisor _ aNewSupervisor.! !
!Sphere methodsFor: 'as yet unclassified' stamp: 'ATG 10/17/2003 17:27'! removeSubordinant: aDerilictSubordinant ! !
"-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- "!
Sphere class instanceVariableNames: ''!
!Sphere class methodsFor: 'as yet unclassified' stamp: 'ATG 10/17/2003 22:13'! createNewIn: aParentSphere
| aNewSphere | aNewSphere _ self new. aNewSphere parent: aParentSphere. ^ aNewSphere. ! !
!Sphere class methodsFor: 'as yet unclassified' stamp: 'ATG 10/17/2003 16:50'! createNewIn: aParentSphere with: aMemory
| aNewSphere | aNewSphere _ self new. aNewSphere parent: aParentSphere; assignMemory: aMemory. ^ aNewSphere. ! !
Object subclass: #SphereCallInterface instanceVariableNames: '' classVariableNames: '' poolDictionaries: '' category: 'Sphere-Base'! !SphereCallInterface commentStamp: 'ATG 10/17/2003 17:28' prior: 0! The syscall interface for Sphere. !
"-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- "!
SphereCallInterface class instanceVariableNames: ''!
!SphereCallInterface class methodsFor: 'as yet unclassified' stamp: 'ATG 10/17/2003 16:58'! SystemCall: aMessage
"Tries to find a sphere within or available to the current context which understands this message. This is a secure synchronous call from the sender's perspective. from the receiver's perspective it is an assynchronous event which executes one of the public interfaces." ! !
Object subclass: #SphereInterfaceBase instanceVariableNames: 'owner ' classVariableNames: '' poolDictionaries: '' category: 'Sphere-Base'! !SphereInterfaceBase commentStamp: 'ATG 10/16/2003 17:32' prior: 0! Base class for interface objects.
Each Sphere is likley to have two children of this class, one exclusively for subspheres and one that is accessable publicly.!
!SphereInterfaceBase methodsFor: 'thread navigation' stamp: 'ATG 10/17/2003 00:24'! enter: aSphere
"switch the current thread's context to the new one." ! !
!SphereInterfaceBase methodsFor: 'thread navigation' stamp: 'ATG 10/17/2003 01:03'! home
"return to home context"! !
!SphereInterfaceBase methodsFor: 'thread navigation' stamp: 'ATG 10/17/2003 01:03'! leave
"leave current context" ! !
!SphereInterfaceBase methodsFor: 'security' stamp: 'ATG 10/17/2003 01:10'! giveAccess
"Grant the thread's home access to this sphere." ! !
!SphereInterfaceBase methodsFor: 'security' stamp: 'ATG 10/17/2003 01:10'! requestAuthent: key
"request security access to the parent context with provided key." ! !
!SphereInterfaceBase methodsFor: 'informational' stamp: 'ATG 10/17/2003 21:11'! HELP "!!!!!!!!"
"return a help message for this context."
^ 'Welcome to the Sphere Operating System. This is an early prototype which is intended to demonstrate its basic concepts and perhaps even serve as the basis for a more capable version. You are in a context called a Sphere. The system calls available here are derived from the services provided by other Spheres which are also within this context as well as (possibly) spheres outside of this current context. Use the List function to learn what spheres may be here to explore. use menu function to learn what commands you can try.'! !
!SphereInterfaceBase methodsFor: 'informational' stamp: 'ATG 12/18/2003 19:03'! VMLook
"return a virtual memory report for this and all subordinant contexts."
^ owner memorySize.! !
!SphereInterfaceBase methodsFor: 'informational' stamp: 'ATG 12/18/2003 19:03'! getCurrentContextName
"returns the name of the current context."
^ owner name. ! !
!SphereInterfaceBase methodsFor: 'informational' stamp: 'ATG 10/17/2003 22:07'! list
"returns a list of spheres within this context."
| tempString |
tempString _ String new.
Owner doToAllChildren: [: x | tempString append: (x name). tempString append: ' ' ].
^ tempString.! !
!SphereInterfaceBase methodsFor: 'informational' stamp: 'ATG 10/17/2003 00:23'! menu
"I think this should return a list of methods of the interface class and all the commands available within the current context, including interfaces provided to parent contexts for both program and user interfaces." ! !
!SphereInterfaceBase methodsFor: 'graph managment...' stamp: 'ATG 10/17/2003 14:05'! disconnect
"disconnect a client gracefully." ! !
!SphereInterfaceBase methodsFor: 'graph managment...' stamp: 'ATG 10/17/2003 14:06'! disconnect: serverSphere
"disconnect a client or server ungracefully." ! !
!SphereInterfaceBase methodsFor: 'graph managment...' stamp: 'ATG 10/17/2003 00:22'! graph
"Returns a dependancy graph that may be converted into any of a number of types of user reports." ! !
!SphereInterfaceBase methodsFor: 'graph managment...' stamp: 'ATG 10/17/2003 01:04'! recogClient
"Recognise the home of the thread as a client." ! !
!SphereInterfaceBase methodsFor: 'Sphere Managment' stamp: 'ATG 12/18/2003 19:04'! create "Create a gnu sphere within the current context."
| newSphere |
newSphere _ Sphere createNewIn: owner.
owner addSubordinant: newSphere.
^ newSphere. ! !
!SphereInterfaceBase methodsFor: 'Sphere Managment' stamp: 'ATG 10/17/2003 00:02'! interpret: someSpherewarez in: thisSphere
! !
!SphereInterfaceBase methodsFor: 'Sphere Managment' stamp: 'ATG 10/17/2003 22:21'! murder: theVictim
"not much needs to be done for process cleanup in a GC'd environment... This will delink the sphere and run a GC..." ! !
!SphereInterfaceBase methodsFor: 'Sphere Managment' stamp: 'ATG 12/18/2003 19:04'! setHomeSphere: newOwner
owner _ newOwner. ! !
!SphereInterfaceBase methodsFor: 'Sphere Managment' stamp: 'ATG 10/17/2003 22:22'! shutdown: aSphere
"Attempt to run a Sphere's cleanup routines and shutdown gracefully." ! !
!SphereInterfaceBase methodsFor: 'Sphere Managment' stamp: 'ATG 10/17/2003 01:07'! transfer
"give this sphere's responsibilities to the caller, used for On-the-mosquito upgrading." ! !
!SphereInterfaceBase methodsFor: 'interface managment' stamp: 'ATG 12/18/2003 19:04'! installInterface: newInterface owner interface: newInterface.! !
!SphereInterfaceBase methodsFor: 'interface managment' stamp: 'ATG 12/18/2003 19:04'! installOuterface: newOuterface owner outerface: newOuterface.! !
"-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- "!
SphereInterfaceBase class instanceVariableNames: ''!
!SphereInterfaceBase class methodsFor: 'as yet unclassified' stamp: 'ATG 10/18/2003 11:25'! new: homeSphere
"set up the interface to work with the provided sphere."
^ self new; setHomeSphere: homeSphere. ! !
Object subclass: #SphereOuterfaceBase instanceVariableNames: 'owner ' classVariableNames: '' poolDictionaries: '' category: 'Sphere-Base'!
!SphereOuterfaceBase methodsFor: 'as yet unclassified' stamp: 'ATG 2/15/2004 01:11'! owner: nOwner
owner ifNil: [ owner _ nOwner].
"this should be secure but we really want to hurt the idiot who thought he could take over someone else's outerface." ! !
"-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- "!
SphereOuterfaceBase class instanceVariableNames: ''!
!SphereOuterfaceBase class methodsFor: 'as yet unclassified' stamp: 'ATG 2/15/2004 01:09'! newWithOwner: nOwner ^ self new; owner: nOwner.! !
Object subclass: #SphereSoftware instanceVariableNames: '' classVariableNames: '' poolDictionaries: '' category: 'Sphere-Base'! !SphereSoftware commentStamp: 'ATG 10/16/2003 16:57' prior: 0! Abstract class for all software written for Sphere including drivers and user software.!
squeak-e@lists.squeakfoundation.org