gzz-commits
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Gzz-commits] gzz gfx/anim/paper.py gfx/jni/GzzGL-jni.cxx gfx...


From: Tuomas J. Lukka
Subject: [Gzz-commits] gzz gfx/anim/paper.py gfx/jni/GzzGL-jni.cxx gfx...
Date: Tue, 03 Dec 2002 14:14:12 -0500

CVSROOT:        /cvsroot/gzz
Module name:    gzz
Changes by:     Tuomas J. Lukka <address@hidden>        02/12/03 14:14:12

Modified files:
        gfx/anim       : paper.py 
        gfx/jni        : GzzGL-jni.cxx 
        gfx/libutil    : ObjectStorer.hxx 
        gzz/client     : AbstractUpdateManager.java 
        gzz/client/gl  : GLUpdateManager.java 
        gzz/gfx/gl     : GL.java 

Log message:
        SQUASH!!!!!!!!!!

CVSWeb URLs:
http://savannah.gnu.org/cgi-bin/viewcvs/gzz/gzz/gfx/anim/paper.py.diff?tr1=1.4&tr2=1.5&r1=text&r2=text
http://savannah.gnu.org/cgi-bin/viewcvs/gzz/gzz/gfx/jni/GzzGL-jni.cxx.diff?tr1=1.64&tr2=1.65&r1=text&r2=text
http://savannah.gnu.org/cgi-bin/viewcvs/gzz/gzz/gfx/libutil/ObjectStorer.hxx.diff?tr1=1.7&tr2=1.8&r1=text&r2=text
http://savannah.gnu.org/cgi-bin/viewcvs/gzz/gzz/gzz/client/AbstractUpdateManager.java.diff?tr1=1.24&tr2=1.25&r1=text&r2=text
http://savannah.gnu.org/cgi-bin/viewcvs/gzz/gzz/gzz/client/gl/GLUpdateManager.java.diff?tr1=1.7&tr2=1.8&r1=text&r2=text
http://savannah.gnu.org/cgi-bin/viewcvs/gzz/gzz/gzz/gfx/gl/GL.java.diff?tr1=1.22&tr2=1.23&r1=text&r2=text

Patches:
Index: gzz/gfx/anim/paper.py
diff -u gzz/gfx/anim/paper.py:1.4 gzz/gfx/anim/paper.py:1.5
--- gzz/gfx/anim/paper.py:1.4   Tue Dec  3 10:00:46 2002
+++ gzz/gfx/anim/paper.py       Tue Dec  3 14:14:11 2002
@@ -15,6 +15,7 @@
     print "Frame", frame
     frame += 1
     java.lang.System.gc()
+    GL.freeQueue()
 
 def saveframe(sc):
     vs = w.createVobScene()
Index: gzz/gfx/jni/GzzGL-jni.cxx
diff -u gzz/gfx/jni/GzzGL-jni.cxx:1.64 gzz/gfx/jni/GzzGL-jni.cxx:1.65
--- gzz/gfx/jni/GzzGL-jni.cxx:1.64      Thu Nov 14 09:51:39 2002
+++ gzz/gfx/jni/GzzGL-jni.cxx   Tue Dec  3 14:14:12 2002
@@ -814,11 +814,13 @@
 JNIEXPORT jint JNICALL Java_gzz_gfx_gl_GL_createByteVectorImpl
   (JNIEnv *, jclass, jint size) {
       ByteVector *vec = new ByteVector(size);
+      DBG(dbg) << "Alloc byte vector "<<(int)vec<<"\n";
       return bytevectors.add(vec);
 }
 
 JNIEXPORT void JNICALL Java_gzz_gfx_gl_GL_deleteByteVector
   (JNIEnv *, jclass, jint id) {
+      DBG(dbg) << "Delete byte vector "<<(int)bytevectors[id]<<"\n";
       bytevectors.remove(id);
 }
 
