[e-cvs] cvs commit: e/src/jsrc/org/erights/e/elib/ref DeviceRef.java

markm@eros.cs.jhu.edu markm@eros.cs.jhu.edu
Tue, 28 Aug 2001 17:01:31 -0400


markm       01/08/28 17:01:31

  Modified:    src/jsrc/org/erights/e/elib/io ReaderWrapper.java
               src/jsrc/org/erights/e/elib/prim Queue.java SynchQueue.java
               src/jsrc/org/erights/e/elib/ref DeviceRef.java
  Log:
  progress towards asynch reader

Revision  Changes    Path
1.2       +8 -6      e/src/jsrc/org/erights/e/elib/io/ReaderWrapper.java

Index: ReaderWrapper.java
===================================================================
RCS file: /cvs/e/src/jsrc/org/erights/e/elib/io/ReaderWrapper.java,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -r1.1 -r1.2
--- ReaderWrapper.java	2001/08/28 06:40:10	1.1
+++ ReaderWrapper.java	2001/08/28 21:01:31	1.2
@@ -40,7 +40,8 @@
     
     private Reader myWrapped;
     
-    private Object myQLock;
+    /** A prompt lock shared with the SynchQueue */
+    private Object myLock;
     
     private SynchQueue myAsynchRequests;
     
@@ -59,8 +60,9 @@
     /** Assumes it has exclusive access to 'wrapped' */
     public ReaderWrapper(Reader wrapped) {
         myWrapped = wrapped;
-        myQLock = new Object();
-        myAsynchRequests = new SynchQueue(Message.class, myQLock);
+        myLock = new Object();
+        myAsynchRequests = new SynchQueue(Message.class, myLock);
+        myOptMsg = null;
         myCreator = Runner.currentRunner();
         myReadingThread = new Thread(this, "ReaderWrapper");
         myReadingThread.start();
@@ -72,9 +74,9 @@
     public void run() {
         while (true) {
             // If blocked on dequeue, myOptMsg will be null
-            synchronized (myQLock) {
+            synchronized (myLock) {
                 myOptMsg = null;
-                //ensure assignment happens while still holding myQLock
+                //ensure assignment happens while still holding myLock
                 myOptMsg = (Message)myAsynchRequests.dequeue();
             }
             // Using E.call(..) in a non-vat thread!
@@ -93,7 +95,7 @@
      * wrapped Reader is ready, then we're ready
      */
     public boolean ready() throws IOException {
-        synchronized (myQLock) {
+        synchronized (myLock) {
             return myOptMsg == null && 
                    ! myAsynchRequests.hasMoreElements() &&
                    myWrapped.ready();



1.7       +0 -2      e/src/jsrc/org/erights/e/elib/prim/Queue.java

Index: Queue.java
===================================================================
RCS file: /cvs/e/src/jsrc/org/erights/e/elib/prim/Queue.java,v
retrieving revision 1.6
retrieving revision 1.7
diff -u -r1.6 -r1.7
--- Queue.java	2001/08/20 05:07:44	1.6
+++ Queue.java	2001/08/28 21:01:31	1.7
@@ -121,8 +121,6 @@
      * @return is false if the queue is empty, otherwise true
      */
     public boolean hasMoreElements() {
-        //NOTE: This depends on the java & jvm guarantee that int read
-        //and write is atomic.
         return myCurSize != 0;
     }
 



1.2       +24 -5     e/src/jsrc/org/erights/e/elib/prim/SynchQueue.java

Index: SynchQueue.java
===================================================================
RCS file: /cvs/e/src/jsrc/org/erights/e/elib/prim/SynchQueue.java,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -r1.1 -r1.2
--- SynchQueue.java	2001/08/24 17:14:02	1.1
+++ SynchQueue.java	2001/08/28 21:01:31	1.2
@@ -41,7 +41,7 @@
      * Makes a SynchQueue that can hold any object (except null).
      */
     public SynchQueue() {
-        this(Object.class);
+        this(Object.class, new Object());
     }
 
     /**
@@ -50,8 +50,15 @@
      * @param elementType may not be a primitive (ie, scalar) type.
      */
     public SynchQueue(Class elementType) {
+        this(elementType, new Object());
+    }
+
+    /**
+     * Provide the object to lock on.
+     */
+    public SynchQueue(Class elementType, Object qLock) {
         super(elementType);
-        myQLock = new Object();
+        myQLock = qLock;
     }
 
     /**
@@ -60,7 +67,7 @@
      * dequeued. 
      */
     public Object dequeue() {
-        synchronized(myQLock) {
+        synchronized (myQLock) {
             while(true) {
                 Object result = optDequeue();
                 if (result != null) {
@@ -80,17 +87,29 @@
      * 
      */
     public void enqueue(Object newElement) {
-        synchronized(myQLock) {
+        synchronized (myQLock) {
             super.enqueue(newElement);
             myQLock.notifyAll();
         }
     }
 
     /**
+     * Check to see if the queue has more elements.  This method
+     * allows a Queue to be used as an Enumeration.
+     *
+     * @return is false if the queue is empty, otherwise true
+     */
+    public boolean hasMoreElements() {
+        synchronized (myQLock) {
+            return super.hasMoreElements();
+        }
+    }
+
+    /**
      * 
      */
     public Object optDequeue() {
-        synchronized(myQLock) {
+        synchronized (myQLock) {
             return super.optDequeue();
         }
     }



1.5       +1 -1      e/src/jsrc/org/erights/e/elib/ref/DeviceRef.java

Index: DeviceRef.java
===================================================================
RCS file: /cvs/e/src/jsrc/org/erights/e/elib/ref/DeviceRef.java,v
retrieving revision 1.4
retrieving revision 1.5
diff -u -r1.4 -r1.5
--- DeviceRef.java	2001/04/13 08:08:34	1.4
+++ DeviceRef.java	2001/08/28 21:01:31	1.5
@@ -33,7 +33,7 @@
  * The arguments passed in must be objects that may validly be used from
  * multiple vats at once, such as transitively pass-by-copy objects, or
  * further DeviceRefs.  This constraint is not enforced, so only trusted code
- * may hold DeviceRefs.  Messaes sent over DeviceRefs return a DeviceRef for
+ * may hold DeviceRefs.  Messages sent over DeviceRefs return a DeviceRef for
  * designating a return result in the target's vat.
  *
  * Even if the target is or becomes BROKEN or PassByConstruction, DeviceRef