FullArbiter.smali 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530
  1. .class public final Lio/reactivex/internal/subscriptions/FullArbiter;
  2. .super Lio/reactivex/internal/subscriptions/FullArbiterPad2;
  3. .source "FullArbiter.java"
  4. # interfaces
  5. .implements Lorg/reactivestreams/Subscription;
  6. # annotations
  7. .annotation system Ldalvik/annotation/Signature;
  8. value = {
  9. "<T:",
  10. "Ljava/lang/Object;",
  11. ">",
  12. "Lio/reactivex/internal/subscriptions/FullArbiterPad2;",
  13. "Lorg/reactivestreams/Subscription;"
  14. }
  15. .end annotation
  16. # static fields
  17. .field static final INITIAL:Lorg/reactivestreams/Subscription;
  18. .field static final REQUEST:Ljava/lang/Object;
  19. # instance fields
  20. .field final actual:Lorg/reactivestreams/Subscriber;
  21. .annotation system Ldalvik/annotation/Signature;
  22. value = {
  23. "Lorg/reactivestreams/Subscriber<",
  24. "-TT;>;"
  25. }
  26. .end annotation
  27. .end field
  28. .field volatile cancelled:Z
  29. .field final queue:Lio/reactivex/internal/queue/SpscLinkedArrayQueue;
  30. .annotation system Ldalvik/annotation/Signature;
  31. value = {
  32. "Lio/reactivex/internal/queue/SpscLinkedArrayQueue<",
  33. "Ljava/lang/Object;",
  34. ">;"
  35. }
  36. .end annotation
  37. .end field
  38. .field requested:J
  39. .field resource:Lio/reactivex/disposables/Disposable;
  40. .field volatile s:Lorg/reactivestreams/Subscription;
  41. # direct methods
  42. .method static constructor <clinit>()V
  43. .locals 1
  44. .line 39
  45. new-instance v0, Lio/reactivex/internal/subscriptions/FullArbiter$1;
  46. invoke-direct {v0}, Lio/reactivex/internal/subscriptions/FullArbiter$1;-><init>()V
  47. sput-object v0, Lio/reactivex/internal/subscriptions/FullArbiter;->INITIAL:Lorg/reactivestreams/Subscription;
  48. .line 55
  49. new-instance v0, Ljava/lang/Object;
  50. invoke-direct {v0}, Ljava/lang/Object;-><init>()V
  51. sput-object v0, Lio/reactivex/internal/subscriptions/FullArbiter;->REQUEST:Ljava/lang/Object;
  52. return-void
  53. .end method
  54. .method public constructor <init>(Lorg/reactivestreams/Subscriber;Lio/reactivex/disposables/Disposable;I)V
  55. .locals 0
  56. .annotation system Ldalvik/annotation/Signature;
  57. value = {
  58. "(",
  59. "Lorg/reactivestreams/Subscriber<",
  60. "-TT;>;",
  61. "Lio/reactivex/disposables/Disposable;",
  62. "I)V"
  63. }
  64. .end annotation
  65. .line 57
  66. invoke-direct {p0}, Lio/reactivex/internal/subscriptions/FullArbiterPad2;-><init>()V
  67. .line 58
  68. iput-object p1, p0, Lio/reactivex/internal/subscriptions/FullArbiter;->actual:Lorg/reactivestreams/Subscriber;
  69. .line 59
  70. iput-object p2, p0, Lio/reactivex/internal/subscriptions/FullArbiter;->resource:Lio/reactivex/disposables/Disposable;
  71. .line 60
  72. new-instance p1, Lio/reactivex/internal/queue/SpscLinkedArrayQueue;
  73. invoke-direct {p1, p3}, Lio/reactivex/internal/queue/SpscLinkedArrayQueue;-><init>(I)V
  74. iput-object p1, p0, Lio/reactivex/internal/subscriptions/FullArbiter;->queue:Lio/reactivex/internal/queue/SpscLinkedArrayQueue;
  75. .line 61
  76. sget-object p1, Lio/reactivex/internal/subscriptions/FullArbiter;->INITIAL:Lorg/reactivestreams/Subscription;
  77. iput-object p1, p0, Lio/reactivex/internal/subscriptions/FullArbiter;->s:Lorg/reactivestreams/Subscription;
  78. return-void
  79. .end method
  80. # virtual methods
  81. .method public cancel()V
  82. .locals 1
  83. .line 75
  84. iget-boolean v0, p0, Lio/reactivex/internal/subscriptions/FullArbiter;->cancelled:Z
  85. if-nez v0, :cond_0
  86. const/4 v0, 0x1
  87. .line 76
  88. iput-boolean v0, p0, Lio/reactivex/internal/subscriptions/FullArbiter;->cancelled:Z
  89. .line 77
  90. invoke-virtual {p0}, Lio/reactivex/internal/subscriptions/FullArbiter;->dispose()V
  91. :cond_0
  92. return-void
  93. .end method
  94. .method dispose()V
  95. .locals 2
  96. .line 82
  97. iget-object v0, p0, Lio/reactivex/internal/subscriptions/FullArbiter;->resource:Lio/reactivex/disposables/Disposable;
  98. const/4 v1, 0x0
  99. .line 83
  100. iput-object v1, p0, Lio/reactivex/internal/subscriptions/FullArbiter;->resource:Lio/reactivex/disposables/Disposable;
  101. if-eqz v0, :cond_0
  102. .line 85
  103. invoke-interface {v0}, Lio/reactivex/disposables/Disposable;->dispose()V
  104. :cond_0
  105. return-void
  106. .end method
  107. .method drain()V
  108. .locals 11
  109. .line 128
  110. iget-object v0, p0, Lio/reactivex/internal/subscriptions/FullArbiter;->wip:Ljava/util/concurrent/atomic/AtomicInteger;
  111. invoke-virtual {v0}, Ljava/util/concurrent/atomic/AtomicInteger;->getAndIncrement()I
  112. move-result v0
  113. if-eqz v0, :cond_0
  114. return-void
  115. .line 134
  116. :cond_0
  117. iget-object v0, p0, Lio/reactivex/internal/subscriptions/FullArbiter;->queue:Lio/reactivex/internal/queue/SpscLinkedArrayQueue;
  118. .line 135
  119. iget-object v1, p0, Lio/reactivex/internal/subscriptions/FullArbiter;->actual:Lorg/reactivestreams/Subscriber;
  120. const/4 v2, 0x1
  121. const/4 v3, 0x1
  122. .line 141
  123. :cond_1
  124. :goto_0
  125. invoke-virtual {v0}, Lio/reactivex/internal/queue/SpscLinkedArrayQueue;->poll()Ljava/lang/Object;
  126. move-result-object v4
  127. if-nez v4, :cond_2
  128. .line 195
  129. iget-object v4, p0, Lio/reactivex/internal/subscriptions/FullArbiter;->wip:Ljava/util/concurrent/atomic/AtomicInteger;
  130. neg-int v3, v3
  131. invoke-virtual {v4, v3}, Ljava/util/concurrent/atomic/AtomicInteger;->addAndGet(I)I
  132. move-result v3
  133. if-nez v3, :cond_1
  134. return-void
  135. .line 145
  136. :cond_2
  137. invoke-virtual {v0}, Lio/reactivex/internal/queue/SpscLinkedArrayQueue;->poll()Ljava/lang/Object;
  138. move-result-object v5
  139. .line 147
  140. sget-object v6, Lio/reactivex/internal/subscriptions/FullArbiter;->REQUEST:Ljava/lang/Object;
  141. const-wide/16 v7, 0x0
  142. if-ne v4, v6, :cond_3
  143. .line 148
  144. iget-object v4, p0, Lio/reactivex/internal/subscriptions/FullArbiter;->missedRequested:Ljava/util/concurrent/atomic/AtomicLong;
  145. invoke-virtual {v4, v7, v8}, Ljava/util/concurrent/atomic/AtomicLong;->getAndSet(J)J
  146. move-result-wide v4
  147. cmp-long v6, v4, v7
  148. if-eqz v6, :cond_1
  149. .line 150
  150. iget-wide v6, p0, Lio/reactivex/internal/subscriptions/FullArbiter;->requested:J
  151. invoke-static {v6, v7, v4, v5}, Lio/reactivex/internal/util/BackpressureHelper;->addCap(JJ)J
  152. move-result-wide v6
  153. iput-wide v6, p0, Lio/reactivex/internal/subscriptions/FullArbiter;->requested:J
  154. .line 151
  155. iget-object v6, p0, Lio/reactivex/internal/subscriptions/FullArbiter;->s:Lorg/reactivestreams/Subscription;
  156. invoke-interface {v6, v4, v5}, Lorg/reactivestreams/Subscription;->request(J)V
  157. goto :goto_0
  158. .line 154
  159. :cond_3
  160. iget-object v6, p0, Lio/reactivex/internal/subscriptions/FullArbiter;->s:Lorg/reactivestreams/Subscription;
  161. if-ne v4, v6, :cond_1
  162. .line 155
  163. invoke-static {v5}, Lio/reactivex/internal/util/NotificationLite;->isSubscription(Ljava/lang/Object;)Z
  164. move-result v4
  165. if-eqz v4, :cond_5
  166. .line 156
  167. invoke-static {v5}, Lio/reactivex/internal/util/NotificationLite;->getSubscription(Ljava/lang/Object;)Lorg/reactivestreams/Subscription;
  168. move-result-object v4
  169. .line 157
  170. iget-boolean v5, p0, Lio/reactivex/internal/subscriptions/FullArbiter;->cancelled:Z
  171. if-nez v5, :cond_4
  172. .line 158
  173. iput-object v4, p0, Lio/reactivex/internal/subscriptions/FullArbiter;->s:Lorg/reactivestreams/Subscription;
  174. .line 159
  175. iget-wide v5, p0, Lio/reactivex/internal/subscriptions/FullArbiter;->requested:J
  176. cmp-long v9, v5, v7
  177. if-eqz v9, :cond_1
  178. .line 161
  179. invoke-interface {v4, v5, v6}, Lorg/reactivestreams/Subscription;->request(J)V
  180. goto :goto_0
  181. .line 164
  182. :cond_4
  183. invoke-interface {v4}, Lorg/reactivestreams/Subscription;->cancel()V
  184. goto :goto_0
  185. .line 166
  186. :cond_5
  187. invoke-static {v5}, Lio/reactivex/internal/util/NotificationLite;->isError(Ljava/lang/Object;)Z
  188. move-result v4
  189. if-eqz v4, :cond_7
  190. .line 167
  191. invoke-virtual {v0}, Lio/reactivex/internal/queue/SpscLinkedArrayQueue;->clear()V
  192. .line 168
  193. invoke-virtual {p0}, Lio/reactivex/internal/subscriptions/FullArbiter;->dispose()V
  194. .line 170
  195. invoke-static {v5}, Lio/reactivex/internal/util/NotificationLite;->getError(Ljava/lang/Object;)Ljava/lang/Throwable;
  196. move-result-object v4
  197. .line 171
  198. iget-boolean v5, p0, Lio/reactivex/internal/subscriptions/FullArbiter;->cancelled:Z
  199. if-nez v5, :cond_6
  200. .line 172
  201. iput-boolean v2, p0, Lio/reactivex/internal/subscriptions/FullArbiter;->cancelled:Z
  202. .line 173
  203. invoke-interface {v1, v4}, Lorg/reactivestreams/Subscriber;->onError(Ljava/lang/Throwable;)V
  204. goto :goto_0
  205. .line 175
  206. :cond_6
  207. invoke-static {v4}, Lio/reactivex/plugins/RxJavaPlugins;->onError(Ljava/lang/Throwable;)V
  208. goto :goto_0
  209. .line 177
  210. :cond_7
  211. invoke-static {v5}, Lio/reactivex/internal/util/NotificationLite;->isComplete(Ljava/lang/Object;)Z
  212. move-result v4
  213. if-eqz v4, :cond_8
  214. .line 178
  215. invoke-virtual {v0}, Lio/reactivex/internal/queue/SpscLinkedArrayQueue;->clear()V
  216. .line 179
  217. invoke-virtual {p0}, Lio/reactivex/internal/subscriptions/FullArbiter;->dispose()V
  218. .line 181
  219. iget-boolean v4, p0, Lio/reactivex/internal/subscriptions/FullArbiter;->cancelled:Z
  220. if-nez v4, :cond_1
  221. .line 182
  222. iput-boolean v2, p0, Lio/reactivex/internal/subscriptions/FullArbiter;->cancelled:Z
  223. .line 183
  224. invoke-interface {v1}, Lorg/reactivestreams/Subscriber;->onComplete()V
  225. goto/16 :goto_0
  226. .line 186
  227. :cond_8
  228. iget-wide v9, p0, Lio/reactivex/internal/subscriptions/FullArbiter;->requested:J
  229. cmp-long v4, v9, v7
  230. if-eqz v4, :cond_1
  231. .line 188
  232. invoke-static {v5}, Lio/reactivex/internal/util/NotificationLite;->getValue(Ljava/lang/Object;)Ljava/lang/Object;
  233. move-result-object v4
  234. invoke-interface {v1, v4}, Lorg/reactivestreams/Subscriber;->onNext(Ljava/lang/Object;)V
  235. const-wide/16 v4, 0x1
  236. sub-long/2addr v9, v4
  237. .line 189
  238. iput-wide v9, p0, Lio/reactivex/internal/subscriptions/FullArbiter;->requested:J
  239. goto/16 :goto_0
  240. .end method
  241. .method public onComplete(Lorg/reactivestreams/Subscription;)V
  242. .locals 2
  243. .line 123
  244. iget-object v0, p0, Lio/reactivex/internal/subscriptions/FullArbiter;->queue:Lio/reactivex/internal/queue/SpscLinkedArrayQueue;
  245. invoke-static {}, Lio/reactivex/internal/util/NotificationLite;->complete()Ljava/lang/Object;
  246. move-result-object v1
  247. invoke-virtual {v0, p1, v1}, Lio/reactivex/internal/queue/SpscLinkedArrayQueue;->offer(Ljava/lang/Object;Ljava/lang/Object;)Z
  248. .line 124
  249. invoke-virtual {p0}, Lio/reactivex/internal/subscriptions/FullArbiter;->drain()V
  250. return-void
  251. .end method
  252. .method public onError(Ljava/lang/Throwable;Lorg/reactivestreams/Subscription;)V
  253. .locals 1
  254. .line 114
  255. iget-boolean v0, p0, Lio/reactivex/internal/subscriptions/FullArbiter;->cancelled:Z
  256. if-eqz v0, :cond_0
  257. .line 115
  258. invoke-static {p1}, Lio/reactivex/plugins/RxJavaPlugins;->onError(Ljava/lang/Throwable;)V
  259. return-void
  260. .line 118
  261. :cond_0
  262. iget-object v0, p0, Lio/reactivex/internal/subscriptions/FullArbiter;->queue:Lio/reactivex/internal/queue/SpscLinkedArrayQueue;
  263. invoke-static {p1}, Lio/reactivex/internal/util/NotificationLite;->error(Ljava/lang/Throwable;)Ljava/lang/Object;
  264. move-result-object p1
  265. invoke-virtual {v0, p2, p1}, Lio/reactivex/internal/queue/SpscLinkedArrayQueue;->offer(Ljava/lang/Object;Ljava/lang/Object;)Z
  266. .line 119
  267. invoke-virtual {p0}, Lio/reactivex/internal/subscriptions/FullArbiter;->drain()V
  268. return-void
  269. .end method
  270. .method public onNext(Ljava/lang/Object;Lorg/reactivestreams/Subscription;)Z
  271. .locals 1
  272. .annotation system Ldalvik/annotation/Signature;
  273. value = {
  274. "(TT;",
  275. "Lorg/reactivestreams/Subscription;",
  276. ")Z"
  277. }
  278. .end annotation
  279. .line 104
  280. iget-boolean v0, p0, Lio/reactivex/internal/subscriptions/FullArbiter;->cancelled:Z
  281. if-eqz v0, :cond_0
  282. const/4 p1, 0x0
  283. return p1
  284. .line 108
  285. :cond_0
  286. iget-object v0, p0, Lio/reactivex/internal/subscriptions/FullArbiter;->queue:Lio/reactivex/internal/queue/SpscLinkedArrayQueue;
  287. invoke-static {p1}, Lio/reactivex/internal/util/NotificationLite;->next(Ljava/lang/Object;)Ljava/lang/Object;
  288. move-result-object p1
  289. invoke-virtual {v0, p2, p1}, Lio/reactivex/internal/queue/SpscLinkedArrayQueue;->offer(Ljava/lang/Object;Ljava/lang/Object;)Z
  290. .line 109
  291. invoke-virtual {p0}, Lio/reactivex/internal/subscriptions/FullArbiter;->drain()V
  292. const/4 p1, 0x1
  293. return p1
  294. .end method
  295. .method public request(J)V
  296. .locals 1
  297. .line 66
  298. invoke-static {p1, p2}, Lio/reactivex/internal/subscriptions/SubscriptionHelper;->validate(J)Z
  299. move-result v0
  300. if-eqz v0, :cond_0
  301. .line 67
  302. iget-object v0, p0, Lio/reactivex/internal/subscriptions/FullArbiter;->missedRequested:Ljava/util/concurrent/atomic/AtomicLong;
  303. invoke-static {v0, p1, p2}, Lio/reactivex/internal/util/BackpressureHelper;->add(Ljava/util/concurrent/atomic/AtomicLong;J)J
  304. .line 68
  305. iget-object p1, p0, Lio/reactivex/internal/subscriptions/FullArbiter;->queue:Lio/reactivex/internal/queue/SpscLinkedArrayQueue;
  306. sget-object p2, Lio/reactivex/internal/subscriptions/FullArbiter;->REQUEST:Ljava/lang/Object;
  307. invoke-virtual {p1, p2, p2}, Lio/reactivex/internal/queue/SpscLinkedArrayQueue;->offer(Ljava/lang/Object;Ljava/lang/Object;)Z
  308. .line 69
  309. invoke-virtual {p0}, Lio/reactivex/internal/subscriptions/FullArbiter;->drain()V
  310. :cond_0
  311. return-void
  312. .end method
  313. .method public setSubscription(Lorg/reactivestreams/Subscription;)Z
  314. .locals 2
  315. .line 90
  316. iget-boolean v0, p0, Lio/reactivex/internal/subscriptions/FullArbiter;->cancelled:Z
  317. if-eqz v0, :cond_1
  318. if-eqz p1, :cond_0
  319. .line 92
  320. invoke-interface {p1}, Lorg/reactivestreams/Subscription;->cancel()V
  321. :cond_0
  322. const/4 p1, 0x0
  323. return p1
  324. :cond_1
  325. const-string v0, "s is null"
  326. .line 97
  327. invoke-static {p1, v0}, Lio/reactivex/internal/functions/ObjectHelper;->requireNonNull(Ljava/lang/Object;Ljava/lang/String;)Ljava/lang/Object;
  328. .line 98
  329. iget-object v0, p0, Lio/reactivex/internal/subscriptions/FullArbiter;->queue:Lio/reactivex/internal/queue/SpscLinkedArrayQueue;
  330. iget-object v1, p0, Lio/reactivex/internal/subscriptions/FullArbiter;->s:Lorg/reactivestreams/Subscription;
  331. invoke-static {p1}, Lio/reactivex/internal/util/NotificationLite;->subscription(Lorg/reactivestreams/Subscription;)Ljava/lang/Object;
  332. move-result-object p1
  333. invoke-virtual {v0, v1, p1}, Lio/reactivex/internal/queue/SpscLinkedArrayQueue;->offer(Ljava/lang/Object;Ljava/lang/Object;)Z
  334. .line 99
  335. invoke-virtual {p0}, Lio/reactivex/internal/subscriptions/FullArbiter;->drain()V
  336. const/4 p1, 0x1
  337. return p1
  338. .end method