OperatorScan$InitialProducer.smali
.class final Lrx/internal/operators/OperatorScan$InitialProducer;
.super Ljava/lang/Object;
.source "OperatorScan.java"
# interfaces
.implements Lrx/Producer;
.implements Lrx/Observer;
# annotations
.annotation system Ldalvik/annotation/EnclosingClass;
value = Lrx/internal/operators/OperatorScan;
.end annotation
.annotation system Ldalvik/annotation/InnerClass;
accessFlags = 0x18
name = "InitialProducer"
.end annotation
.annotation system Ldalvik/annotation/Signature;
value = {
"<R:",
"Ljava/lang/Object;",
">",
"Ljava/lang/Object;",
"Lrx/Producer;",
"Lrx/Observer<",
"TR;>;"
}
.end annotation
# instance fields
.field final child:Lrx/Subscriber;
.annotation system Ldalvik/annotation/Signature;
value = {
"Lrx/Subscriber<",
"-TR;>;"
}
.end annotation
.end field
.field volatile done:Z
.field emitting:Z
.field error:Ljava/lang/Throwable;
.field missed:Z
.field missedRequested:J
.field volatile producer:Lrx/Producer;
.field final queue:Ljava/util/Queue;
.annotation system Ldalvik/annotation/Signature;
value = {
"Ljava/util/Queue<",
"Ljava/lang/Object;",
">;"
}
.end annotation
.end field
.field final requested:Ljava/util/concurrent/atomic/AtomicLong;
# direct methods
.method public constructor <init>(Ljava/lang/Object;Lrx/Subscriber;)V
.registers 3
.annotation system Ldalvik/annotation/Signature;
value = {
"(TR;",
"Lrx/Subscriber<",
"-TR;>;)V"
}
.end annotation
.line 1
invoke-direct {p0}, Ljava/lang/Object;-><init>()V
.line 2
iput-object p2, p0, Lrx/internal/operators/OperatorScan$InitialProducer;->child:Lrx/Subscriber;
.line 3
invoke-static {}, Lrx/internal/util/unsafe/UnsafeAccess;->isUnsafeAvailable()Z
move-result p2
if-eqz p2, :cond_11
.line 4
new-instance p2, Lrx/internal/util/unsafe/SpscLinkedQueue;
invoke-direct {p2}, Lrx/internal/util/unsafe/SpscLinkedQueue;-><init>()V
goto :goto_16
.line 5
:cond_11
new-instance p2, Lrx/internal/util/atomic/SpscLinkedAtomicQueue;
invoke-direct {p2}, Lrx/internal/util/atomic/SpscLinkedAtomicQueue;-><init>()V
.line 6
:goto_16
iput-object p2, p0, Lrx/internal/operators/OperatorScan$InitialProducer;->queue:Ljava/util/Queue;
.line 7
invoke-static {p1}, Lrx/internal/operators/NotificationLite;->next(Ljava/lang/Object;)Ljava/lang/Object;
move-result-object p1
invoke-interface {p2, p1}, Ljava/util/Queue;->offer(Ljava/lang/Object;)Z
.line 8
new-instance p1, Ljava/util/concurrent/atomic/AtomicLong;
invoke-direct {p1}, Ljava/util/concurrent/atomic/AtomicLong;-><init>()V
iput-object p1, p0, Lrx/internal/operators/OperatorScan$InitialProducer;->requested:Ljava/util/concurrent/atomic/AtomicLong;
return-void
.end method
# virtual methods
.method checkTerminated(ZZLrx/Subscriber;)Z
.registers 6
.annotation system Ldalvik/annotation/Signature;
value = {
"(ZZ",
"Lrx/Subscriber<",
"-TR;>;)Z"
}
.end annotation
.line 1
invoke-virtual {p3}, Lrx/Subscriber;->isUnsubscribed()Z
move-result v0
const/4 v1, 0x1
if-eqz v0, :cond_8
return v1
:cond_8
if-eqz p1, :cond_18
.line 2
iget-object p1, p0, Lrx/internal/operators/OperatorScan$InitialProducer;->error:Ljava/lang/Throwable;
if-eqz p1, :cond_12
.line 3
invoke-interface {p3, p1}, Lrx/Observer;->onError(Ljava/lang/Throwable;)V
return v1
:cond_12
if-eqz p2, :cond_18
.line 4
invoke-interface {p3}, Lrx/Observer;->onCompleted()V
return v1
:cond_18
const/4 p1, 0x0
return p1
.end method
.method emit()V
.registers 3
.line 1
monitor-enter p0
.line 2
:try_start_1
iget-boolean v0, p0, Lrx/internal/operators/OperatorScan$InitialProducer;->emitting:Z
const/4 v1, 0x1
if-eqz v0, :cond_a
.line 3
iput-boolean v1, p0, Lrx/internal/operators/OperatorScan$InitialProducer;->missed:Z
.line 4
monitor-exit p0
return-void
.line 5
:cond_a
iput-boolean v1, p0, Lrx/internal/operators/OperatorScan$InitialProducer;->emitting:Z
.line 6
monitor-exit p0
:try_end_d
.catchall {:try_start_1 .. :try_end_d} :catchall_11
.line 7
invoke-virtual {p0}, Lrx/internal/operators/OperatorScan$InitialProducer;->emitLoop()V
return-void
:catchall_11
move-exception v0
.line 8
:try_start_12
monitor-exit p0
:try_end_13
.catchall {:try_start_12 .. :try_end_13} :catchall_11
throw v0
.end method
.method emitLoop()V
.registers 14
.line 1
iget-object v0, p0, Lrx/internal/operators/OperatorScan$InitialProducer;->child:Lrx/Subscriber;
.line 2
iget-object v1, p0, Lrx/internal/operators/OperatorScan$InitialProducer;->queue:Ljava/util/Queue;
.line 3
iget-object v2, p0, Lrx/internal/operators/OperatorScan$InitialProducer;->requested:Ljava/util/concurrent/atomic/AtomicLong;
.line 4
invoke-virtual {v2}, Ljava/util/concurrent/atomic/AtomicLong;->get()J
move-result-wide v3
.line 5
:goto_a
iget-boolean v5, p0, Lrx/internal/operators/OperatorScan$InitialProducer;->done:Z
.line 6
invoke-interface {v1}, Ljava/util/Queue;->isEmpty()Z
move-result v6
.line 7
invoke-virtual {p0, v5, v6, v0}, Lrx/internal/operators/OperatorScan$InitialProducer;->checkTerminated(ZZLrx/Subscriber;)Z
move-result v5
if-eqz v5, :cond_17
return-void
:cond_17
const-wide/16 v5, 0x0
move-wide v7, v5
:goto_1a
const/4 v9, 0x0
cmp-long v10, v7, v3
if-eqz v10, :cond_44
.line 8
iget-boolean v10, p0, Lrx/internal/operators/OperatorScan$InitialProducer;->done:Z
.line 9
invoke-interface {v1}, Ljava/util/Queue;->poll()Ljava/lang/Object;
move-result-object v11
if-nez v11, :cond_29
const/4 v12, 0x1
goto :goto_2a
:cond_29
const/4 v12, 0x0
.line 10
:goto_2a
invoke-virtual {p0, v10, v12, v0}, Lrx/internal/operators/OperatorScan$InitialProducer;->checkTerminated(ZZLrx/Subscriber;)Z
move-result v10
if-eqz v10, :cond_31
return-void
:cond_31
if-eqz v12, :cond_34
goto :goto_44
.line 11
:cond_34
invoke-static {v11}, Lrx/internal/operators/NotificationLite;->getValue(Ljava/lang/Object;)Ljava/lang/Object;
move-result-object v9
.line 12
:try_start_38
invoke-interface {v0, v9}, Lrx/Observer;->onNext(Ljava/lang/Object;)V
:try_end_3b
.catch Ljava/lang/Throwable; {:try_start_38 .. :try_end_3b} :catch_3f
const-wide/16 v9, 0x1
add-long/2addr v7, v9
goto :goto_1a
:catch_3f
move-exception v1
.line 13
invoke-static {v1, v0, v9}, Lrx/exceptions/Exceptions;->throwOrReport(Ljava/lang/Throwable;Lrx/Observer;Ljava/lang/Object;)V
return-void
:cond_44
:goto_44
cmp-long v10, v7, v5
if-eqz v10, :cond_55
const-wide v5, 0x7fffffffffffffffL
cmp-long v10, v3, v5
if-eqz v10, :cond_55
.line 14
invoke-static {v2, v7, v8}, Lrx/internal/operators/BackpressureUtils;->produced(Ljava/util/concurrent/atomic/AtomicLong;J)J
move-result-wide v3
.line 15
:cond_55
monitor-enter p0
.line 16
:try_start_56
iget-boolean v5, p0, Lrx/internal/operators/OperatorScan$InitialProducer;->missed:Z
if-nez v5, :cond_5e
.line 17
iput-boolean v9, p0, Lrx/internal/operators/OperatorScan$InitialProducer;->emitting:Z
.line 18
monitor-exit p0
return-void
.line 19
:cond_5e
iput-boolean v9, p0, Lrx/internal/operators/OperatorScan$InitialProducer;->missed:Z
.line 20
monitor-exit p0
goto :goto_a
:catchall_62
move-exception v0
monitor-exit p0
:try_end_64
.catchall {:try_start_56 .. :try_end_64} :catchall_62
goto :goto_66
:goto_65
throw v0
:goto_66
goto :goto_65
.end method
.method public onCompleted()V
.registers 2
const/4 v0, 0x1
.line 1
iput-boolean v0, p0, Lrx/internal/operators/OperatorScan$InitialProducer;->done:Z
.line 2
invoke-virtual {p0}, Lrx/internal/operators/OperatorScan$InitialProducer;->emit()V
return-void
.end method
.method public onError(Ljava/lang/Throwable;)V
.registers 2
.line 1
iput-object p1, p0, Lrx/internal/operators/OperatorScan$InitialProducer;->error:Ljava/lang/Throwable;
const/4 p1, 0x1
.line 2
iput-boolean p1, p0, Lrx/internal/operators/OperatorScan$InitialProducer;->done:Z
.line 3
invoke-virtual {p0}, Lrx/internal/operators/OperatorScan$InitialProducer;->emit()V
return-void
.end method
.method public onNext(Ljava/lang/Object;)V
.registers 3
.annotation system Ldalvik/annotation/Signature;
value = {
"(TR;)V"
}
.end annotation
.line 1
iget-object v0, p0, Lrx/internal/operators/OperatorScan$InitialProducer;->queue:Ljava/util/Queue;
invoke-static {p1}, Lrx/internal/operators/NotificationLite;->next(Ljava/lang/Object;)Ljava/lang/Object;
move-result-object p1
invoke-interface {v0, p1}, Ljava/util/Queue;->offer(Ljava/lang/Object;)Z
.line 2
invoke-virtual {p0}, Lrx/internal/operators/OperatorScan$InitialProducer;->emit()V
return-void
.end method
.method public request(J)V
.registers 7
const-wide/16 v0, 0x0
cmp-long v2, p1, v0
if-ltz v2, :cond_30
cmp-long v2, p1, v0
if-eqz v2, :cond_2f
.line 1
iget-object v0, p0, Lrx/internal/operators/OperatorScan$InitialProducer;->requested:Ljava/util/concurrent/atomic/AtomicLong;
invoke-static {v0, p1, p2}, Lrx/internal/operators/BackpressureUtils;->getAndAddRequest(Ljava/util/concurrent/atomic/AtomicLong;J)J
.line 2
iget-object v0, p0, Lrx/internal/operators/OperatorScan$InitialProducer;->producer:Lrx/Producer;
if-nez v0, :cond_27
.line 3
iget-object v1, p0, Lrx/internal/operators/OperatorScan$InitialProducer;->requested:Ljava/util/concurrent/atomic/AtomicLong;
monitor-enter v1
.line 4
:try_start_16
iget-object v0, p0, Lrx/internal/operators/OperatorScan$InitialProducer;->producer:Lrx/Producer;
if-nez v0, :cond_22
.line 5
iget-wide v2, p0, Lrx/internal/operators/OperatorScan$InitialProducer;->missedRequested:J
.line 6
invoke-static {v2, v3, p1, p2}, Lrx/internal/operators/BackpressureUtils;->addCap(JJ)J
move-result-wide v2
iput-wide v2, p0, Lrx/internal/operators/OperatorScan$InitialProducer;->missedRequested:J
.line 7
:cond_22
monitor-exit v1
goto :goto_27
:catchall_24
move-exception p1
monitor-exit v1
:try_end_26
.catchall {:try_start_16 .. :try_end_26} :catchall_24
throw p1
:cond_27
:goto_27
if-eqz v0, :cond_2c
.line 8
invoke-interface {v0, p1, p2}, Lrx/Producer;->request(J)V
.line 9
:cond_2c
invoke-virtual {p0}, Lrx/internal/operators/OperatorScan$InitialProducer;->emit()V
:cond_2f
return-void
.line 10
:cond_30
new-instance v0, Ljava/lang/IllegalArgumentException;
new-instance v1, Ljava/lang/StringBuilder;
invoke-direct {v1}, Ljava/lang/StringBuilder;-><init>()V
const-string v2, "n >= required but it was "
invoke-virtual {v1, v2}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
invoke-virtual {v1, p1, p2}, Ljava/lang/StringBuilder;->append(J)Ljava/lang/StringBuilder;
invoke-virtual {v1}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String;
move-result-object p1
invoke-direct {v0, p1}, Ljava/lang/IllegalArgumentException;-><init>(Ljava/lang/String;)V
throw v0
.end method
.method public setProducer(Lrx/Producer;)V
.registers 8
if-eqz p1, :cond_34
.line 1
iget-object v0, p0, Lrx/internal/operators/OperatorScan$InitialProducer;->requested:Ljava/util/concurrent/atomic/AtomicLong;
monitor-enter v0
.line 2
:try_start_5
iget-object v1, p0, Lrx/internal/operators/OperatorScan$InitialProducer;->producer:Lrx/Producer;
if-nez v1, :cond_29
.line 3
iget-wide v1, p0, Lrx/internal/operators/OperatorScan$InitialProducer;->missedRequested:J
const-wide v3, 0x7fffffffffffffffL
cmp-long v5, v1, v3
if-eqz v5, :cond_17
const-wide/16 v3, 0x1
sub-long/2addr v1, v3
:cond_17
const-wide/16 v3, 0x0
.line 4
iput-wide v3, p0, Lrx/internal/operators/OperatorScan$InitialProducer;->missedRequested:J
.line 5
iput-object p1, p0, Lrx/internal/operators/OperatorScan$InitialProducer;->producer:Lrx/Producer;
.line 6
monitor-exit v0
:try_end_1e
.catchall {:try_start_5 .. :try_end_1e} :catchall_31
cmp-long v0, v1, v3
if-lez v0, :cond_25
.line 7
invoke-interface {p1, v1, v2}, Lrx/Producer;->request(J)V
.line 8
:cond_25
invoke-virtual {p0}, Lrx/internal/operators/OperatorScan$InitialProducer;->emit()V
return-void
.line 9
:cond_29
:try_start_29
new-instance p1, Ljava/lang/IllegalStateException;
const-string v1, "Can\'t set more than one Producer!"
invoke-direct {p1, v1}, Ljava/lang/IllegalStateException;-><init>(Ljava/lang/String;)V
throw p1
:catchall_31
move-exception p1
.line 10
monitor-exit v0
:try_end_33
.catchall {:try_start_29 .. :try_end_33} :catchall_31
throw p1
.line 11
:cond_34
new-instance p1, Ljava/lang/NullPointerException;
invoke-direct {p1}, Ljava/lang/NullPointerException;-><init>()V
throw p1
.end method