SpscArrayQueue.smali 9.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411
  1. .class public final Lio/reactivex/internal/queue/SpscArrayQueue;
  2. .super Ljava/util/concurrent/atomic/AtomicReferenceArray;
  3. .source "SpscArrayQueue.java"
  4. # interfaces
  5. .implements Lio/reactivex/internal/fuseable/SimplePlainQueue;
  6. # annotations
  7. .annotation system Ldalvik/annotation/Signature;
  8. value = {
  9. "<E:",
  10. "Ljava/lang/Object;",
  11. ">",
  12. "Ljava/util/concurrent/atomic/AtomicReferenceArray<",
  13. "TE;>;",
  14. "Lio/reactivex/internal/fuseable/SimplePlainQueue<",
  15. "TE;>;"
  16. }
  17. .end annotation
  18. # static fields
  19. .field private static final MAX_LOOK_AHEAD_STEP:Ljava/lang/Integer;
  20. .field private static final serialVersionUID:J = -0x11fe70baff9afb41L
  21. # instance fields
  22. .field final consumerIndex:Ljava/util/concurrent/atomic/AtomicLong;
  23. .field final lookAheadStep:I
  24. .field final mask:I
  25. .field final producerIndex:Ljava/util/concurrent/atomic/AtomicLong;
  26. .field producerLookAhead:J
  27. # direct methods
  28. .method static constructor <clinit>()V
  29. .locals 2
  30. const-string v0, "jctools.spsc.max.lookahead.step"
  31. const/16 v1, 0x1000
  32. .line 42
  33. invoke-static {v0, v1}, Ljava/lang/Integer;->getInteger(Ljava/lang/String;I)Ljava/lang/Integer;
  34. move-result-object v0
  35. sput-object v0, Lio/reactivex/internal/queue/SpscArrayQueue;->MAX_LOOK_AHEAD_STEP:Ljava/lang/Integer;
  36. return-void
  37. .end method
  38. .method public constructor <init>(I)V
  39. .locals 1
  40. .line 50
  41. invoke-static {p1}, Lio/reactivex/internal/util/Pow2;->roundToPowerOfTwo(I)I
  42. move-result v0
  43. invoke-direct {p0, v0}, Ljava/util/concurrent/atomic/AtomicReferenceArray;-><init>(I)V
  44. .line 51
  45. invoke-virtual {p0}, Lio/reactivex/internal/queue/SpscArrayQueue;->length()I
  46. move-result v0
  47. add-int/lit8 v0, v0, -0x1
  48. iput v0, p0, Lio/reactivex/internal/queue/SpscArrayQueue;->mask:I
  49. .line 52
  50. new-instance v0, Ljava/util/concurrent/atomic/AtomicLong;
  51. invoke-direct {v0}, Ljava/util/concurrent/atomic/AtomicLong;-><init>()V
  52. iput-object v0, p0, Lio/reactivex/internal/queue/SpscArrayQueue;->producerIndex:Ljava/util/concurrent/atomic/AtomicLong;
  53. .line 53
  54. new-instance v0, Ljava/util/concurrent/atomic/AtomicLong;
  55. invoke-direct {v0}, Ljava/util/concurrent/atomic/AtomicLong;-><init>()V
  56. iput-object v0, p0, Lio/reactivex/internal/queue/SpscArrayQueue;->consumerIndex:Ljava/util/concurrent/atomic/AtomicLong;
  57. .line 54
  58. div-int/lit8 p1, p1, 0x4
  59. sget-object v0, Lio/reactivex/internal/queue/SpscArrayQueue;->MAX_LOOK_AHEAD_STEP:Ljava/lang/Integer;
  60. invoke-virtual {v0}, Ljava/lang/Integer;->intValue()I
  61. move-result v0
  62. invoke-static {p1, v0}, Ljava/lang/Math;->min(II)I
  63. move-result p1
  64. iput p1, p0, Lio/reactivex/internal/queue/SpscArrayQueue;->lookAheadStep:I
  65. return-void
  66. .end method
  67. # virtual methods
  68. .method calcElementOffset(J)I
  69. .locals 0
  70. long-to-int p2, p1
  71. .line 123
  72. iget p1, p0, Lio/reactivex/internal/queue/SpscArrayQueue;->mask:I
  73. and-int/2addr p1, p2
  74. return p1
  75. .end method
  76. .method calcElementOffset(JI)I
  77. .locals 0
  78. long-to-int p2, p1
  79. and-int p1, p2, p3
  80. return p1
  81. .end method
  82. .method public clear()V
  83. .locals 1
  84. .line 115
  85. :cond_0
  86. :goto_0
  87. invoke-virtual {p0}, Lio/reactivex/internal/queue/SpscArrayQueue;->poll()Ljava/lang/Object;
  88. move-result-object v0
  89. if-nez v0, :cond_0
  90. invoke-virtual {p0}, Lio/reactivex/internal/queue/SpscArrayQueue;->isEmpty()Z
  91. move-result v0
  92. if-nez v0, :cond_1
  93. goto :goto_0
  94. :cond_1
  95. return-void
  96. .end method
  97. .method public isEmpty()Z
  98. .locals 5
  99. .line 101
  100. iget-object v0, p0, Lio/reactivex/internal/queue/SpscArrayQueue;->producerIndex:Ljava/util/concurrent/atomic/AtomicLong;
  101. invoke-virtual {v0}, Ljava/util/concurrent/atomic/AtomicLong;->get()J
  102. move-result-wide v0
  103. iget-object v2, p0, Lio/reactivex/internal/queue/SpscArrayQueue;->consumerIndex:Ljava/util/concurrent/atomic/AtomicLong;
  104. invoke-virtual {v2}, Ljava/util/concurrent/atomic/AtomicLong;->get()J
  105. move-result-wide v2
  106. cmp-long v4, v0, v2
  107. if-nez v4, :cond_0
  108. const/4 v0, 0x1
  109. goto :goto_0
  110. :cond_0
  111. const/4 v0, 0x0
  112. :goto_0
  113. return v0
  114. .end method
  115. .method lvElement(I)Ljava/lang/Object;
  116. .locals 0
  117. .annotation system Ldalvik/annotation/Signature;
  118. value = {
  119. "(I)TE;"
  120. }
  121. .end annotation
  122. .line 131
  123. invoke-virtual {p0, p1}, Lio/reactivex/internal/queue/SpscArrayQueue;->get(I)Ljava/lang/Object;
  124. move-result-object p1
  125. return-object p1
  126. .end method
  127. .method public offer(Ljava/lang/Object;)Z
  128. .locals 7
  129. .annotation system Ldalvik/annotation/Signature;
  130. value = {
  131. "(TE;)Z"
  132. }
  133. .end annotation
  134. if-eqz p1, :cond_2
  135. .line 63
  136. iget v0, p0, Lio/reactivex/internal/queue/SpscArrayQueue;->mask:I
  137. .line 64
  138. iget-object v1, p0, Lio/reactivex/internal/queue/SpscArrayQueue;->producerIndex:Ljava/util/concurrent/atomic/AtomicLong;
  139. invoke-virtual {v1}, Ljava/util/concurrent/atomic/AtomicLong;->get()J
  140. move-result-wide v1
  141. .line 65
  142. invoke-virtual {p0, v1, v2, v0}, Lio/reactivex/internal/queue/SpscArrayQueue;->calcElementOffset(JI)I
  143. move-result v3
  144. .line 66
  145. iget-wide v4, p0, Lio/reactivex/internal/queue/SpscArrayQueue;->producerLookAhead:J
  146. cmp-long v6, v1, v4
  147. if-ltz v6, :cond_1
  148. .line 67
  149. iget v4, p0, Lio/reactivex/internal/queue/SpscArrayQueue;->lookAheadStep:I
  150. int-to-long v4, v4
  151. add-long/2addr v4, v1
  152. .line 68
  153. invoke-virtual {p0, v4, v5, v0}, Lio/reactivex/internal/queue/SpscArrayQueue;->calcElementOffset(JI)I
  154. move-result v0
  155. invoke-virtual {p0, v0}, Lio/reactivex/internal/queue/SpscArrayQueue;->lvElement(I)Ljava/lang/Object;
  156. move-result-object v0
  157. if-nez v0, :cond_0
  158. .line 69
  159. iput-wide v4, p0, Lio/reactivex/internal/queue/SpscArrayQueue;->producerLookAhead:J
  160. goto :goto_0
  161. .line 70
  162. :cond_0
  163. invoke-virtual {p0, v3}, Lio/reactivex/internal/queue/SpscArrayQueue;->lvElement(I)Ljava/lang/Object;
  164. move-result-object v0
  165. if-eqz v0, :cond_1
  166. const/4 p1, 0x0
  167. return p1
  168. .line 74
  169. :cond_1
  170. :goto_0
  171. invoke-virtual {p0, v3, p1}, Lio/reactivex/internal/queue/SpscArrayQueue;->soElement(ILjava/lang/Object;)V
  172. const-wide/16 v3, 0x1
  173. add-long/2addr v1, v3
  174. .line 75
  175. invoke-virtual {p0, v1, v2}, Lio/reactivex/internal/queue/SpscArrayQueue;->soProducerIndex(J)V
  176. const/4 p1, 0x1
  177. return p1
  178. .line 60
  179. :cond_2
  180. new-instance p1, Ljava/lang/NullPointerException;
  181. const-string v0, "Null is not a valid element"
  182. invoke-direct {p1, v0}, Ljava/lang/NullPointerException;-><init>(Ljava/lang/String;)V
  183. throw p1
  184. .end method
  185. .method public offer(Ljava/lang/Object;Ljava/lang/Object;)Z
  186. .locals 0
  187. .annotation system Ldalvik/annotation/Signature;
  188. value = {
  189. "(TE;TE;)Z"
  190. }
  191. .end annotation
  192. .line 82
  193. invoke-virtual {p0, p1}, Lio/reactivex/internal/queue/SpscArrayQueue;->offer(Ljava/lang/Object;)Z
  194. move-result p1
  195. if-eqz p1, :cond_0
  196. invoke-virtual {p0, p2}, Lio/reactivex/internal/queue/SpscArrayQueue;->offer(Ljava/lang/Object;)Z
  197. move-result p1
  198. if-eqz p1, :cond_0
  199. const/4 p1, 0x1
  200. goto :goto_0
  201. :cond_0
  202. const/4 p1, 0x0
  203. :goto_0
  204. return p1
  205. .end method
  206. .method public poll()Ljava/lang/Object;
  207. .locals 7
  208. .annotation system Ldalvik/annotation/Signature;
  209. value = {
  210. "()TE;"
  211. }
  212. .end annotation
  213. .line 87
  214. iget-object v0, p0, Lio/reactivex/internal/queue/SpscArrayQueue;->consumerIndex:Ljava/util/concurrent/atomic/AtomicLong;
  215. invoke-virtual {v0}, Ljava/util/concurrent/atomic/AtomicLong;->get()J
  216. move-result-wide v0
  217. .line 88
  218. invoke-virtual {p0, v0, v1}, Lio/reactivex/internal/queue/SpscArrayQueue;->calcElementOffset(J)I
  219. move-result v2
  220. .line 90
  221. invoke-virtual {p0, v2}, Lio/reactivex/internal/queue/SpscArrayQueue;->lvElement(I)Ljava/lang/Object;
  222. move-result-object v3
  223. const/4 v4, 0x0
  224. if-nez v3, :cond_0
  225. return-object v4
  226. :cond_0
  227. const-wide/16 v5, 0x1
  228. add-long/2addr v0, v5
  229. .line 94
  230. invoke-virtual {p0, v0, v1}, Lio/reactivex/internal/queue/SpscArrayQueue;->soConsumerIndex(J)V
  231. .line 95
  232. invoke-virtual {p0, v2, v4}, Lio/reactivex/internal/queue/SpscArrayQueue;->soElement(ILjava/lang/Object;)V
  233. return-object v3
  234. .end method
  235. .method soConsumerIndex(J)V
  236. .locals 1
  237. .line 109
  238. iget-object v0, p0, Lio/reactivex/internal/queue/SpscArrayQueue;->consumerIndex:Ljava/util/concurrent/atomic/AtomicLong;
  239. invoke-virtual {v0, p1, p2}, Ljava/util/concurrent/atomic/AtomicLong;->lazySet(J)V
  240. return-void
  241. .end method
  242. .method soElement(ILjava/lang/Object;)V
  243. .locals 0
  244. .annotation system Ldalvik/annotation/Signature;
  245. value = {
  246. "(ITE;)V"
  247. }
  248. .end annotation
  249. .line 127
  250. invoke-virtual {p0, p1, p2}, Lio/reactivex/internal/queue/SpscArrayQueue;->lazySet(ILjava/lang/Object;)V
  251. return-void
  252. .end method
  253. .method soProducerIndex(J)V
  254. .locals 1
  255. .line 105
  256. iget-object v0, p0, Lio/reactivex/internal/queue/SpscArrayQueue;->producerIndex:Ljava/util/concurrent/atomic/AtomicLong;
  257. invoke-virtual {v0, p1, p2}, Ljava/util/concurrent/atomic/AtomicLong;->lazySet(J)V
  258. return-void
  259. .end method