Rietveld Code Review Tool
Help | Bug tracker | Discussion group | Source code

Side by Side Diff: src/com/github/rjeschke/neetutils/dispose/Disposer.java

Issue 5698450620416000: Replaced the Disposer (Closed)
Patch Set: Created April 30, 2014, 11:17 a.m.
Left:
Right:
Use n/p to move between diff chunks; N/P to move between comments.
Jump to:
View unified diff | Download patch
OLDNEW
(Empty)
1 /*
2 * Copyright (C) 2012 René Jeschke <rene_jeschke@yahoo.de>
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16 package com.github.rjeschke.neetutils.dispose;
17
18 import java.lang.ref.ReferenceQueue;
19 import java.lang.ref.WeakReference;
20
21 import com.github.rjeschke.neetutils.dispose.ReferenceList.Node;
22
23 /**
24 *
25 * @author René Jeschke (rene_jeschke@yahoo.de)
26 *
27 */
28 public class Disposer extends WeakReference<Disposable>
29 {
30 private final Disposable disposable;
31 private final Node<Disposer> disposer;
32 private volatile boolean disposed = false;
33 final static ReferenceQueue<Disposable> refQueue;
34 final static ReferenceList<Disposer> disposers;
35
36 static
37 {
38 refQueue = new ReferenceQueue<Disposable>();
39 disposers = new ReferenceList<Disposer>();
40
41 final Thread thread = new Thread(new Cleaner());
42 thread.setName("neetutils-Disposer");
43 thread.setDaemon(true);
44 thread.start();
45 }
46
47 public Disposer(final Disposable referent, final Disposable disposable)
48 {
49 super(referent, refQueue);
50 this.disposable = disposable;
51 synchronized (disposers)
52 {
53 this.disposer = disposers.add(this);
54 }
55 }
56
57 public void dispose()
58 {
59 if (!this.disposed)
60 {
61 synchronized (disposers)
62 {
63 disposers.remove(this.disposer);
64 }
65 this.disposed = true;
66 this.disposable.dispose();
67 }
68 }
69
70 public boolean isDisposed()
71 {
72 return this.disposed;
73 }
74
75 private static final class Cleaner implements Runnable
76 {
77 public Cleaner()
78 {
79 // empty
80 }
81
82 @Override
83 public void run()
84 {
85 final ReferenceQueue<Disposable> refQueue = Disposer.refQueue;
86 for (;;)
87 {
88 try
89 {
90 ((Disposer)refQueue.remove()).dispose();
91 }
92 catch (final Throwable t)
93 {
94 //
95 }
96 }
97 }
98 }
99 }
OLDNEW

Powered by Google App Engine
This is Rietveld