TrampolineScheduler$TrampolineWorker.smali 7.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234
  1. .class final Lio/reactivex/internal/schedulers/TrampolineScheduler$TrampolineWorker;
  2. .super Lio/reactivex/Scheduler$Worker;
  3. .source "TrampolineScheduler.java"
  4. # interfaces
  5. .implements Lio/reactivex/disposables/Disposable;
  6. # annotations
  7. .annotation system Ldalvik/annotation/EnclosingClass;
  8. value = Lio/reactivex/internal/schedulers/TrampolineScheduler;
  9. .end annotation
  10. .annotation system Ldalvik/annotation/InnerClass;
  11. accessFlags = 0x18
  12. name = "TrampolineWorker"
  13. .end annotation
  14. # instance fields
  15. .field final counter:Ljava/util/concurrent/atomic/AtomicInteger;
  16. .field volatile disposed:Z
  17. .field final queue:Ljava/util/concurrent/PriorityBlockingQueue;
  18. .annotation system Ldalvik/annotation/Signature;
  19. value = {
  20. "Ljava/util/concurrent/PriorityBlockingQueue<",
  21. "Lio/reactivex/internal/schedulers/TrampolineScheduler$TimedRunnable;",
  22. ">;"
  23. }
  24. .end annotation
  25. .end field
  26. .field private final wip:Ljava/util/concurrent/atomic/AtomicInteger;
  27. # direct methods
  28. .method constructor <init>()V
  29. .locals 1
  30. .line 65
  31. invoke-direct {p0}, Lio/reactivex/Scheduler$Worker;-><init>()V
  32. .line 66
  33. new-instance v0, Ljava/util/concurrent/PriorityBlockingQueue;
  34. invoke-direct {v0}, Ljava/util/concurrent/PriorityBlockingQueue;-><init>()V
  35. iput-object v0, p0, Lio/reactivex/internal/schedulers/TrampolineScheduler$TrampolineWorker;->queue:Ljava/util/concurrent/PriorityBlockingQueue;
  36. .line 68
  37. new-instance v0, Ljava/util/concurrent/atomic/AtomicInteger;
  38. invoke-direct {v0}, Ljava/util/concurrent/atomic/AtomicInteger;-><init>()V
  39. iput-object v0, p0, Lio/reactivex/internal/schedulers/TrampolineScheduler$TrampolineWorker;->wip:Ljava/util/concurrent/atomic/AtomicInteger;
  40. .line 70
  41. new-instance v0, Ljava/util/concurrent/atomic/AtomicInteger;
  42. invoke-direct {v0}, Ljava/util/concurrent/atomic/AtomicInteger;-><init>()V
  43. iput-object v0, p0, Lio/reactivex/internal/schedulers/TrampolineScheduler$TrampolineWorker;->counter:Ljava/util/concurrent/atomic/AtomicInteger;
  44. return-void
  45. .end method
  46. # virtual methods
  47. .method public dispose()V
  48. .locals 1
  49. const/4 v0, 0x1
  50. .line 126
  51. iput-boolean v0, p0, Lio/reactivex/internal/schedulers/TrampolineScheduler$TrampolineWorker;->disposed:Z
  52. return-void
  53. .end method
  54. .method enqueue(Ljava/lang/Runnable;J)Lio/reactivex/disposables/Disposable;
  55. .locals 1
  56. .line 87
  57. iget-boolean v0, p0, Lio/reactivex/internal/schedulers/TrampolineScheduler$TrampolineWorker;->disposed:Z
  58. if-eqz v0, :cond_0
  59. .line 88
  60. sget-object p1, Lio/reactivex/internal/disposables/EmptyDisposable;->INSTANCE:Lio/reactivex/internal/disposables/EmptyDisposable;
  61. return-object p1
  62. .line 90
  63. :cond_0
  64. new-instance v0, Lio/reactivex/internal/schedulers/TrampolineScheduler$TimedRunnable;
  65. invoke-static {p2, p3}, Ljava/lang/Long;->valueOf(J)Ljava/lang/Long;
  66. move-result-object p2
  67. iget-object p3, p0, Lio/reactivex/internal/schedulers/TrampolineScheduler$TrampolineWorker;->counter:Ljava/util/concurrent/atomic/AtomicInteger;
  68. invoke-virtual {p3}, Ljava/util/concurrent/atomic/AtomicInteger;->incrementAndGet()I
  69. move-result p3
  70. invoke-direct {v0, p1, p2, p3}, Lio/reactivex/internal/schedulers/TrampolineScheduler$TimedRunnable;-><init>(Ljava/lang/Runnable;Ljava/lang/Long;I)V
  71. .line 91
  72. iget-object p1, p0, Lio/reactivex/internal/schedulers/TrampolineScheduler$TrampolineWorker;->queue:Ljava/util/concurrent/PriorityBlockingQueue;
  73. invoke-virtual {p1, v0}, Ljava/util/concurrent/PriorityBlockingQueue;->add(Ljava/lang/Object;)Z
  74. .line 93
  75. iget-object p1, p0, Lio/reactivex/internal/schedulers/TrampolineScheduler$TrampolineWorker;->wip:Ljava/util/concurrent/atomic/AtomicInteger;
  76. invoke-virtual {p1}, Ljava/util/concurrent/atomic/AtomicInteger;->getAndIncrement()I
  77. move-result p1
  78. if-nez p1, :cond_3
  79. const/4 p1, 0x1
  80. .line 97
  81. :cond_1
  82. :goto_0
  83. iget-object p2, p0, Lio/reactivex/internal/schedulers/TrampolineScheduler$TrampolineWorker;->queue:Ljava/util/concurrent/PriorityBlockingQueue;
  84. invoke-virtual {p2}, Ljava/util/concurrent/PriorityBlockingQueue;->poll()Ljava/lang/Object;
  85. move-result-object p2
  86. check-cast p2, Lio/reactivex/internal/schedulers/TrampolineScheduler$TimedRunnable;
  87. if-nez p2, :cond_2
  88. .line 105
  89. iget-object p2, p0, Lio/reactivex/internal/schedulers/TrampolineScheduler$TrampolineWorker;->wip:Ljava/util/concurrent/atomic/AtomicInteger;
  90. neg-int p1, p1
  91. invoke-virtual {p2, p1}, Ljava/util/concurrent/atomic/AtomicInteger;->addAndGet(I)I
  92. move-result p1
  93. if-nez p1, :cond_1
  94. .line 111
  95. sget-object p1, Lio/reactivex/internal/disposables/EmptyDisposable;->INSTANCE:Lio/reactivex/internal/disposables/EmptyDisposable;
  96. return-object p1
  97. .line 101
  98. :cond_2
  99. iget-boolean p3, p2, Lio/reactivex/internal/schedulers/TrampolineScheduler$TimedRunnable;->disposed:Z
  100. if-nez p3, :cond_1
  101. .line 102
  102. iget-object p2, p2, Lio/reactivex/internal/schedulers/TrampolineScheduler$TimedRunnable;->run:Ljava/lang/Runnable;
  103. invoke-interface {p2}, Ljava/lang/Runnable;->run()V
  104. goto :goto_0
  105. .line 114
  106. :cond_3
  107. new-instance p1, Lio/reactivex/internal/schedulers/TrampolineScheduler$TrampolineWorker$1;
  108. invoke-direct {p1, p0, v0}, Lio/reactivex/internal/schedulers/TrampolineScheduler$TrampolineWorker$1;-><init>(Lio/reactivex/internal/schedulers/TrampolineScheduler$TrampolineWorker;Lio/reactivex/internal/schedulers/TrampolineScheduler$TimedRunnable;)V
  109. invoke-static {p1}, Lio/reactivex/disposables/Disposables;->fromRunnable(Ljava/lang/Runnable;)Lio/reactivex/disposables/Disposable;
  110. move-result-object p1
  111. return-object p1
  112. .end method
  113. .method public isDisposed()Z
  114. .locals 1
  115. .line 131
  116. iget-boolean v0, p0, Lio/reactivex/internal/schedulers/TrampolineScheduler$TrampolineWorker;->disposed:Z
  117. return v0
  118. .end method
  119. .method public schedule(Ljava/lang/Runnable;)Lio/reactivex/disposables/Disposable;
  120. .locals 2
  121. .line 76
  122. sget-object v0, Ljava/util/concurrent/TimeUnit;->MILLISECONDS:Ljava/util/concurrent/TimeUnit;
  123. invoke-virtual {p0, v0}, Lio/reactivex/internal/schedulers/TrampolineScheduler$TrampolineWorker;->now(Ljava/util/concurrent/TimeUnit;)J
  124. move-result-wide v0
  125. invoke-virtual {p0, p1, v0, v1}, Lio/reactivex/internal/schedulers/TrampolineScheduler$TrampolineWorker;->enqueue(Ljava/lang/Runnable;J)Lio/reactivex/disposables/Disposable;
  126. move-result-object p1
  127. return-object p1
  128. .end method
  129. .method public schedule(Ljava/lang/Runnable;JLjava/util/concurrent/TimeUnit;)Lio/reactivex/disposables/Disposable;
  130. .locals 2
  131. .line 81
  132. sget-object v0, Ljava/util/concurrent/TimeUnit;->MILLISECONDS:Ljava/util/concurrent/TimeUnit;
  133. invoke-virtual {p0, v0}, Lio/reactivex/internal/schedulers/TrampolineScheduler$TrampolineWorker;->now(Ljava/util/concurrent/TimeUnit;)J
  134. move-result-wide v0
  135. invoke-virtual {p4, p2, p3}, Ljava/util/concurrent/TimeUnit;->toMillis(J)J
  136. move-result-wide p2
  137. add-long/2addr v0, p2
  138. .line 83
  139. new-instance p2, Lio/reactivex/internal/schedulers/TrampolineScheduler$SleepingRunnable;
  140. invoke-direct {p2, p1, p0, v0, v1}, Lio/reactivex/internal/schedulers/TrampolineScheduler$SleepingRunnable;-><init>(Ljava/lang/Runnable;Lio/reactivex/internal/schedulers/TrampolineScheduler$TrampolineWorker;J)V
  141. invoke-virtual {p0, p2, v0, v1}, Lio/reactivex/internal/schedulers/TrampolineScheduler$TrampolineWorker;->enqueue(Ljava/lang/Runnable;J)Lio/reactivex/disposables/Disposable;
  142. move-result-object p1
  143. return-object p1
  144. .end method