[libbluray-devel] Improve BDJAppProxy shutdown: do not wait for event queue threads

hpi1 git at videolan.org
Sun Apr 14 15:08:59 CEST 2013


libbluray | branch: master | hpi1 <hpi1 at anonymous.org> | Fri Apr 12 10:43:22 2013 +0300| [c83c092c25a5e0bfd09e960f9505e8ddfd34c9c2] | committer: hpi1

Improve BDJAppProxy shutdown: do not wait for event queue threads

> http://git.videolan.org/gitweb.cgi/libbluray.git/?a=commit;h=c83c092c25a5e0bfd09e960f9505e8ddfd34c9c2
---

 src/libbluray/bdj/java/org/videolan/BDJAppProxy.java |    5 +++--
 .../bdj/java/org/videolan/BDJThreadGroup.java        |   18 ++++++++++++++++++
 .../bdj/java/org/videolan/BDJXletContext.java        |   12 ++++++++++++
 3 files changed, 33 insertions(+), 2 deletions(-)

diff --git a/src/libbluray/bdj/java/org/videolan/BDJAppProxy.java b/src/libbluray/bdj/java/org/videolan/BDJAppProxy.java
index 3ca8a6c..9829223 100644
--- a/src/libbluray/bdj/java/org/videolan/BDJAppProxy.java
+++ b/src/libbluray/bdj/java/org/videolan/BDJAppProxy.java
@@ -234,8 +234,9 @@ public class BDJAppProxy implements DVBJProxy, Runnable {
         if ((state != NOT_LOADED) && (state != LOADED)) {
             try {
                 xlet.destroyXlet(force);
-                for (int i = 0; (i < 50) && (context.getThreadGroup().activeCount() > 1); i++)
-                    Thread.sleep(20L);
+
+                context.getThreadGroup().waitForShutdown(1000, 1 + context.numEventQueueThreads());
+
                 String persistent = System.getProperty("dvb.persistent.root") + File.separator +
                     (String)context.getXletProperty("dvb.org.id") + File.separator +
                     (String)context.getXletProperty("dvb.app.id");
diff --git a/src/libbluray/bdj/java/org/videolan/BDJThreadGroup.java b/src/libbluray/bdj/java/org/videolan/BDJThreadGroup.java
index 17a0f90..2863135 100644
--- a/src/libbluray/bdj/java/org/videolan/BDJThreadGroup.java
+++ b/src/libbluray/bdj/java/org/videolan/BDJThreadGroup.java
@@ -1,6 +1,7 @@
 /*
  * This file is part of libbluray
  * Copyright (C) 2010  William Hahne
+ * Copyright (C) 2013  Petri Hintukainen <phintuka at users.sourceforge.net>
  *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Lesser General Public
@@ -34,5 +35,22 @@ public class BDJThreadGroup extends ThreadGroup {
         this.context = context;
     }
 
+    public boolean waitForShutdown(int maxThreads, int timeout) {
+        long startTime = System.currentTimeMillis();
+        long endTime = startTime + 1000;
+        while ((activeCount() > maxThreads) &&
+               (System.currentTimeMillis() < endTime)) {
+            try {
+                Thread.sleep(10);
+            } catch (InterruptedException e) { }
+        }
+
+        boolean result = (activeCount() <= maxThreads);
+        if (!result) {
+            Logger.getLogger("BDJThreadGroup").error("waitForShutdown timeout");
+        }
+        return result;
+    }
+
     private BDJXletContext context;
 }
diff --git a/src/libbluray/bdj/java/org/videolan/BDJXletContext.java b/src/libbluray/bdj/java/org/videolan/BDJXletContext.java
index da98998..718dc3a 100644
--- a/src/libbluray/bdj/java/org/videolan/BDJXletContext.java
+++ b/src/libbluray/bdj/java/org/videolan/BDJXletContext.java
@@ -1,6 +1,7 @@
 /*
  * This file is part of libbluray
  * Copyright (C) 2010  William Hahne
+ * Copyright (C) 2013  Petri Hintukainen <phintuka at users.sourceforge.net>
  *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Lesser General Public
@@ -100,6 +101,17 @@ public class BDJXletContext implements javax.tv.xlet.XletContext, javax.microedi
         return eventQueue;
     }
 
+    protected int numEventQueueThreads() {
+        int cnt = 0;
+        if (eventQueue != null) {
+            Thread t = java.awt.BDJHelper.getEventDispatchThread(eventQueue);
+            if (t != null && t.isAlive()) {
+                cnt++;
+            }
+        }
+        return cnt;
+    }
+
     public void setSceneFactory(HSceneFactory f) {
         sceneFactory = f;
     }



More information about the libbluray-devel mailing list