Mercurial > hg > release > heapstats-2.1
changeset 255:7c3bea2249ab
Bug 3458: Temp directory for ArchiveData is not removed when exiting
Reviewed-by: ykubota
https://github.com/HeapStats/heapstats/pull/125
author | Yasumasa Suenaga <yasuenag@gmail.com> |
---|---|
date | Wed, 01 Nov 2017 13:11:23 +0900 |
parents | b65ab2ba6cd8 |
children | ca86f078eb34 |
files | ChangeLog analyzer/core/src/main/java/jp/co/ntt/oss/heapstats/container/log/ArchiveData.java |
diffstat | 2 files changed, 27 insertions(+), 5 deletions(-) [+] |
line wrap: on
line diff
--- a/ChangeLog Tue Oct 31 16:22:46 2017 +0900 +++ b/ChangeLog Wed Nov 01 13:11:23 2017 +0900 @@ -1,3 +1,7 @@ +2017-11-01 Yasumasa Suenaga <yasuenag@gmail.com> + + * Bug 3458: Temp directory for ArchiveData is not removed when exiting + 2017-10-31 Yasumasa Suenaga <yasuenag@gmail.com> * Bug 3456: Build warnings w/ GCC 7.2.1
--- a/analyzer/core/src/main/java/jp/co/ntt/oss/heapstats/container/log/ArchiveData.java Tue Oct 31 16:22:46 2017 +0900 +++ b/analyzer/core/src/main/java/jp/co/ntt/oss/heapstats/container/log/ArchiveData.java Wed Nov 01 13:11:23 2017 +0900 @@ -111,8 +111,12 @@ private static Set<PhantomRefWrapper> refSet; + private static Thread cleanerThread; + + private static volatile boolean isCleanerTerminated; + private static void cleaner() { - while (true) { + while (!isCleanerTerminated) { try { PhantomRefWrapper ref = (PhantomRefWrapper) refQueue.remove(); ref.clean(); @@ -121,14 +125,29 @@ // Do nothing. } } + + refSet.forEach(PhantomRefWrapper::clean); + } + + public static void sendCleanerTerminateRequest() { + isCleanerTerminated = true; + cleanerThread.interrupt(); + + try { + cleanerThread.join(); + } catch (InterruptedException e) { + e.printStackTrace(); + } } static { refQueue = new ReferenceQueue<>(); refSet = Collections.synchronizedSet(new HashSet<>()); - Thread th = new Thread(ArchiveData::cleaner, "ArchiveData cleaner"); - th.setDaemon(true); - th.start(); + cleanerThread = new Thread(ArchiveData::cleaner, "ArchiveData cleaner"); + cleanerThread.setDaemon(true); + cleanerThread.start(); + + Runtime.getRuntime().addShutdownHook(new Thread(ArchiveData::sendCleanerTerminateRequest)); } /** @@ -140,7 +159,6 @@ public ArchiveData(LogData log) throws IOException{ this(log, null); extractPath = Files.createTempDirectory("heapstats_archive").toFile(); - extractPath.deleteOnExit(); refSet.add(new PhantomRefWrapper(this)); }