Index: gzz/gfx/libutil/ObjectStorer.hxx
diff -u gzz/gfx/libutil/ObjectStorer.hxx:1.7 
gzz/gfx/libutil/ObjectStorer.hxx:1.8
--- gzz/gfx/libutil/ObjectStorer.hxx:1.7        Wed Sep 18 07:39:26 2002
+++ gzz/gfx/libutil/ObjectStorer.hxx    Tue Dec  3 14:14:12 2002
@@ -11,6 +11,68 @@
     // XXX NOT ENOUGH SAFETY CHECKS FOR REMOVE!
     // GET MUSTN'T CHECK; MUST CHECK RANGE BEFORE.
     /** A template for storing (owning pointers to) objects by integer ids.
+     */
+    template<class T> class ObjectStorer {
+       vector<T *> vec;
+    public:
+       ObjectStorer() {
+           // to avoid '0' as id
+           vec.insert(vec.end(), 0);
+       }
+       /** Add a new object, get back its assigned id.
+        * Side effect: all object marked for removal
+        * since the last add() are really deleted.
+        * The ObjectStorer takes ownership of the pointer
+        * and will eventually delete() it.
+        */
+       int add(T *p) {
+           if(p == 0) {
+               return 0; // invalid value
+           }
+
+           for(int i=vec.size()-1; i>= 0; i--) {
+               if(vec[i] == 0) {
+                   vec[i] = p;
+                   return i;
+               }
+           }
+
+           int i = vec.size();
+           vec.insert(vec.end(), p);
+           return i;
+       }
+       /** Mark the object with the given id for removal.
+        */
+       void remove(int p) {
+           if(p == 0) return;
+           delete vec[p];
+           vec[p] = 0;
+       }
+       
+       /** Get the pointer corresponding to the given id.
+        */
+       T *get(int p) {
+           if((unsigned)p >= vec.size()) {
+               cerr << "Trying to get element past end\n";
+               return 0;
+           }
+           if(vec[p] == NULL) {
+               cerr << "Trying to get null element!\n";
+               return 0;
+           }
+           return vec[p];
+       }
+
+       /** Alias to get().
+        */
+       T *operator[](int p) { return get(p); }
+
+    };
+
+
+    // XXX NOT ENOUGH SAFETY CHECKS FOR REMOVE!
+    // GET MUSTN'T CHECK; MUST CHECK RANGE BEFORE.
+    /** A template for storing (owning pointers to) objects by integer ids.
      * Objects may also be marked for removal: 
      * the ones
      * marked for removal are really deleted
@@ -21,12 +83,18 @@
      * delete C++ objects that would touch OpenGL state at
      * the same time. OpenGL has the global context, and that
      * forces us to jump through some hoops. 
+     * XXX
+     * Not any more: now ensurance of thread at higher level.
      */
