At 11:01 AM 3/21/00 -0600, [EMAIL PROTECTED] wrote:
>This means that now the device factory must handle the registration and
>allocation of *every* device. Wouldn't it be easier, in that respect, to
>have the device schemes register themselves with "device:", then the
>individual schemes themselves handle the allocation?
A device factory is a smart factory, a factory that supports plug-ins. A
smart factory dispatches a request to individual plug-ins, called controllers.
A device factory corresponds to a major device: scheme. Each sub-scheme
must have its own controller. All of the URIs that start with device: are
dispatched to the device factory. In turn, the device factory dispatches a
request to each controller, until a controller returns an object (non-null)
or there are no more controllers.
This architecture is recursive. A device factory is a controller, too. It
plugs into the Smart API. The runtime configuration of the Smart API
becomes a tree of controllers.
Plug-in are added through custom configuration. The whole Smart API is
future-oriented. Any URI scheme imaginable can be plugged into the Smart
API if it implements the well-known Controller interface.
>In this respect, the individual scheme specifies several things:
>
>1. The class which is returned (which must be a subclass/interface of
>Device)
Exactly! Each scheme, controlled by a controller, specifies which class(es)
are returned by the scheme. The class: scheme always returns an instance of
java.lang.Class (or null).
class:java.awt.Button -> java.awt.Class
A schemes might return instances of more than one class. The object: scheme
returns an instance of *any* class:
object:java.awt.Button -> java.awt.Button
>2. If it's a limited resource, then a null may be returned if the resource
>has already been allocated.
Null is returned for any number of reasons, such as (1) a limited resource
that has reached its limit, (2) a non-sensical request (malformed URI), (3)
a controller is missing, or (4) an inappropriate request as determined by
security.
Imagine a scheme that allows up to five simultaneous TCP/IP connections.
When a program requests the sixth connection, null is returned instead.
The jdbc: scheme has been implemented in the Smart API. If you use a jdbc:
URI, you'll get an instance of java.sql.Connection (or null).
The Smart API is backward compatible. Imagine asking for a jdbc: connection
while using a virtual machine from Java 0 (JDK 1.02). Don't worry. The
Smart API does not crash. The controller for the jdbc: scheme cannot be
instantiated at all because the java.sql package is missing. Every jdbc:
request is denied because its controller is missing.
You can have anything you want. The device factory is a plug-in. It is
optional. Imagine you come to distrust the device: scheme entirely. You
can't get it to work in your environment. Simply re-configure the Smart API
to skip the device factory. Every device: request is denied because its
controller/factory is missing.
>But wouldn't it be "nicer" if, instead of returning null, it returns an
>error message describing what's wrong with the request, such as "out of
>bounds memory allocation", or "XYZ has already allocated that resource",
>and so on.
For BCNI and Smart API, no exception should be thrown by a controller or
factory. This has been a difficult architectural decision. In a multiple
stage factory, null can be returned much faster than an exception. Throwing
an exception complicates every Smart API interface. It complicates
interprocess communication.
A smart factory is optimistic. It uses the getObject() method exclusively.
It does not use acceptURI() to find a controller. From the first controller
installed to the last, a smart factory calls getObject() for each
controller until (1) an object is returned (non-null) or (2) there are no
more controllers.
>Also, how would one deallocate the resource? Would this need to be
>specified in the finalize method of the resource's returned object? What
>if the particular JVM that allocated this resource crashed, would the
>resource then be unavailable to everyone, requiring a reboot? These
>questions aren't just limited to your particular implementation; they are
>serious things to consider for any system.
After a resource has been "opened" by the URI-based subsystem, we need a
corresponding way to "close" it. I expected that objects would implement a
close() method. The close() method cannot fail. This would be consistent
with work that has already been done on asynchronous I/O. (And a finalize()
method should invoke close().)
>Don't get me wrong. This feels to me to be one of the best solutions to
>device allocation I've seen.
I agree. I like it for both political and technical merits. I like this as
a political solution because a loosely orgazized international group of
programmers can work in parallel on each sub-scheme and its corresponding
controller. It does not require centralized control over schemes,
controllers and their corresponding devices. It does not require a
standards body. It is a bazzaar, not a cathedral.
I like it as a technical solution because it is built to last. It has a
very long shelf life.
I like it because it is easy to develop. It is easy to build. We implement
something simple that works and build upon it. It is both backward
compatible and future-oriented. Any old scheme can expanded with new
features. Any new scheme can depend on existing ones.
I like it because it is flexible. The entire URI is a character array,
which easily passes through a persistence barrier. A URI is easy to store.
A URI is easy to enter at the keyboard. A URI is easy to pass from one
process to another.
>Some other things to consider. How would a program discover which devices
>are available? How would the admin then configure these devices so that
>they are setup correctly? I.e. how would you tell
>"device:sound://localhost/1" to use DMA channel 1 instead of channel 3?
>Then again, how would you know that there aren't more than one sound card
>available on localhost?
Think about this: a search for URLs requires a search engine. It is not
feasible to ask the Internet for a list of all valid URLs. Likewise, a
local search engine would provide a human-readable list of matching device
URIs.
>Perhaps I'm looking at the problem in the wrong direction. The URI here
>would be the way for the programs to allocate a resource. Some other
>technique would be needed to discover the devices available, and possibly
>another to configure them (a bean resource would be very handy here).
I agree. We should be talking about two compatible mechanisms here. We need
a mechanism to discover and configure devices. We need another mechanism to
open an existing device.
>This may be a good place to add our diagnostic tools and configuration
>tools. But how do we do this? Do we add another scheme, such as
>"config:device:port:/ports/serial/1", or do we add it to the path:
>"device:port:/ports/serial/1/config"? I dunno.
Yes! I like the idea of a config: scheme. There are always default
properties for a device. Default properties must be persistent. A config:
scheme interacts with a system-wide persisent data registry. To explain to
JOS that its IP address must be 5.5.5.120, you could ask for an IP
configuration object.
public void example() {
URI uri = "config:ip:";
Configuration config = (Configuration) uri.getObject();
config.setAddress( "5.5.5.120" );
}
The IP configuration object must store its default properties somewhere.
That is what a system-wide registry and data registry interface is for.
public void setAddress( String v ) {
URI uri = "x-registry:system:/network/ip";
PersistentRegistry r = (PersistentRegistry) uri.getObject();
r.setString( "Address", v );
r.close();
}
When configuring a device through the config: scheme, such changes are
persistent. They will return even if you restart JOS.
Transient properties for a device are set through the device: scheme. These
properties are not persistent. They disappear as soon as you close a device.
_______________________________________________
Kernel maillist - [EMAIL PROTECTED]
http://jos.org/mailman/listinfo/kernel
Re: [JOS-Kernel] Device as a digital resource
Gilbert Carl Herschberger II Wed, 22 Mar 2000 08:58:00 -0800
- Re: [JOS-Kernel] De... Todd L. Miller
- Re: [JOS-Kernel] De... Al
- Re: [JOS-Kernel] De... Gilbert Carl Herschberger II
- Re: [JOS-Kernel] De... Al
- Re: [JOS-Kernel] De... Gilbert Carl Herschberger II
- Re: [JOS-Kernel] De... Todd L. Miller
- Re: [JOS-Kernel] De... Al
- Re: [JOS-Kernel] Device as a digital resource Matt . Albrecht
- Re: [JOS-Kernel] Device as a digital res... Al
- Re: [JOS-Kernel] Device as a digital... Gilbert Carl Herschberger II
- Re: [JOS-Kernel] Device as a digital res... Gilbert Carl Herschberger II
- Re: [JOS-Kernel] Device as a digital... Todd L. Miller
- Re: [JOS-Kernel] Device as a digital resource Matt . Albrecht
- Re: [JOS-Kernel] Device as a digital res... Al
- Re: [JOS-Kernel] Device as a digital... Gilbert Carl Herschberger II
- Re: [JOS-Kernel] Device as a dig... Al
- Re: [JOS-Kernel] Device as a... Gilbert Carl Herschberger II
- Re: [JOS-Kernel] Device as a digital res... Todd L. Miller
- Re: [JOS-Kernel] Device as a digital resource Matt . Albrecht
- Re: [JOS-Kernel] Device as a digital res... Todd L. Miller
