|
8 | 8 | import java.util.Set; |
9 | 9 | import java.util.Timer; |
10 | 10 | import java.util.TimerTask; |
| 11 | +import java.util.concurrent.atomic.AtomicBoolean; |
11 | 12 |
|
12 | 13 | import io.ably.lib.http.BasePaginatedQuery; |
13 | 14 | import io.ably.lib.http.Http; |
@@ -95,7 +96,7 @@ public abstract class ChannelBase extends EventEmitter<ChannelEvent, ChannelStat |
95 | 96 | /** |
96 | 97 | * @see #markAsReleased() |
97 | 98 | */ |
98 | | - private boolean released = false; |
| 99 | + private AtomicBoolean released = new AtomicBoolean(false); |
99 | 100 |
|
100 | 101 | @Nullable private final LiveObjectsPlugin liveObjectsPlugin; |
101 | 102 |
|
@@ -330,8 +331,8 @@ public void detach() throws AblyException { |
330 | 331 | /** |
331 | 332 | * Mark channel as released that means we can't perform any operation on this channel anymore |
332 | 333 | */ |
333 | | - public synchronized void markAsReleased() { |
334 | | - released = true; |
| 334 | + public void markAsReleased() { |
| 335 | + released.set(true); |
335 | 336 | } |
336 | 337 |
|
337 | 338 | /** |
@@ -395,7 +396,7 @@ private void sendDetachMessage(CompletionListener listener) throws AblyException |
395 | 396 | } |
396 | 397 |
|
397 | 398 | this.attachResume = false; |
398 | | - if (released) { |
| 399 | + if (released.get()) { |
399 | 400 | setDetached(null); |
400 | 401 | } else { |
401 | 402 | setState(ChannelState.detaching, null); |
@@ -572,7 +573,7 @@ public void run() { |
572 | 573 | } |
573 | 574 |
|
574 | 575 | private void checkChannelIsNotReleased() { |
575 | | - if (released) throw new IllegalStateException("Unable to perform any operation on released channel"); |
| 576 | + if (released.get()) throw new IllegalStateException("Unable to perform any operation on released channel"); |
576 | 577 | } |
577 | 578 |
|
578 | 579 | /** |
@@ -621,17 +622,17 @@ synchronized private void detachWithTimeout(final CompletionListener listener) { |
621 | 622 | final ChannelState originalState = state; |
622 | 623 | Timer currentDetachTimer; |
623 | 624 | try { |
624 | | - currentDetachTimer = new Timer(); |
| 625 | + currentDetachTimer = released.get() ? null : new Timer(); |
625 | 626 | } catch(Throwable t) { |
626 | 627 | /* an exception instancing the timer can arise because the runtime is exiting */ |
627 | 628 | callCompletionListenerError(listener, ErrorInfo.fromThrowable(t)); |
628 | 629 | return; |
629 | 630 | } |
630 | | - attachTimer = released ? null : currentDetachTimer; |
| 631 | + attachTimer = currentDetachTimer; |
631 | 632 |
|
632 | 633 | try { |
633 | 634 | // If channel has been released, completionListener won't be invoked anyway |
634 | | - CompletionListener completionListener = released ? null : new CompletionListener() { |
| 635 | + CompletionListener completionListener = released.get() ? null : new CompletionListener() { |
635 | 636 | @Override |
636 | 637 | public void onSuccess() { |
637 | 638 | clearAttachTimers(); |
|
0 commit comments