IoScheduler$CachedWorkerPool.smali 9.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327
  1. .class final Lio/reactivex/internal/schedulers/IoScheduler$CachedWorkerPool;
  2. .super Ljava/lang/Object;
  3. .source "IoScheduler.java"
  4. # interfaces
  5. .implements Ljava/lang/Runnable;
  6. # annotations
  7. .annotation system Ldalvik/annotation/EnclosingClass;
  8. value = Lio/reactivex/internal/schedulers/IoScheduler;
  9. .end annotation
  10. .annotation system Ldalvik/annotation/InnerClass;
  11. accessFlags = 0x18
  12. name = "CachedWorkerPool"
  13. .end annotation
  14. # instance fields
  15. .field final allWorkers:Lio/reactivex/disposables/CompositeDisposable;
  16. .field private final evictorService:Ljava/util/concurrent/ScheduledExecutorService;
  17. .field private final evictorTask:Ljava/util/concurrent/Future;
  18. .annotation system Ldalvik/annotation/Signature;
  19. value = {
  20. "Ljava/util/concurrent/Future<",
  21. "*>;"
  22. }
  23. .end annotation
  24. .end field
  25. .field private final expiringWorkerQueue:Ljava/util/concurrent/ConcurrentLinkedQueue;
  26. .annotation system Ldalvik/annotation/Signature;
  27. value = {
  28. "Ljava/util/concurrent/ConcurrentLinkedQueue<",
  29. "Lio/reactivex/internal/schedulers/IoScheduler$ThreadWorker;",
  30. ">;"
  31. }
  32. .end annotation
  33. .end field
  34. .field private final keepAliveTime:J
  35. .field private final threadFactory:Ljava/util/concurrent/ThreadFactory;
  36. # direct methods
  37. .method constructor <init>(JLjava/util/concurrent/TimeUnit;Ljava/util/concurrent/ThreadFactory;)V
  38. .locals 7
  39. .line 70
  40. invoke-direct {p0}, Ljava/lang/Object;-><init>()V
  41. if-eqz p3, :cond_0
  42. .line 71
  43. invoke-virtual {p3, p1, p2}, Ljava/util/concurrent/TimeUnit;->toNanos(J)J
  44. move-result-wide p1
  45. goto :goto_0
  46. :cond_0
  47. const-wide/16 p1, 0x0
  48. :goto_0
  49. iput-wide p1, p0, Lio/reactivex/internal/schedulers/IoScheduler$CachedWorkerPool;->keepAliveTime:J
  50. .line 72
  51. new-instance p1, Ljava/util/concurrent/ConcurrentLinkedQueue;
  52. invoke-direct {p1}, Ljava/util/concurrent/ConcurrentLinkedQueue;-><init>()V
  53. iput-object p1, p0, Lio/reactivex/internal/schedulers/IoScheduler$CachedWorkerPool;->expiringWorkerQueue:Ljava/util/concurrent/ConcurrentLinkedQueue;
  54. .line 73
  55. new-instance p1, Lio/reactivex/disposables/CompositeDisposable;
  56. invoke-direct {p1}, Lio/reactivex/disposables/CompositeDisposable;-><init>()V
  57. iput-object p1, p0, Lio/reactivex/internal/schedulers/IoScheduler$CachedWorkerPool;->allWorkers:Lio/reactivex/disposables/CompositeDisposable;
  58. .line 74
  59. iput-object p4, p0, Lio/reactivex/internal/schedulers/IoScheduler$CachedWorkerPool;->threadFactory:Ljava/util/concurrent/ThreadFactory;
  60. const/4 p1, 0x0
  61. if-eqz p3, :cond_1
  62. const/4 p1, 0x1
  63. .line 79
  64. sget-object p2, Lio/reactivex/internal/schedulers/IoScheduler;->EVICTOR_THREAD_FACTORY:Lio/reactivex/internal/schedulers/RxThreadFactory;
  65. invoke-static {p1, p2}, Ljava/util/concurrent/Executors;->newScheduledThreadPool(ILjava/util/concurrent/ThreadFactory;)Ljava/util/concurrent/ScheduledExecutorService;
  66. move-result-object p1
  67. .line 80
  68. iget-wide v4, p0, Lio/reactivex/internal/schedulers/IoScheduler$CachedWorkerPool;->keepAliveTime:J
  69. sget-object v6, Ljava/util/concurrent/TimeUnit;->NANOSECONDS:Ljava/util/concurrent/TimeUnit;
  70. move-object v0, p1
  71. move-object v1, p0
  72. move-wide v2, v4
  73. invoke-interface/range {v0 .. v6}, Ljava/util/concurrent/ScheduledExecutorService;->scheduleWithFixedDelay(Ljava/lang/Runnable;JJLjava/util/concurrent/TimeUnit;)Ljava/util/concurrent/ScheduledFuture;
  74. move-result-object p2
  75. goto :goto_1
  76. :cond_1
  77. move-object p2, p1
  78. .line 82
  79. :goto_1
  80. iput-object p1, p0, Lio/reactivex/internal/schedulers/IoScheduler$CachedWorkerPool;->evictorService:Ljava/util/concurrent/ScheduledExecutorService;
  81. .line 83
  82. iput-object p2, p0, Lio/reactivex/internal/schedulers/IoScheduler$CachedWorkerPool;->evictorTask:Ljava/util/concurrent/Future;
  83. return-void
  84. .end method
  85. # virtual methods
  86. .method evictExpiredWorkers()V
  87. .locals 7
  88. .line 116
  89. iget-object v0, p0, Lio/reactivex/internal/schedulers/IoScheduler$CachedWorkerPool;->expiringWorkerQueue:Ljava/util/concurrent/ConcurrentLinkedQueue;
  90. invoke-virtual {v0}, Ljava/util/concurrent/ConcurrentLinkedQueue;->isEmpty()Z
  91. move-result v0
  92. if-nez v0, :cond_1
  93. .line 117
  94. invoke-virtual {p0}, Lio/reactivex/internal/schedulers/IoScheduler$CachedWorkerPool;->now()J
  95. move-result-wide v0
  96. .line 119
  97. iget-object v2, p0, Lio/reactivex/internal/schedulers/IoScheduler$CachedWorkerPool;->expiringWorkerQueue:Ljava/util/concurrent/ConcurrentLinkedQueue;
  98. invoke-virtual {v2}, Ljava/util/concurrent/ConcurrentLinkedQueue;->iterator()Ljava/util/Iterator;
  99. move-result-object v2
  100. :cond_0
  101. :goto_0
  102. invoke-interface {v2}, Ljava/util/Iterator;->hasNext()Z
  103. move-result v3
  104. if-eqz v3, :cond_1
  105. invoke-interface {v2}, Ljava/util/Iterator;->next()Ljava/lang/Object;
  106. move-result-object v3
  107. check-cast v3, Lio/reactivex/internal/schedulers/IoScheduler$ThreadWorker;
  108. .line 120
  109. invoke-virtual {v3}, Lio/reactivex/internal/schedulers/IoScheduler$ThreadWorker;->getExpirationTime()J
  110. move-result-wide v4
  111. cmp-long v6, v4, v0
  112. if-gtz v6, :cond_1
  113. .line 121
  114. iget-object v4, p0, Lio/reactivex/internal/schedulers/IoScheduler$CachedWorkerPool;->expiringWorkerQueue:Ljava/util/concurrent/ConcurrentLinkedQueue;
  115. invoke-virtual {v4, v3}, Ljava/util/concurrent/ConcurrentLinkedQueue;->remove(Ljava/lang/Object;)Z
  116. move-result v4
  117. if-eqz v4, :cond_0
  118. .line 122
  119. iget-object v4, p0, Lio/reactivex/internal/schedulers/IoScheduler$CachedWorkerPool;->allWorkers:Lio/reactivex/disposables/CompositeDisposable;
  120. invoke-virtual {v4, v3}, Lio/reactivex/disposables/CompositeDisposable;->remove(Lio/reactivex/disposables/Disposable;)Z
  121. goto :goto_0
  122. :cond_1
  123. return-void
  124. .end method
  125. .method get()Lio/reactivex/internal/schedulers/IoScheduler$ThreadWorker;
  126. .locals 2
  127. .line 92
  128. iget-object v0, p0, Lio/reactivex/internal/schedulers/IoScheduler$CachedWorkerPool;->allWorkers:Lio/reactivex/disposables/CompositeDisposable;
  129. invoke-virtual {v0}, Lio/reactivex/disposables/CompositeDisposable;->isDisposed()Z
  130. move-result v0
  131. if-eqz v0, :cond_0
  132. .line 93
  133. sget-object v0, Lio/reactivex/internal/schedulers/IoScheduler;->SHUTDOWN_THREAD_WORKER:Lio/reactivex/internal/schedulers/IoScheduler$ThreadWorker;
  134. return-object v0
  135. .line 95
  136. :cond_0
  137. iget-object v0, p0, Lio/reactivex/internal/schedulers/IoScheduler$CachedWorkerPool;->expiringWorkerQueue:Ljava/util/concurrent/ConcurrentLinkedQueue;
  138. invoke-virtual {v0}, Ljava/util/concurrent/ConcurrentLinkedQueue;->isEmpty()Z
  139. move-result v0
  140. if-nez v0, :cond_1
  141. .line 96
  142. iget-object v0, p0, Lio/reactivex/internal/schedulers/IoScheduler$CachedWorkerPool;->expiringWorkerQueue:Ljava/util/concurrent/ConcurrentLinkedQueue;
  143. invoke-virtual {v0}, Ljava/util/concurrent/ConcurrentLinkedQueue;->poll()Ljava/lang/Object;
  144. move-result-object v0
  145. check-cast v0, Lio/reactivex/internal/schedulers/IoScheduler$ThreadWorker;
  146. if-eqz v0, :cond_0
  147. return-object v0
  148. .line 103
  149. :cond_1
  150. new-instance v0, Lio/reactivex/internal/schedulers/IoScheduler$ThreadWorker;
  151. iget-object v1, p0, Lio/reactivex/internal/schedulers/IoScheduler$CachedWorkerPool;->threadFactory:Ljava/util/concurrent/ThreadFactory;
  152. invoke-direct {v0, v1}, Lio/reactivex/internal/schedulers/IoScheduler$ThreadWorker;-><init>(Ljava/util/concurrent/ThreadFactory;)V
  153. .line 104
  154. iget-object v1, p0, Lio/reactivex/internal/schedulers/IoScheduler$CachedWorkerPool;->allWorkers:Lio/reactivex/disposables/CompositeDisposable;
  155. invoke-virtual {v1, v0}, Lio/reactivex/disposables/CompositeDisposable;->add(Lio/reactivex/disposables/Disposable;)Z
  156. return-object v0
  157. .end method
  158. .method now()J
  159. .locals 2
  160. .line 134
  161. invoke-static {}, Ljava/lang/System;->nanoTime()J
  162. move-result-wide v0
  163. return-wide v0
  164. .end method
  165. .method release(Lio/reactivex/internal/schedulers/IoScheduler$ThreadWorker;)V
  166. .locals 4
  167. .line 110
  168. invoke-virtual {p0}, Lio/reactivex/internal/schedulers/IoScheduler$CachedWorkerPool;->now()J
  169. move-result-wide v0
  170. iget-wide v2, p0, Lio/reactivex/internal/schedulers/IoScheduler$CachedWorkerPool;->keepAliveTime:J
  171. add-long/2addr v0, v2
  172. invoke-virtual {p1, v0, v1}, Lio/reactivex/internal/schedulers/IoScheduler$ThreadWorker;->setExpirationTime(J)V
  173. .line 112
  174. iget-object v0, p0, Lio/reactivex/internal/schedulers/IoScheduler$CachedWorkerPool;->expiringWorkerQueue:Ljava/util/concurrent/ConcurrentLinkedQueue;
  175. invoke-virtual {v0, p1}, Ljava/util/concurrent/ConcurrentLinkedQueue;->offer(Ljava/lang/Object;)Z
  176. return-void
  177. .end method
  178. .method public run()V
  179. .locals 0
  180. .line 88
  181. invoke-virtual {p0}, Lio/reactivex/internal/schedulers/IoScheduler$CachedWorkerPool;->evictExpiredWorkers()V
  182. return-void
  183. .end method
  184. .method shutdown()V
  185. .locals 2
  186. .line 138
  187. iget-object v0, p0, Lio/reactivex/internal/schedulers/IoScheduler$CachedWorkerPool;->allWorkers:Lio/reactivex/disposables/CompositeDisposable;
  188. invoke-virtual {v0}, Lio/reactivex/disposables/CompositeDisposable;->dispose()V
  189. .line 139
  190. iget-object v0, p0, Lio/reactivex/internal/schedulers/IoScheduler$CachedWorkerPool;->evictorTask:Ljava/util/concurrent/Future;
  191. if-eqz v0, :cond_0
  192. const/4 v1, 0x1
  193. .line 140
  194. invoke-interface {v0, v1}, Ljava/util/concurrent/Future;->cancel(Z)Z
  195. .line 142
  196. :cond_0
  197. iget-object v0, p0, Lio/reactivex/internal/schedulers/IoScheduler$CachedWorkerPool;->evictorService:Ljava/util/concurrent/ScheduledExecutorService;
  198. if-eqz v0, :cond_1
  199. .line 143
  200. invoke-interface {v0}, Ljava/util/concurrent/ScheduledExecutorService;->shutdownNow()Ljava/util/List;
  201. :cond_1
  202. return-void
  203. .end method