SpscLinkedArrayQueue.smali 26 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971
  1. .class public final Lio/reactivex/internal/queue/SpscLinkedArrayQueue;
  2. .super Ljava/lang/Object;
  3. .source "SpscLinkedArrayQueue.java"
  4. # interfaces
  5. .implements Lio/reactivex/internal/fuseable/SimplePlainQueue;
  6. # annotations
  7. .annotation system Ldalvik/annotation/Signature;
  8. value = {
  9. "<T:",
  10. "Ljava/lang/Object;",
  11. ">",
  12. "Ljava/lang/Object;",
  13. "Lio/reactivex/internal/fuseable/SimplePlainQueue<",
  14. "TT;>;"
  15. }
  16. .end annotation
  17. # static fields
  18. .field private static final HAS_NEXT:Ljava/lang/Object;
  19. .field static final MAX_LOOK_AHEAD_STEP:I
  20. # instance fields
  21. .field consumerBuffer:Ljava/util/concurrent/atomic/AtomicReferenceArray;
  22. .annotation system Ldalvik/annotation/Signature;
  23. value = {
  24. "Ljava/util/concurrent/atomic/AtomicReferenceArray<",
  25. "Ljava/lang/Object;",
  26. ">;"
  27. }
  28. .end annotation
  29. .end field
  30. .field final consumerIndex:Ljava/util/concurrent/atomic/AtomicLong;
  31. .field final consumerMask:I
  32. .field producerBuffer:Ljava/util/concurrent/atomic/AtomicReferenceArray;
  33. .annotation system Ldalvik/annotation/Signature;
  34. value = {
  35. "Ljava/util/concurrent/atomic/AtomicReferenceArray<",
  36. "Ljava/lang/Object;",
  37. ">;"
  38. }
  39. .end annotation
  40. .end field
  41. .field final producerIndex:Ljava/util/concurrent/atomic/AtomicLong;
  42. .field producerLookAhead:J
  43. .field producerLookAheadStep:I
  44. .field final producerMask:I
  45. # direct methods
  46. .method static constructor <clinit>()V
  47. .locals 2
  48. const-string v0, "jctools.spsc.max.lookahead.step"
  49. const/16 v1, 0x1000
  50. .line 32
  51. invoke-static {v0, v1}, Ljava/lang/Integer;->getInteger(Ljava/lang/String;I)Ljava/lang/Integer;
  52. move-result-object v0
  53. invoke-virtual {v0}, Ljava/lang/Integer;->intValue()I
  54. move-result v0
  55. sput v0, Lio/reactivex/internal/queue/SpscLinkedArrayQueue;->MAX_LOOK_AHEAD_STEP:I
  56. .line 45
  57. new-instance v0, Ljava/lang/Object;
  58. invoke-direct {v0}, Ljava/lang/Object;-><init>()V
  59. sput-object v0, Lio/reactivex/internal/queue/SpscLinkedArrayQueue;->HAS_NEXT:Ljava/lang/Object;
  60. return-void
  61. .end method
  62. .method public constructor <init>(I)V
  63. .locals 3
  64. .line 47
  65. invoke-direct {p0}, Ljava/lang/Object;-><init>()V
  66. .line 33
  67. new-instance v0, Ljava/util/concurrent/atomic/AtomicLong;
  68. invoke-direct {v0}, Ljava/util/concurrent/atomic/AtomicLong;-><init>()V
  69. iput-object v0, p0, Lio/reactivex/internal/queue/SpscLinkedArrayQueue;->producerIndex:Ljava/util/concurrent/atomic/AtomicLong;
  70. .line 43
  71. new-instance v0, Ljava/util/concurrent/atomic/AtomicLong;
  72. invoke-direct {v0}, Ljava/util/concurrent/atomic/AtomicLong;-><init>()V
  73. iput-object v0, p0, Lio/reactivex/internal/queue/SpscLinkedArrayQueue;->consumerIndex:Ljava/util/concurrent/atomic/AtomicLong;
  74. const/16 v0, 0x8
  75. .line 48
  76. invoke-static {v0, p1}, Ljava/lang/Math;->max(II)I
  77. move-result p1
  78. invoke-static {p1}, Lio/reactivex/internal/util/Pow2;->roundToPowerOfTwo(I)I
  79. move-result p1
  80. add-int/lit8 v0, p1, -0x1
  81. .line 50
  82. new-instance v1, Ljava/util/concurrent/atomic/AtomicReferenceArray;
  83. add-int/lit8 v2, p1, 0x1
  84. invoke-direct {v1, v2}, Ljava/util/concurrent/atomic/AtomicReferenceArray;-><init>(I)V
  85. .line 51
  86. iput-object v1, p0, Lio/reactivex/internal/queue/SpscLinkedArrayQueue;->producerBuffer:Ljava/util/concurrent/atomic/AtomicReferenceArray;
  87. .line 52
  88. iput v0, p0, Lio/reactivex/internal/queue/SpscLinkedArrayQueue;->producerMask:I
  89. .line 53
  90. invoke-direct {p0, p1}, Lio/reactivex/internal/queue/SpscLinkedArrayQueue;->adjustLookAheadStep(I)V
  91. .line 54
  92. iput-object v1, p0, Lio/reactivex/internal/queue/SpscLinkedArrayQueue;->consumerBuffer:Ljava/util/concurrent/atomic/AtomicReferenceArray;
  93. .line 55
  94. iput v0, p0, Lio/reactivex/internal/queue/SpscLinkedArrayQueue;->consumerMask:I
  95. add-int/lit8 v0, v0, -0x1
  96. int-to-long v0, v0
  97. .line 56
  98. iput-wide v0, p0, Lio/reactivex/internal/queue/SpscLinkedArrayQueue;->producerLookAhead:J
  99. const-wide/16 v0, 0x0
  100. .line 57
  101. invoke-direct {p0, v0, v1}, Lio/reactivex/internal/queue/SpscLinkedArrayQueue;->soProducerIndex(J)V
  102. return-void
  103. .end method
  104. .method private adjustLookAheadStep(I)V
  105. .locals 1
  106. .line 206
  107. div-int/lit8 p1, p1, 0x4
  108. sget v0, Lio/reactivex/internal/queue/SpscLinkedArrayQueue;->MAX_LOOK_AHEAD_STEP:I
  109. invoke-static {p1, v0}, Ljava/lang/Math;->min(II)I
  110. move-result p1
  111. iput p1, p0, Lio/reactivex/internal/queue/SpscLinkedArrayQueue;->producerLookAheadStep:I
  112. return-void
  113. .end method
  114. .method private static calcDirectOffset(I)I
  115. .locals 0
  116. return p0
  117. .end method
  118. .method private static calcWrappedOffset(JI)I
  119. .locals 0
  120. long-to-int p1, p0
  121. and-int p0, p1, p2
  122. .line 234
  123. invoke-static {p0}, Lio/reactivex/internal/queue/SpscLinkedArrayQueue;->calcDirectOffset(I)I
  124. move-result p0
  125. return p0
  126. .end method
  127. .method private lpConsumerIndex()J
  128. .locals 2
  129. .line 222
  130. iget-object v0, p0, Lio/reactivex/internal/queue/SpscLinkedArrayQueue;->consumerIndex:Ljava/util/concurrent/atomic/AtomicLong;
  131. invoke-virtual {v0}, Ljava/util/concurrent/atomic/AtomicLong;->get()J
  132. move-result-wide v0
  133. return-wide v0
  134. .end method
  135. .method private lpProducerIndex()J
  136. .locals 2
  137. .line 218
  138. iget-object v0, p0, Lio/reactivex/internal/queue/SpscLinkedArrayQueue;->producerIndex:Ljava/util/concurrent/atomic/AtomicLong;
  139. invoke-virtual {v0}, Ljava/util/concurrent/atomic/AtomicLong;->get()J
  140. move-result-wide v0
  141. return-wide v0
  142. .end method
  143. .method private lvConsumerIndex()J
  144. .locals 2
  145. .line 214
  146. iget-object v0, p0, Lio/reactivex/internal/queue/SpscLinkedArrayQueue;->consumerIndex:Ljava/util/concurrent/atomic/AtomicLong;
  147. invoke-virtual {v0}, Ljava/util/concurrent/atomic/AtomicLong;->get()J
  148. move-result-wide v0
  149. return-wide v0
  150. .end method
  151. .method private static lvElement(Ljava/util/concurrent/atomic/AtomicReferenceArray;I)Ljava/lang/Object;
  152. .locals 0
  153. .annotation system Ldalvik/annotation/Signature;
  154. value = {
  155. "<E:",
  156. "Ljava/lang/Object;",
  157. ">(",
  158. "Ljava/util/concurrent/atomic/AtomicReferenceArray<",
  159. "Ljava/lang/Object;",
  160. ">;I)",
  161. "Ljava/lang/Object;"
  162. }
  163. .end annotation
  164. .line 244
  165. invoke-virtual {p0, p1}, Ljava/util/concurrent/atomic/AtomicReferenceArray;->get(I)Ljava/lang/Object;
  166. move-result-object p0
  167. return-object p0
  168. .end method
  169. .method private lvNext(Ljava/util/concurrent/atomic/AtomicReferenceArray;)Ljava/util/concurrent/atomic/AtomicReferenceArray;
  170. .locals 1
  171. .annotation system Ldalvik/annotation/Signature;
  172. value = {
  173. "(",
  174. "Ljava/util/concurrent/atomic/AtomicReferenceArray<",
  175. "Ljava/lang/Object;",
  176. ">;)",
  177. "Ljava/util/concurrent/atomic/AtomicReferenceArray<",
  178. "Ljava/lang/Object;",
  179. ">;"
  180. }
  181. .end annotation
  182. .line 117
  183. invoke-virtual {p1}, Ljava/util/concurrent/atomic/AtomicReferenceArray;->length()I
  184. move-result v0
  185. add-int/lit8 v0, v0, -0x1
  186. invoke-static {v0}, Lio/reactivex/internal/queue/SpscLinkedArrayQueue;->calcDirectOffset(I)I
  187. move-result v0
  188. invoke-static {p1, v0}, Lio/reactivex/internal/queue/SpscLinkedArrayQueue;->lvElement(Ljava/util/concurrent/atomic/AtomicReferenceArray;I)Ljava/lang/Object;
  189. move-result-object p1
  190. check-cast p1, Ljava/util/concurrent/atomic/AtomicReferenceArray;
  191. return-object p1
  192. .end method
  193. .method private lvProducerIndex()J
  194. .locals 2
  195. .line 210
  196. iget-object v0, p0, Lio/reactivex/internal/queue/SpscLinkedArrayQueue;->producerIndex:Ljava/util/concurrent/atomic/AtomicLong;
  197. invoke-virtual {v0}, Ljava/util/concurrent/atomic/AtomicLong;->get()J
  198. move-result-wide v0
  199. return-wide v0
  200. .end method
  201. .method private newBufferPeek(Ljava/util/concurrent/atomic/AtomicReferenceArray;JI)Ljava/lang/Object;
  202. .locals 0
  203. .annotation system Ldalvik/annotation/Signature;
  204. value = {
  205. "(",
  206. "Ljava/util/concurrent/atomic/AtomicReferenceArray<",
  207. "Ljava/lang/Object;",
  208. ">;JI)TT;"
  209. }
  210. .end annotation
  211. .line 173
  212. iput-object p1, p0, Lio/reactivex/internal/queue/SpscLinkedArrayQueue;->consumerBuffer:Ljava/util/concurrent/atomic/AtomicReferenceArray;
  213. .line 174
  214. invoke-static {p2, p3, p4}, Lio/reactivex/internal/queue/SpscLinkedArrayQueue;->calcWrappedOffset(JI)I
  215. move-result p2
  216. .line 175
  217. invoke-static {p1, p2}, Lio/reactivex/internal/queue/SpscLinkedArrayQueue;->lvElement(Ljava/util/concurrent/atomic/AtomicReferenceArray;I)Ljava/lang/Object;
  218. move-result-object p1
  219. return-object p1
  220. .end method
  221. .method private newBufferPoll(Ljava/util/concurrent/atomic/AtomicReferenceArray;JI)Ljava/lang/Object;
  222. .locals 3
  223. .annotation system Ldalvik/annotation/Signature;
  224. value = {
  225. "(",
  226. "Ljava/util/concurrent/atomic/AtomicReferenceArray<",
  227. "Ljava/lang/Object;",
  228. ">;JI)TT;"
  229. }
  230. .end annotation
  231. .line 147
  232. iput-object p1, p0, Lio/reactivex/internal/queue/SpscLinkedArrayQueue;->consumerBuffer:Ljava/util/concurrent/atomic/AtomicReferenceArray;
  233. .line 148
  234. invoke-static {p2, p3, p4}, Lio/reactivex/internal/queue/SpscLinkedArrayQueue;->calcWrappedOffset(JI)I
  235. move-result p4
  236. .line 149
  237. invoke-static {p1, p4}, Lio/reactivex/internal/queue/SpscLinkedArrayQueue;->lvElement(Ljava/util/concurrent/atomic/AtomicReferenceArray;I)Ljava/lang/Object;
  238. move-result-object v0
  239. if-eqz v0, :cond_0
  240. const/4 v1, 0x0
  241. .line 151
  242. invoke-static {p1, p4, v1}, Lio/reactivex/internal/queue/SpscLinkedArrayQueue;->soElement(Ljava/util/concurrent/atomic/AtomicReferenceArray;ILjava/lang/Object;)V
  243. const-wide/16 v1, 0x1
  244. add-long/2addr p2, v1
  245. .line 152
  246. invoke-direct {p0, p2, p3}, Lio/reactivex/internal/queue/SpscLinkedArrayQueue;->soConsumerIndex(J)V
  247. :cond_0
  248. return-object v0
  249. .end method
  250. .method private resize(Ljava/util/concurrent/atomic/AtomicReferenceArray;JILjava/lang/Object;J)V
  251. .locals 4
  252. .annotation system Ldalvik/annotation/Signature;
  253. value = {
  254. "(",
  255. "Ljava/util/concurrent/atomic/AtomicReferenceArray<",
  256. "Ljava/lang/Object;",
  257. ">;JITT;J)V"
  258. }
  259. .end annotation
  260. .line 101
  261. invoke-virtual {p1}, Ljava/util/concurrent/atomic/AtomicReferenceArray;->length()I
  262. move-result v0
  263. .line 102
  264. new-instance v1, Ljava/util/concurrent/atomic/AtomicReferenceArray;
  265. invoke-direct {v1, v0}, Ljava/util/concurrent/atomic/AtomicReferenceArray;-><init>(I)V
  266. .line 103
  267. iput-object v1, p0, Lio/reactivex/internal/queue/SpscLinkedArrayQueue;->producerBuffer:Ljava/util/concurrent/atomic/AtomicReferenceArray;
  268. add-long/2addr p6, p2
  269. const-wide/16 v2, 0x1
  270. sub-long/2addr p6, v2
  271. .line 104
  272. iput-wide p6, p0, Lio/reactivex/internal/queue/SpscLinkedArrayQueue;->producerLookAhead:J
  273. .line 105
  274. invoke-static {v1, p4, p5}, Lio/reactivex/internal/queue/SpscLinkedArrayQueue;->soElement(Ljava/util/concurrent/atomic/AtomicReferenceArray;ILjava/lang/Object;)V
  275. .line 106
  276. invoke-direct {p0, p1, v1}, Lio/reactivex/internal/queue/SpscLinkedArrayQueue;->soNext(Ljava/util/concurrent/atomic/AtomicReferenceArray;Ljava/util/concurrent/atomic/AtomicReferenceArray;)V
  277. .line 107
  278. sget-object p5, Lio/reactivex/internal/queue/SpscLinkedArrayQueue;->HAS_NEXT:Ljava/lang/Object;
  279. invoke-static {p1, p4, p5}, Lio/reactivex/internal/queue/SpscLinkedArrayQueue;->soElement(Ljava/util/concurrent/atomic/AtomicReferenceArray;ILjava/lang/Object;)V
  280. add-long/2addr p2, v2
  281. .line 109
  282. invoke-direct {p0, p2, p3}, Lio/reactivex/internal/queue/SpscLinkedArrayQueue;->soProducerIndex(J)V
  283. return-void
  284. .end method
  285. .method private soConsumerIndex(J)V
  286. .locals 1
  287. .line 230
  288. iget-object v0, p0, Lio/reactivex/internal/queue/SpscLinkedArrayQueue;->consumerIndex:Ljava/util/concurrent/atomic/AtomicLong;
  289. invoke-virtual {v0, p1, p2}, Ljava/util/concurrent/atomic/AtomicLong;->lazySet(J)V
  290. return-void
  291. .end method
  292. .method private static soElement(Ljava/util/concurrent/atomic/AtomicReferenceArray;ILjava/lang/Object;)V
  293. .locals 0
  294. .annotation system Ldalvik/annotation/Signature;
  295. value = {
  296. "(",
  297. "Ljava/util/concurrent/atomic/AtomicReferenceArray<",
  298. "Ljava/lang/Object;",
  299. ">;I",
  300. "Ljava/lang/Object;",
  301. ")V"
  302. }
  303. .end annotation
  304. .line 240
  305. invoke-virtual {p0, p1, p2}, Ljava/util/concurrent/atomic/AtomicReferenceArray;->lazySet(ILjava/lang/Object;)V
  306. return-void
  307. .end method
  308. .method private soNext(Ljava/util/concurrent/atomic/AtomicReferenceArray;Ljava/util/concurrent/atomic/AtomicReferenceArray;)V
  309. .locals 1
  310. .annotation system Ldalvik/annotation/Signature;
  311. value = {
  312. "(",
  313. "Ljava/util/concurrent/atomic/AtomicReferenceArray<",
  314. "Ljava/lang/Object;",
  315. ">;",
  316. "Ljava/util/concurrent/atomic/AtomicReferenceArray<",
  317. "Ljava/lang/Object;",
  318. ">;)V"
  319. }
  320. .end annotation
  321. .line 113
  322. invoke-virtual {p1}, Ljava/util/concurrent/atomic/AtomicReferenceArray;->length()I
  323. move-result v0
  324. add-int/lit8 v0, v0, -0x1
  325. invoke-static {v0}, Lio/reactivex/internal/queue/SpscLinkedArrayQueue;->calcDirectOffset(I)I
  326. move-result v0
  327. invoke-static {p1, v0, p2}, Lio/reactivex/internal/queue/SpscLinkedArrayQueue;->soElement(Ljava/util/concurrent/atomic/AtomicReferenceArray;ILjava/lang/Object;)V
  328. return-void
  329. .end method
  330. .method private soProducerIndex(J)V
  331. .locals 1
  332. .line 226
  333. iget-object v0, p0, Lio/reactivex/internal/queue/SpscLinkedArrayQueue;->producerIndex:Ljava/util/concurrent/atomic/AtomicLong;
  334. invoke-virtual {v0, p1, p2}, Ljava/util/concurrent/atomic/AtomicLong;->lazySet(J)V
  335. return-void
  336. .end method
  337. .method private writeToQueue(Ljava/util/concurrent/atomic/AtomicReferenceArray;Ljava/lang/Object;JI)Z
  338. .locals 0
  339. .annotation system Ldalvik/annotation/Signature;
  340. value = {
  341. "(",
  342. "Ljava/util/concurrent/atomic/AtomicReferenceArray<",
  343. "Ljava/lang/Object;",
  344. ">;TT;JI)Z"
  345. }
  346. .end annotation
  347. .line 94
  348. invoke-static {p1, p5, p2}, Lio/reactivex/internal/queue/SpscLinkedArrayQueue;->soElement(Ljava/util/concurrent/atomic/AtomicReferenceArray;ILjava/lang/Object;)V
  349. const-wide/16 p1, 0x1
  350. add-long/2addr p3, p1
  351. .line 95
  352. invoke-direct {p0, p3, p4}, Lio/reactivex/internal/queue/SpscLinkedArrayQueue;->soProducerIndex(J)V
  353. const/4 p1, 0x1
  354. return p1
  355. .end method
  356. # virtual methods
  357. .method public clear()V
  358. .locals 1
  359. .line 179
  360. :cond_0
  361. :goto_0
  362. invoke-virtual {p0}, Lio/reactivex/internal/queue/SpscLinkedArrayQueue;->poll()Ljava/lang/Object;
  363. move-result-object v0
  364. if-nez v0, :cond_0
  365. invoke-virtual {p0}, Lio/reactivex/internal/queue/SpscLinkedArrayQueue;->isEmpty()Z
  366. move-result v0
  367. if-nez v0, :cond_1
  368. goto :goto_0
  369. :cond_1
  370. return-void
  371. .end method
  372. .method public isEmpty()Z
  373. .locals 5
  374. .line 202
  375. invoke-direct {p0}, Lio/reactivex/internal/queue/SpscLinkedArrayQueue;->lvProducerIndex()J
  376. move-result-wide v0
  377. invoke-direct {p0}, Lio/reactivex/internal/queue/SpscLinkedArrayQueue;->lvConsumerIndex()J
  378. move-result-wide v2
  379. cmp-long v4, v0, v2
  380. if-nez v4, :cond_0
  381. const/4 v0, 0x1
  382. goto :goto_0
  383. :cond_0
  384. const/4 v0, 0x0
  385. :goto_0
  386. return v0
  387. .end method
  388. .method public offer(Ljava/lang/Object;)Z
  389. .locals 10
  390. .annotation system Ldalvik/annotation/Signature;
  391. value = {
  392. "(TT;)Z"
  393. }
  394. .end annotation
  395. if-eqz p1, :cond_3
  396. .line 71
  397. iget-object v1, p0, Lio/reactivex/internal/queue/SpscLinkedArrayQueue;->producerBuffer:Ljava/util/concurrent/atomic/AtomicReferenceArray;
  398. .line 72
  399. invoke-direct {p0}, Lio/reactivex/internal/queue/SpscLinkedArrayQueue;->lpProducerIndex()J
  400. move-result-wide v3
  401. .line 73
  402. iget v0, p0, Lio/reactivex/internal/queue/SpscLinkedArrayQueue;->producerMask:I
  403. .line 74
  404. invoke-static {v3, v4, v0}, Lio/reactivex/internal/queue/SpscLinkedArrayQueue;->calcWrappedOffset(JI)I
  405. move-result v5
  406. .line 75
  407. iget-wide v6, p0, Lio/reactivex/internal/queue/SpscLinkedArrayQueue;->producerLookAhead:J
  408. cmp-long v2, v3, v6
  409. if-gez v2, :cond_0
  410. move-object v0, p0
  411. move-object v2, p1
  412. .line 76
  413. invoke-direct/range {v0 .. v5}, Lio/reactivex/internal/queue/SpscLinkedArrayQueue;->writeToQueue(Ljava/util/concurrent/atomic/AtomicReferenceArray;Ljava/lang/Object;JI)Z
  414. move-result p1
  415. return p1
  416. .line 78
  417. :cond_0
  418. iget v2, p0, Lio/reactivex/internal/queue/SpscLinkedArrayQueue;->producerLookAheadStep:I
  419. int-to-long v6, v2
  420. add-long/2addr v6, v3
  421. .line 80
  422. invoke-static {v6, v7, v0}, Lio/reactivex/internal/queue/SpscLinkedArrayQueue;->calcWrappedOffset(JI)I
  423. move-result v2
  424. .line 81
  425. invoke-static {v1, v2}, Lio/reactivex/internal/queue/SpscLinkedArrayQueue;->lvElement(Ljava/util/concurrent/atomic/AtomicReferenceArray;I)Ljava/lang/Object;
  426. move-result-object v2
  427. const-wide/16 v8, 0x1
  428. if-nez v2, :cond_1
  429. sub-long/2addr v6, v8
  430. .line 82
  431. iput-wide v6, p0, Lio/reactivex/internal/queue/SpscLinkedArrayQueue;->producerLookAhead:J
  432. move-object v0, p0
  433. move-object v2, p1
  434. .line 83
  435. invoke-direct/range {v0 .. v5}, Lio/reactivex/internal/queue/SpscLinkedArrayQueue;->writeToQueue(Ljava/util/concurrent/atomic/AtomicReferenceArray;Ljava/lang/Object;JI)Z
  436. move-result p1
  437. return p1
  438. :cond_1
  439. add-long/2addr v8, v3
  440. .line 84
  441. invoke-static {v8, v9, v0}, Lio/reactivex/internal/queue/SpscLinkedArrayQueue;->calcWrappedOffset(JI)I
  442. move-result v2
  443. invoke-static {v1, v2}, Lio/reactivex/internal/queue/SpscLinkedArrayQueue;->lvElement(Ljava/util/concurrent/atomic/AtomicReferenceArray;I)Ljava/lang/Object;
  444. move-result-object v2
  445. if-nez v2, :cond_2
  446. move-object v0, p0
  447. move-object v2, p1
  448. .line 85
  449. invoke-direct/range {v0 .. v5}, Lio/reactivex/internal/queue/SpscLinkedArrayQueue;->writeToQueue(Ljava/util/concurrent/atomic/AtomicReferenceArray;Ljava/lang/Object;JI)Z
  450. move-result p1
  451. return p1
  452. :cond_2
  453. int-to-long v6, v0
  454. move-object v0, p0
  455. move-wide v2, v3
  456. move v4, v5
  457. move-object v5, p1
  458. .line 87
  459. invoke-direct/range {v0 .. v7}, Lio/reactivex/internal/queue/SpscLinkedArrayQueue;->resize(Ljava/util/concurrent/atomic/AtomicReferenceArray;JILjava/lang/Object;J)V
  460. const/4 p1, 0x1
  461. return p1
  462. .line 68
  463. :cond_3
  464. new-instance p1, Ljava/lang/NullPointerException;
  465. const-string v0, "Null is not a valid element"
  466. invoke-direct {p1, v0}, Ljava/lang/NullPointerException;-><init>(Ljava/lang/String;)V
  467. throw p1
  468. .end method
  469. .method public offer(Ljava/lang/Object;Ljava/lang/Object;)Z
  470. .locals 8
  471. .annotation system Ldalvik/annotation/Signature;
  472. value = {
  473. "(TT;TT;)Z"
  474. }
  475. .end annotation
  476. .line 256
  477. iget-object v0, p0, Lio/reactivex/internal/queue/SpscLinkedArrayQueue;->producerBuffer:Ljava/util/concurrent/atomic/AtomicReferenceArray;
  478. .line 257
  479. invoke-direct {p0}, Lio/reactivex/internal/queue/SpscLinkedArrayQueue;->lvProducerIndex()J
  480. move-result-wide v1
  481. .line 258
  482. iget v3, p0, Lio/reactivex/internal/queue/SpscLinkedArrayQueue;->producerMask:I
  483. const-wide/16 v4, 0x2
  484. add-long/2addr v4, v1
  485. .line 260
  486. invoke-static {v4, v5, v3}, Lio/reactivex/internal/queue/SpscLinkedArrayQueue;->calcWrappedOffset(JI)I
  487. move-result v6
  488. .line 262
  489. invoke-static {v0, v6}, Lio/reactivex/internal/queue/SpscLinkedArrayQueue;->lvElement(Ljava/util/concurrent/atomic/AtomicReferenceArray;I)Ljava/lang/Object;
  490. move-result-object v6
  491. if-nez v6, :cond_0
  492. .line 263
  493. invoke-static {v1, v2, v3}, Lio/reactivex/internal/queue/SpscLinkedArrayQueue;->calcWrappedOffset(JI)I
  494. move-result v1
  495. add-int/lit8 v2, v1, 0x1
  496. .line 264
  497. invoke-static {v0, v2, p2}, Lio/reactivex/internal/queue/SpscLinkedArrayQueue;->soElement(Ljava/util/concurrent/atomic/AtomicReferenceArray;ILjava/lang/Object;)V
  498. .line 265
  499. invoke-static {v0, v1, p1}, Lio/reactivex/internal/queue/SpscLinkedArrayQueue;->soElement(Ljava/util/concurrent/atomic/AtomicReferenceArray;ILjava/lang/Object;)V
  500. .line 266
  501. invoke-direct {p0, v4, v5}, Lio/reactivex/internal/queue/SpscLinkedArrayQueue;->soProducerIndex(J)V
  502. goto :goto_0
  503. .line 268
  504. :cond_0
  505. invoke-virtual {v0}, Ljava/util/concurrent/atomic/AtomicReferenceArray;->length()I
  506. move-result v6
  507. .line 269
  508. new-instance v7, Ljava/util/concurrent/atomic/AtomicReferenceArray;
  509. invoke-direct {v7, v6}, Ljava/util/concurrent/atomic/AtomicReferenceArray;-><init>(I)V
  510. .line 270
  511. iput-object v7, p0, Lio/reactivex/internal/queue/SpscLinkedArrayQueue;->producerBuffer:Ljava/util/concurrent/atomic/AtomicReferenceArray;
  512. .line 272
  513. invoke-static {v1, v2, v3}, Lio/reactivex/internal/queue/SpscLinkedArrayQueue;->calcWrappedOffset(JI)I
  514. move-result v1
  515. add-int/lit8 v2, v1, 0x1
  516. .line 273
  517. invoke-static {v7, v2, p2}, Lio/reactivex/internal/queue/SpscLinkedArrayQueue;->soElement(Ljava/util/concurrent/atomic/AtomicReferenceArray;ILjava/lang/Object;)V
  518. .line 274
  519. invoke-static {v7, v1, p1}, Lio/reactivex/internal/queue/SpscLinkedArrayQueue;->soElement(Ljava/util/concurrent/atomic/AtomicReferenceArray;ILjava/lang/Object;)V
  520. .line 275
  521. invoke-direct {p0, v0, v7}, Lio/reactivex/internal/queue/SpscLinkedArrayQueue;->soNext(Ljava/util/concurrent/atomic/AtomicReferenceArray;Ljava/util/concurrent/atomic/AtomicReferenceArray;)V
  522. .line 277
  523. sget-object p1, Lio/reactivex/internal/queue/SpscLinkedArrayQueue;->HAS_NEXT:Ljava/lang/Object;
  524. invoke-static {v0, v1, p1}, Lio/reactivex/internal/queue/SpscLinkedArrayQueue;->soElement(Ljava/util/concurrent/atomic/AtomicReferenceArray;ILjava/lang/Object;)V
  525. .line 279
  526. invoke-direct {p0, v4, v5}, Lio/reactivex/internal/queue/SpscLinkedArrayQueue;->soProducerIndex(J)V
  527. :goto_0
  528. const/4 p1, 0x1
  529. return p1
  530. .end method
  531. .method public peek()Ljava/lang/Object;
  532. .locals 6
  533. .annotation system Ldalvik/annotation/Signature;
  534. value = {
  535. "()TT;"
  536. }
  537. .end annotation
  538. .line 159
  539. iget-object v0, p0, Lio/reactivex/internal/queue/SpscLinkedArrayQueue;->consumerBuffer:Ljava/util/concurrent/atomic/AtomicReferenceArray;
  540. .line 160
  541. invoke-direct {p0}, Lio/reactivex/internal/queue/SpscLinkedArrayQueue;->lpConsumerIndex()J
  542. move-result-wide v1
  543. .line 161
  544. iget v3, p0, Lio/reactivex/internal/queue/SpscLinkedArrayQueue;->consumerMask:I
  545. .line 162
  546. invoke-static {v1, v2, v3}, Lio/reactivex/internal/queue/SpscLinkedArrayQueue;->calcWrappedOffset(JI)I
  547. move-result v4
  548. .line 163
  549. invoke-static {v0, v4}, Lio/reactivex/internal/queue/SpscLinkedArrayQueue;->lvElement(Ljava/util/concurrent/atomic/AtomicReferenceArray;I)Ljava/lang/Object;
  550. move-result-object v4
  551. .line 164
  552. sget-object v5, Lio/reactivex/internal/queue/SpscLinkedArrayQueue;->HAS_NEXT:Ljava/lang/Object;
  553. if-ne v4, v5, :cond_0
  554. .line 165
  555. invoke-direct {p0, v0}, Lio/reactivex/internal/queue/SpscLinkedArrayQueue;->lvNext(Ljava/util/concurrent/atomic/AtomicReferenceArray;)Ljava/util/concurrent/atomic/AtomicReferenceArray;
  556. move-result-object v0
  557. invoke-direct {p0, v0, v1, v2, v3}, Lio/reactivex/internal/queue/SpscLinkedArrayQueue;->newBufferPeek(Ljava/util/concurrent/atomic/AtomicReferenceArray;JI)Ljava/lang/Object;
  558. move-result-object v0
  559. return-object v0
  560. :cond_0
  561. return-object v4
  562. .end method
  563. .method public poll()Ljava/lang/Object;
  564. .locals 8
  565. .annotation system Ldalvik/annotation/Signature;
  566. value = {
  567. "()TT;"
  568. }
  569. .end annotation
  570. .line 128
  571. iget-object v0, p0, Lio/reactivex/internal/queue/SpscLinkedArrayQueue;->consumerBuffer:Ljava/util/concurrent/atomic/AtomicReferenceArray;
  572. .line 129
  573. invoke-direct {p0}, Lio/reactivex/internal/queue/SpscLinkedArrayQueue;->lpConsumerIndex()J
  574. move-result-wide v1
  575. .line 130
  576. iget v3, p0, Lio/reactivex/internal/queue/SpscLinkedArrayQueue;->consumerMask:I
  577. .line 131
  578. invoke-static {v1, v2, v3}, Lio/reactivex/internal/queue/SpscLinkedArrayQueue;->calcWrappedOffset(JI)I
  579. move-result v4
  580. .line 132
  581. invoke-static {v0, v4}, Lio/reactivex/internal/queue/SpscLinkedArrayQueue;->lvElement(Ljava/util/concurrent/atomic/AtomicReferenceArray;I)Ljava/lang/Object;
  582. move-result-object v5
  583. .line 133
  584. sget-object v6, Lio/reactivex/internal/queue/SpscLinkedArrayQueue;->HAS_NEXT:Ljava/lang/Object;
  585. if-ne v5, v6, :cond_0
  586. const/4 v6, 0x1
  587. goto :goto_0
  588. :cond_0
  589. const/4 v6, 0x0
  590. :goto_0
  591. const/4 v7, 0x0
  592. if-eqz v5, :cond_1
  593. if-nez v6, :cond_1
  594. .line 135
  595. invoke-static {v0, v4, v7}, Lio/reactivex/internal/queue/SpscLinkedArrayQueue;->soElement(Ljava/util/concurrent/atomic/AtomicReferenceArray;ILjava/lang/Object;)V
  596. const-wide/16 v3, 0x1
  597. add-long/2addr v1, v3
  598. .line 136
  599. invoke-direct {p0, v1, v2}, Lio/reactivex/internal/queue/SpscLinkedArrayQueue;->soConsumerIndex(J)V
  600. return-object v5
  601. :cond_1
  602. if-eqz v6, :cond_2
  603. .line 139
  604. invoke-direct {p0, v0}, Lio/reactivex/internal/queue/SpscLinkedArrayQueue;->lvNext(Ljava/util/concurrent/atomic/AtomicReferenceArray;)Ljava/util/concurrent/atomic/AtomicReferenceArray;
  605. move-result-object v0
  606. invoke-direct {p0, v0, v1, v2, v3}, Lio/reactivex/internal/queue/SpscLinkedArrayQueue;->newBufferPoll(Ljava/util/concurrent/atomic/AtomicReferenceArray;JI)Ljava/lang/Object;
  607. move-result-object v0
  608. return-object v0
  609. :cond_2
  610. return-object v7
  611. .end method
  612. .method public size()I
  613. .locals 7
  614. .line 189
  615. invoke-direct {p0}, Lio/reactivex/internal/queue/SpscLinkedArrayQueue;->lvConsumerIndex()J
  616. move-result-wide v0
  617. .line 192
  618. :goto_0
  619. invoke-direct {p0}, Lio/reactivex/internal/queue/SpscLinkedArrayQueue;->lvProducerIndex()J
  620. move-result-wide v2
  621. .line 193
  622. invoke-direct {p0}, Lio/reactivex/internal/queue/SpscLinkedArrayQueue;->lvConsumerIndex()J
  623. move-result-wide v4
  624. cmp-long v6, v0, v4
  625. if-nez v6, :cond_0
  626. sub-long/2addr v2, v4
  627. long-to-int v0, v2
  628. return v0
  629. :cond_0
  630. move-wide v0, v4
  631. goto :goto_0
  632. .end method