123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327 |
- .class final Lio/reactivex/internal/schedulers/IoScheduler$CachedWorkerPool;
- .super Ljava/lang/Object;
- .source "IoScheduler.java"
- # interfaces
- .implements Ljava/lang/Runnable;
- # annotations
- .annotation system Ldalvik/annotation/EnclosingClass;
- value = Lio/reactivex/internal/schedulers/IoScheduler;
- .end annotation
- .annotation system Ldalvik/annotation/InnerClass;
- accessFlags = 0x18
- name = "CachedWorkerPool"
- .end annotation
- # instance fields
- .field final allWorkers:Lio/reactivex/disposables/CompositeDisposable;
- .field private final evictorService:Ljava/util/concurrent/ScheduledExecutorService;
- .field private final evictorTask:Ljava/util/concurrent/Future;
- .annotation system Ldalvik/annotation/Signature;
- value = {
- "Ljava/util/concurrent/Future<",
- "*>;"
- }
- .end annotation
- .end field
- .field private final expiringWorkerQueue:Ljava/util/concurrent/ConcurrentLinkedQueue;
- .annotation system Ldalvik/annotation/Signature;
- value = {
- "Ljava/util/concurrent/ConcurrentLinkedQueue<",
- "Lio/reactivex/internal/schedulers/IoScheduler$ThreadWorker;",
- ">;"
- }
- .end annotation
- .end field
- .field private final keepAliveTime:J
- .field private final threadFactory:Ljava/util/concurrent/ThreadFactory;
- # direct methods
- .method constructor <init>(JLjava/util/concurrent/TimeUnit;Ljava/util/concurrent/ThreadFactory;)V
- .locals 7
- .line 70
- invoke-direct {p0}, Ljava/lang/Object;-><init>()V
- if-eqz p3, :cond_0
- .line 71
- invoke-virtual {p3, p1, p2}, Ljava/util/concurrent/TimeUnit;->toNanos(J)J
- move-result-wide p1
- goto :goto_0
- :cond_0
- const-wide/16 p1, 0x0
- :goto_0
- iput-wide p1, p0, Lio/reactivex/internal/schedulers/IoScheduler$CachedWorkerPool;->keepAliveTime:J
- .line 72
- new-instance p1, Ljava/util/concurrent/ConcurrentLinkedQueue;
- invoke-direct {p1}, Ljava/util/concurrent/ConcurrentLinkedQueue;-><init>()V
- iput-object p1, p0, Lio/reactivex/internal/schedulers/IoScheduler$CachedWorkerPool;->expiringWorkerQueue:Ljava/util/concurrent/ConcurrentLinkedQueue;
- .line 73
- new-instance p1, Lio/reactivex/disposables/CompositeDisposable;
- invoke-direct {p1}, Lio/reactivex/disposables/CompositeDisposable;-><init>()V
- iput-object p1, p0, Lio/reactivex/internal/schedulers/IoScheduler$CachedWorkerPool;->allWorkers:Lio/reactivex/disposables/CompositeDisposable;
- .line 74
- iput-object p4, p0, Lio/reactivex/internal/schedulers/IoScheduler$CachedWorkerPool;->threadFactory:Ljava/util/concurrent/ThreadFactory;
- const/4 p1, 0x0
- if-eqz p3, :cond_1
- const/4 p1, 0x1
- .line 79
- sget-object p2, Lio/reactivex/internal/schedulers/IoScheduler;->EVICTOR_THREAD_FACTORY:Lio/reactivex/internal/schedulers/RxThreadFactory;
- invoke-static {p1, p2}, Ljava/util/concurrent/Executors;->newScheduledThreadPool(ILjava/util/concurrent/ThreadFactory;)Ljava/util/concurrent/ScheduledExecutorService;
- move-result-object p1
- .line 80
- iget-wide v4, p0, Lio/reactivex/internal/schedulers/IoScheduler$CachedWorkerPool;->keepAliveTime:J
- sget-object v6, Ljava/util/concurrent/TimeUnit;->NANOSECONDS:Ljava/util/concurrent/TimeUnit;
- move-object v0, p1
- move-object v1, p0
- move-wide v2, v4
- invoke-interface/range {v0 .. v6}, Ljava/util/concurrent/ScheduledExecutorService;->scheduleWithFixedDelay(Ljava/lang/Runnable;JJLjava/util/concurrent/TimeUnit;)Ljava/util/concurrent/ScheduledFuture;
- move-result-object p2
- goto :goto_1
- :cond_1
- move-object p2, p1
- .line 82
- :goto_1
- iput-object p1, p0, Lio/reactivex/internal/schedulers/IoScheduler$CachedWorkerPool;->evictorService:Ljava/util/concurrent/ScheduledExecutorService;
- .line 83
- iput-object p2, p0, Lio/reactivex/internal/schedulers/IoScheduler$CachedWorkerPool;->evictorTask:Ljava/util/concurrent/Future;
- return-void
- .end method
- # virtual methods
- .method evictExpiredWorkers()V
- .locals 7
- .line 116
- iget-object v0, p0, Lio/reactivex/internal/schedulers/IoScheduler$CachedWorkerPool;->expiringWorkerQueue:Ljava/util/concurrent/ConcurrentLinkedQueue;
- invoke-virtual {v0}, Ljava/util/concurrent/ConcurrentLinkedQueue;->isEmpty()Z
- move-result v0
- if-nez v0, :cond_1
- .line 117
- invoke-virtual {p0}, Lio/reactivex/internal/schedulers/IoScheduler$CachedWorkerPool;->now()J
- move-result-wide v0
- .line 119
- iget-object v2, p0, Lio/reactivex/internal/schedulers/IoScheduler$CachedWorkerPool;->expiringWorkerQueue:Ljava/util/concurrent/ConcurrentLinkedQueue;
- invoke-virtual {v2}, Ljava/util/concurrent/ConcurrentLinkedQueue;->iterator()Ljava/util/Iterator;
- move-result-object v2
- :cond_0
- :goto_0
- invoke-interface {v2}, Ljava/util/Iterator;->hasNext()Z
- move-result v3
- if-eqz v3, :cond_1
- invoke-interface {v2}, Ljava/util/Iterator;->next()Ljava/lang/Object;
- move-result-object v3
- check-cast v3, Lio/reactivex/internal/schedulers/IoScheduler$ThreadWorker;
- .line 120
- invoke-virtual {v3}, Lio/reactivex/internal/schedulers/IoScheduler$ThreadWorker;->getExpirationTime()J
- move-result-wide v4
- cmp-long v6, v4, v0
- if-gtz v6, :cond_1
- .line 121
- iget-object v4, p0, Lio/reactivex/internal/schedulers/IoScheduler$CachedWorkerPool;->expiringWorkerQueue:Ljava/util/concurrent/ConcurrentLinkedQueue;
- invoke-virtual {v4, v3}, Ljava/util/concurrent/ConcurrentLinkedQueue;->remove(Ljava/lang/Object;)Z
- move-result v4
- if-eqz v4, :cond_0
- .line 122
- iget-object v4, p0, Lio/reactivex/internal/schedulers/IoScheduler$CachedWorkerPool;->allWorkers:Lio/reactivex/disposables/CompositeDisposable;
- invoke-virtual {v4, v3}, Lio/reactivex/disposables/CompositeDisposable;->remove(Lio/reactivex/disposables/Disposable;)Z
- goto :goto_0
- :cond_1
- return-void
- .end method
- .method get()Lio/reactivex/internal/schedulers/IoScheduler$ThreadWorker;
- .locals 2
- .line 92
- iget-object v0, p0, Lio/reactivex/internal/schedulers/IoScheduler$CachedWorkerPool;->allWorkers:Lio/reactivex/disposables/CompositeDisposable;
- invoke-virtual {v0}, Lio/reactivex/disposables/CompositeDisposable;->isDisposed()Z
- move-result v0
- if-eqz v0, :cond_0
- .line 93
- sget-object v0, Lio/reactivex/internal/schedulers/IoScheduler;->SHUTDOWN_THREAD_WORKER:Lio/reactivex/internal/schedulers/IoScheduler$ThreadWorker;
- return-object v0
- .line 95
- :cond_0
- iget-object v0, p0, Lio/reactivex/internal/schedulers/IoScheduler$CachedWorkerPool;->expiringWorkerQueue:Ljava/util/concurrent/ConcurrentLinkedQueue;
- invoke-virtual {v0}, Ljava/util/concurrent/ConcurrentLinkedQueue;->isEmpty()Z
- move-result v0
- if-nez v0, :cond_1
- .line 96
- iget-object v0, p0, Lio/reactivex/internal/schedulers/IoScheduler$CachedWorkerPool;->expiringWorkerQueue:Ljava/util/concurrent/ConcurrentLinkedQueue;
- invoke-virtual {v0}, Ljava/util/concurrent/ConcurrentLinkedQueue;->poll()Ljava/lang/Object;
- move-result-object v0
- check-cast v0, Lio/reactivex/internal/schedulers/IoScheduler$ThreadWorker;
- if-eqz v0, :cond_0
- return-object v0
- .line 103
- :cond_1
- new-instance v0, Lio/reactivex/internal/schedulers/IoScheduler$ThreadWorker;
- iget-object v1, p0, Lio/reactivex/internal/schedulers/IoScheduler$CachedWorkerPool;->threadFactory:Ljava/util/concurrent/ThreadFactory;
- invoke-direct {v0, v1}, Lio/reactivex/internal/schedulers/IoScheduler$ThreadWorker;-><init>(Ljava/util/concurrent/ThreadFactory;)V
- .line 104
- iget-object v1, p0, Lio/reactivex/internal/schedulers/IoScheduler$CachedWorkerPool;->allWorkers:Lio/reactivex/disposables/CompositeDisposable;
- invoke-virtual {v1, v0}, Lio/reactivex/disposables/CompositeDisposable;->add(Lio/reactivex/disposables/Disposable;)Z
- return-object v0
- .end method
- .method now()J
- .locals 2
- .line 134
- invoke-static {}, Ljava/lang/System;->nanoTime()J
- move-result-wide v0
- return-wide v0
- .end method
- .method release(Lio/reactivex/internal/schedulers/IoScheduler$ThreadWorker;)V
- .locals 4
- .line 110
- invoke-virtual {p0}, Lio/reactivex/internal/schedulers/IoScheduler$CachedWorkerPool;->now()J
- move-result-wide v0
- iget-wide v2, p0, Lio/reactivex/internal/schedulers/IoScheduler$CachedWorkerPool;->keepAliveTime:J
- add-long/2addr v0, v2
- invoke-virtual {p1, v0, v1}, Lio/reactivex/internal/schedulers/IoScheduler$ThreadWorker;->setExpirationTime(J)V
- .line 112
- iget-object v0, p0, Lio/reactivex/internal/schedulers/IoScheduler$CachedWorkerPool;->expiringWorkerQueue:Ljava/util/concurrent/ConcurrentLinkedQueue;
- invoke-virtual {v0, p1}, Ljava/util/concurrent/ConcurrentLinkedQueue;->offer(Ljava/lang/Object;)Z
- return-void
- .end method
- .method public run()V
- .locals 0
- .line 88
- invoke-virtual {p0}, Lio/reactivex/internal/schedulers/IoScheduler$CachedWorkerPool;->evictExpiredWorkers()V
- return-void
- .end method
- .method shutdown()V
- .locals 2
- .line 138
- iget-object v0, p0, Lio/reactivex/internal/schedulers/IoScheduler$CachedWorkerPool;->allWorkers:Lio/reactivex/disposables/CompositeDisposable;
- invoke-virtual {v0}, Lio/reactivex/disposables/CompositeDisposable;->dispose()V
- .line 139
- iget-object v0, p0, Lio/reactivex/internal/schedulers/IoScheduler$CachedWorkerPool;->evictorTask:Ljava/util/concurrent/Future;
- if-eqz v0, :cond_0
- const/4 v1, 0x1
- .line 140
- invoke-interface {v0, v1}, Ljava/util/concurrent/Future;->cancel(Z)Z
- .line 142
- :cond_0
- iget-object v0, p0, Lio/reactivex/internal/schedulers/IoScheduler$CachedWorkerPool;->evictorService:Ljava/util/concurrent/ScheduledExecutorService;
- if-eqz v0, :cond_1
- .line 143
- invoke-interface {v0}, Ljava/util/concurrent/ScheduledExecutorService;->shutdownNow()Ljava/util/List;
- :cond_1
- return-void
- .end method
|