[libbluray-devel] BDJ: Improve stopping Ixc threads
hpi1
git at videolan.org
Thu Mar 27 14:58:19 CET 2014
libbluray | branch: master | hpi1 <hpi1 at anonymous.org> | Thu Mar 27 14:35:48 2014 +0200| [c2f0675314247f1aa27c048dad409a394bc36fbe] | committer: hpi1
BDJ: Improve stopping Ixc threads
> http://git.videolan.org/gitweb.cgi/libbluray.git/?a=commit;h=c2f0675314247f1aa27c048dad409a394bc36fbe
---
.../bdj/java/org/videolan/BDJXletContext.java | 53 ++++++++++++++------
1 file changed, 39 insertions(+), 14 deletions(-)
diff --git a/src/libbluray/bdj/java/org/videolan/BDJXletContext.java b/src/libbluray/bdj/java/org/videolan/BDJXletContext.java
index f49378d..e12e350 100644
--- a/src/libbluray/bdj/java/org/videolan/BDJXletContext.java
+++ b/src/libbluray/bdj/java/org/videolan/BDJXletContext.java
@@ -212,23 +212,48 @@ public class BDJXletContext implements javax.tv.xlet.XletContext, javax.microedi
ixcThreads.remove(thread);
}
}
+
+ private static boolean waitThread(Thread thread, int timeout) {
+ long startTime = System.currentTimeMillis();
+ long endTime = startTime + timeout;
+ while (thread.isAlive() && (System.currentTimeMillis() < endTime)) {
+ try {
+ Thread.sleep(10);
+ } catch (InterruptedException e) { }
+ }
+
+ boolean result = !thread.isAlive();
+ if (!result) {
+ logger.error("waitThread timeout: " + thread);
+ }
+ return result;
+ }
+
+ public static void stopThread(Thread thread, int timeout, String type) {
+ if (!waitForShutdown(thread, timeout)) {
+ thread.interrupt();
+ if (!waitForShutdown(thread, 200)) {
+ PortingHelper.stopThread(thread);
+ logger.error("killing " + type + " thread " + t);
+ }
+ }
+ try {
+ thread.join();
+ } catch (Throwable t) { }
+ }
+
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);
+ while (true) {
+ Thread thread;
+ synchronized (ixcThreads) {
+ if (ixcThreads.isEmpty()) {
+ break;
}
+ thread = (Thread)ixcThreads.removeFirst();
}
+ logger.info("Stopping remote thread " + thread);
+ stopThread(thread, 1000, "Ixc");
+ removeIxcThread(thread);
}
}
More information about the libbluray-devel
mailing list