-    template<class T> class ObjectStorer {
+    template<class T> class ObjectStorer_LazyDelete {
        vector<T *> vec;
        vector<T *> toBeDeleted; // Because of context, we only delete
                            // when allocating a new one.
     public:
+       ObjectStorer_LazyDelete() {
+           // to avoid '0' as id
+           vec.insert(vec.end(), 0);
+       }
        /** Add a new object, get back its assigned id.
         * Side effect: all object marked for removal
         * since the last add() are really deleted.
Index: gzz/gzz/client/AbstractUpdateManager.java
diff -u gzz/gzz/client/AbstractUpdateManager.java:1.24 
gzz/gzz/client/AbstractUpdateManager.java:1.25
--- gzz/gzz/client/AbstractUpdateManager.java:1.24      Fri Nov 29 11:42:16 2002
+++ gzz/gzz/client/AbstractUpdateManager.java   Tue Dec  3 14:14:12 2002
@@ -41,7 +41,7 @@
  */
 
 public abstract class AbstractUpdateManager implements Runnable {
-public static final String rcsid = "$Id: AbstractUpdateManager.java,v 1.24 
2002/11/29 16:42:16 humppake Exp $";
+public static final String rcsid = "$Id: AbstractUpdateManager.java,v 1.25 
2002/12/03 19:14:12 tjl Exp $";
     public static boolean dbg = false;
     private static void pa(String s) { System.err.println(s); }
 
@@ -318,6 +318,8 @@
      * @return true, if any events were received.
      */
     protected abstract boolean handleEvents(boolean waitForEvent);
+    protected void doIdle() {
+    }
 
     public void run() {
        if(initRunnable != null) {
Index: gzz/gzz/client/gl/GLUpdateManager.java
diff -u gzz/gzz/client/gl/GLUpdateManager.java:1.7 
gzz/gzz/client/gl/GLUpdateManager.java:1.8
--- gzz/gzz/client/gl/GLUpdateManager.java:1.7  Mon Sep 23 04:24:25 2002
+++ gzz/gzz/client/gl/GLUpdateManager.java      Tue Dec  3 14:14:12 2002
@@ -30,7 +30,7 @@
 import java.util.*;
 
 public class GLUpdateManager extends AbstractUpdateManager {
-public static final String rcsid = "$Id: GLUpdateManager.java,v 1.7 2002/09/23 
08:24:25 tjl Exp $";
+public static final String rcsid = "$Id: GLUpdateManager.java,v 1.8 2002/12/03 
19:14:12 tjl Exp $";
     private static boolean dbg = false;
     private static void p(String s) { if(dbg) pa(s); }
     private static void pa(String s) { System.err.println(s); }
@@ -55,5 +55,9 @@
 
     protected void callGenerateEnd(Window w, int millis, float lod) {
        super.callGenerateEnd(w, millis, lod);
+    }
+
+    protected void doIdle() {
+       GL.freeQueue();
     }
 }
Index: gzz/gzz/gfx/gl/GL.java
diff -u gzz/gzz/gfx/gl/GL.java:1.22 gzz/gzz/gfx/gl/GL.java:1.23
--- gzz/gzz/gfx/gl/GL.java:1.22 Sat Nov 23 14:03:35 2002
+++ gzz/gzz/gfx/gl/GL.java      Tue Dec  3 14:14:12 2002
@@ -23,6 +23,8 @@
 package gzz.gfx.gl;
 import java.awt.Rectangle;
 import java.awt.Dimension;
+import java.util.ArrayList;
+import java.util.Iterator;
 import java.util.Set;
 import java.util.HashSet;
 import java.util.StringTokenizer;
@@ -106,6 +108,23 @@
      */
     public static final int RENDERABLE3 = 0x3000000;
 
+    static ArrayList queue = new ArrayList();
+
+    /** Because objects have to be released by the same thread
+     * that obtained them, this method needs to be called every
+     * once in a while.
+     */
+    static public void freeQueue() {
+       synchronized(queue) {
+           for(Iterator i = queue.iterator(); i.hasNext(); ) {
+               JavaObject obj = ((JavaObject)i.next());
+               obj.deleteObj();
+               obj.id = 0;
+           }
+           queue.clear();
+       }
+    }
+
     /** The Java proxy for a C++ object.
      */
     static public abstract class JavaObject extends gzz.vob.Vob {
@@ -115,9 +134,13 @@
         */
        public void finalize() {
            if(this.dbg) pa("Finalizing "+this+" "+id);
-           if(id != 0) throw new Error("Zero id object!");
-           deleteObj();
-           id = 0;
+           // Would like to
+           //          deleteObj();
+           // but can't due to thread problems.
+           if(id != 0) 
+               synchronized(queue) {
+                   queue.add(this);
+               }
        }
        public void render(java.awt.Graphics g, 
                            boolean fast,
@@ -651,8 +674,12 @@
     static public class ByteVector extends NonRenderableJavaObject {
        private ByteVector(int id) {
            super(id);
+           if(dbg) pa("Create bytevector\n");
+       }
+       protected void deleteObj() { 
+           if(dbg) pa("Delete bytevector\n");
+           deleteByteVector(getId()); 
        }
-       protected void deleteObj() { deleteByteVector(getId()); }
 
        /** Get a value from this byte vector.
         * @param ind The index of the value to get.




reply via email to

[Prev in Thread] Current Thread [Next in Thread]