[libbluray-devel] Stop remote (Ixc) threads when stopping xlet. Remote threads run in callee context / thread group.
hpi1
git at videolan.org
Fri May 10 14:30:55 CEST 2013
libbluray | branch: master | hpi1 <hpi1 at anonymous.org> | Wed May 8 13:11:12 2013 +0300| [241f5faceb5632ccb19508d073482e917a9ab806] | committer: hpi1
Stop remote (Ixc) threads when stopping xlet. Remote threads run in callee context / thread group.
> http://git.videolan.org/gitweb.cgi/libbluray.git/?a=commit;h=241f5faceb5632ccb19508d073482e917a9ab806
---
.../bdj/java/org/videolan/BDJXletContext.java | 33 ++++++++++++++++++++
.../bdj/java/org/videolan/IxcRegistryImpl.java | 4 +--
2 files changed, 35 insertions(+), 2 deletions(-)
diff --git a/src/libbluray/bdj/java/org/videolan/BDJXletContext.java b/src/libbluray/bdj/java/org/videolan/BDJXletContext.java
index 33e10b1..bccf7fb 100644
--- a/src/libbluray/bdj/java/org/videolan/BDJXletContext.java
+++ b/src/libbluray/bdj/java/org/videolan/BDJXletContext.java
@@ -21,6 +21,7 @@ package org.videolan;
import java.awt.Container;
import java.awt.EventQueue;
+import java.util.LinkedList;
import java.security.AccessController;
import java.security.PrivilegedAction;
@@ -132,6 +133,35 @@ public class BDJXletContext implements javax.tv.xlet.XletContext, javax.microedi
return sceneFactory;
}
+ protected void addIxcThread(Thread thread) {
+ synchronized (ixcThreads) {
+ ixcThreads.addLast(thread);
+ }
+ }
+ protected void removeIxcThread(Thread thread) {
+ synchronized (ixcThreads) {
+ ixcThreads.remove(thread);
+ }
+ }
+ protected void stopIxcThreads() {
+ synchronized (ixcThreads) {
+ while (!ixcThreads.isEmpty()) {
+ Thread thread = (Thread)ixcThreads.removeFirst();
+ logger.info("Stopping remote thread " + thread);
+ thread.interrupt();
+ try {
+ thread.join(500);
+ } catch (Throwable t) {
+ }
+ if (thread.isAlive()) {
+ PortingHelper.stopThread(thread);
+ }
+ if (thread.isAlive()) {
+ logger.error("Error stopping remote thread " + thread);
+ }
+ }
+ }
+ }
public static BDJXletContext getCurrentContext() {
Object obj = AccessController.doPrivileged(
@@ -163,6 +193,8 @@ public class BDJXletContext implements javax.tv.xlet.XletContext, javax.microedi
}
protected void release() {
+ stopIxcThreads();
+
if (sceneFactory != null) {
sceneFactory.dispose();
sceneFactory = null;
@@ -188,5 +220,6 @@ public class BDJXletContext implements javax.tv.xlet.XletContext, javax.microedi
private EventQueue eventQueue = null;
private HSceneFactory sceneFactory = null;
private BDJThreadGroup threadGroup = null;
+ private LinkedList ixcThreads = new LinkedList();
private static final Logger logger = Logger.getLogger(BDJXletContext.class.getName());
}
diff --git a/src/libbluray/bdj/java/org/videolan/IxcRegistryImpl.java b/src/libbluray/bdj/java/org/videolan/IxcRegistryImpl.java
index 5436035..10f0d9c 100644
--- a/src/libbluray/bdj/java/org/videolan/IxcRegistryImpl.java
+++ b/src/libbluray/bdj/java/org/videolan/IxcRegistryImpl.java
@@ -168,11 +168,11 @@ public class IxcRegistryImpl {
Thread remoteThread = new Thread(remoteObj.context.getThreadGroup(), remoteMethod, "Ixc Remote thread " + method);
- /* TODO: track threads so that unfinished threads can be killed when Xlet is terminated */
-
+ remoteMethod.callerContext.addIxcThread(remoteThread);
remoteThread.setDaemon(false);
remoteThread.start();
remoteThread.join();
+ remoteMethod.callerContext.removeIxcThread(remoteThread);
if (!remoteMethod.finished) {
throw new RemoteException("calling xlet destroyed during remote execution");
More information about the libbluray-devel
mailing list