BackpressureDrainManager.smali

.class public final Lrx/internal/util/BackpressureDrainManager;
.super Ljava/util/concurrent/atomic/AtomicLong;
.source "BackpressureDrainManager.java"

# interfaces
.implements Lrx/Producer;


# annotations
.annotation system Ldalvik/annotation/MemberClasses;
    value = {
        Lrx/internal/util/BackpressureDrainManager$BackpressureQueueCallback;
    }
.end annotation


# static fields
.field private static final serialVersionUID:J = 0x2738d34f11cd4869L


# instance fields
.field final actual:Lrx/internal/util/BackpressureDrainManager$BackpressureQueueCallback;

.field emitting:Z

.field exception:Ljava/lang/Throwable;

.field volatile terminated:Z


# direct methods
.method public constructor <init>(Lrx/internal/util/BackpressureDrainManager$BackpressureQueueCallback;)V
    .registers 2

    .line 1
    invoke-direct {p0}, Ljava/util/concurrent/atomic/AtomicLong;-><init>()V

    .line 2
    iput-object p1, p0, Lrx/internal/util/BackpressureDrainManager;->actual:Lrx/internal/util/BackpressureDrainManager$BackpressureQueueCallback;

    return-void
.end method


# virtual methods
.method public drain()V
    .registers 14

    .line 1
    monitor-enter p0

    .line 2
    :try_start_1
    iget-boolean v0, p0, Lrx/internal/util/BackpressureDrainManager;->emitting:Z

    if-eqz v0, :cond_7

    .line 3
    monitor-exit p0

    return-void

    :cond_7
    const/4 v0, 0x1

    .line 4
    iput-boolean v0, p0, Lrx/internal/util/BackpressureDrainManager;->emitting:Z

    .line 5
    iget-boolean v1, p0, Lrx/internal/util/BackpressureDrainManager;->terminated:Z

    .line 6
    monitor-exit p0
    :try_end_d
    .catchall {:try_start_1 .. :try_end_d} :catchall_93

    .line 7
    invoke-virtual {p0}, Ljava/util/concurrent/atomic/AtomicLong;->get()J

    move-result-wide v2

    const/4 v4, 0x0

    .line 8
    :try_start_12
    iget-object v5, p0, Lrx/internal/util/BackpressureDrainManager;->actual:Lrx/internal/util/BackpressureDrainManager$BackpressureQueueCallback;

    :goto_14
    const/4 v6, 0x0

    :goto_15
    const-wide/16 v7, 0x0

    cmp-long v9, v2, v7

    if-gtz v9, :cond_1d

    if-eqz v1, :cond_38

    :cond_1d
    if-eqz v1, :cond_32

    .line 9
    invoke-interface {v5}, Lrx/internal/util/BackpressureDrainManager$BackpressureQueueCallback;->peek()Ljava/lang/Object;

    move-result-object v9
    :try_end_23
    .catchall {:try_start_12 .. :try_end_23} :catchall_86

    if-nez v9, :cond_2d

    .line 10
    :try_start_25
    iget-object v1, p0, Lrx/internal/util/BackpressureDrainManager;->exception:Ljava/lang/Throwable;

    .line 11
    invoke-interface {v5, v1}, Lrx/internal/util/BackpressureDrainManager$BackpressureQueueCallback;->complete(Ljava/lang/Throwable;)V
    :try_end_2a
    .catchall {:try_start_25 .. :try_end_2a} :catchall_2b

    return-void

    :catchall_2b
    move-exception v1

    goto :goto_88

    :cond_2d
    cmp-long v9, v2, v7

    if-nez v9, :cond_32

    goto :goto_38

    .line 12
    :cond_32
    :try_start_32
    invoke-interface {v5}, Lrx/internal/util/BackpressureDrainManager$BackpressureQueueCallback;->poll()Ljava/lang/Object;

    move-result-object v9

    if-nez v9, :cond_79

    .line 13
    :cond_38
    :goto_38
    monitor-enter p0
    :try_end_39
    .catchall {:try_start_32 .. :try_end_39} :catchall_86

    .line 14
    :try_start_39
    iget-boolean v1, p0, Lrx/internal/util/BackpressureDrainManager;->terminated:Z

    .line 15
    invoke-interface {v5}, Lrx/internal/util/BackpressureDrainManager$BackpressureQueueCallback;->peek()Ljava/lang/Object;

    move-result-object v2

    if-eqz v2, :cond_43

    const/4 v2, 0x1

    goto :goto_44

    :cond_43
    const/4 v2, 0x0

    .line 16
    :goto_44
    invoke-virtual {p0}, Ljava/util/concurrent/atomic/AtomicLong;->get()J

    move-result-wide v9
    :try_end_48
    .catchall {:try_start_39 .. :try_end_48} :catchall_73

    const-wide v11, 0x7fffffffffffffffL

    cmp-long v3, v9, v11

    if-nez v3, :cond_5b

    if-nez v2, :cond_59

    if-nez v1, :cond_59

    .line 17
    :try_start_55
    iput-boolean v4, p0, Lrx/internal/util/BackpressureDrainManager;->emitting:Z

    .line 18
    monitor-exit p0
    :try_end_58
    .catchall {:try_start_55 .. :try_end_58} :catchall_77

    return-void

    :cond_59
    move-wide v2, v11

    goto :goto_6d

    :cond_5b
    neg-int v3, v6

    int-to-long v9, v3

    .line 19
    :try_start_5d
    invoke-virtual {p0, v9, v10}, Ljava/util/concurrent/atomic/AtomicLong;->addAndGet(J)J

    move-result-wide v9

    cmp-long v3, v9, v7

    if-eqz v3, :cond_67

    if-nez v2, :cond_6c

    :cond_67
    if-eqz v1, :cond_6f

    if-eqz v2, :cond_6c

    goto :goto_6f

    :cond_6c
    move-wide v2, v9

    .line 20
    :goto_6d
    monitor-exit p0
    :try_end_6e
    .catchall {:try_start_5d .. :try_end_6e} :catchall_73

    goto :goto_14

    .line 21
    :cond_6f
    :goto_6f
    :try_start_6f
    iput-boolean v4, p0, Lrx/internal/util/BackpressureDrainManager;->emitting:Z

    .line 22
    monitor-exit p0

    return-void

    :catchall_73
    move-exception v1

    const/4 v0, 0x0

    .line 23
    :goto_75
    monitor-exit p0
    :try_end_76
    .catchall {:try_start_6f .. :try_end_76} :catchall_77

    :try_start_76
    throw v1
    :try_end_77
    .catchall {:try_start_76 .. :try_end_77} :catchall_2b

    :catchall_77
    move-exception v1

    goto :goto_75

    .line 24
    :cond_79
    :try_start_79
    invoke-interface {v5, v9}, Lrx/internal/util/BackpressureDrainManager$BackpressureQueueCallback;->accept(Ljava/lang/Object;)Z

    move-result v7
    :try_end_7d
    .catchall {:try_start_79 .. :try_end_7d} :catchall_86

    if-eqz v7, :cond_80

    return-void

    :cond_80
    const-wide/16 v7, 0x1

    sub-long/2addr v2, v7

    add-int/lit8 v6, v6, 0x1

    goto :goto_15

    :catchall_86
    move-exception v1

    const/4 v0, 0x0

    :goto_88
    if-nez v0, :cond_92

    .line 25
    monitor-enter p0

    .line 26
    :try_start_8b
    iput-boolean v4, p0, Lrx/internal/util/BackpressureDrainManager;->emitting:Z

    .line 27
    monitor-exit p0

    goto :goto_92

    :catchall_8f
    move-exception v0

    monitor-exit p0
    :try_end_91
    .catchall {:try_start_8b .. :try_end_91} :catchall_8f

    throw v0

    :cond_92
    :goto_92
    throw v1

    :catchall_93
    move-exception v0

    .line 28
    :try_start_94
    monitor-exit p0
    :try_end_95
    .catchall {:try_start_94 .. :try_end_95} :catchall_93

    goto :goto_97

    :goto_96
    throw v0

    :goto_97
    goto :goto_96
.end method

.method public isTerminated()Z
    .registers 2

    .line 1
    iget-boolean v0, p0, Lrx/internal/util/BackpressureDrainManager;->terminated:Z

    return v0
.end method

.method public request(J)V
    .registers 13

    const-wide/16 v0, 0x0

    cmp-long v2, p1, v0

    if-nez v2, :cond_7

    return-void

    .line 1
    :cond_7
    invoke-virtual {p0}, Ljava/util/concurrent/atomic/AtomicLong;->get()J

    move-result-wide v2

    const/4 v4, 0x1

    cmp-long v5, v2, v0

    if-nez v5, :cond_12

    const/4 v5, 0x1

    goto :goto_13

    :cond_12
    const/4 v5, 0x0

    :goto_13
    const-wide v6, 0x7fffffffffffffffL

    cmp-long v8, v2, v6

    if-nez v8, :cond_1d

    goto :goto_33

    :cond_1d
    cmp-long v8, p1, v6

    if-nez v8, :cond_24

    move-wide v6, p1

    const/4 v5, 0x1

    goto :goto_2d

    :cond_24
    sub-long v8, v6, p1

    cmp-long v4, v2, v8

    if-lez v4, :cond_2b

    goto :goto_2d

    :cond_2b
    add-long v6, v2, p1

    .line 2
    :goto_2d
    invoke-virtual {p0, v2, v3, v6, v7}, Ljava/util/concurrent/atomic/AtomicLong;->compareAndSet(JJ)Z

    move-result v2

    if-eqz v2, :cond_7

    :goto_33
    if-eqz v5, :cond_38

    .line 3
    invoke-virtual {p0}, Lrx/internal/util/BackpressureDrainManager;->drain()V

    :cond_38
    return-void
.end method

.method public terminate()V
    .registers 2

    const/4 v0, 0x1

    .line 1
    iput-boolean v0, p0, Lrx/internal/util/BackpressureDrainManager;->terminated:Z

    return-void
.end method

.method public terminate(Ljava/lang/Throwable;)V
    .registers 3

    .line 2
    iget-boolean v0, p0, Lrx/internal/util/BackpressureDrainManager;->terminated:Z

    if-nez v0, :cond_9

    .line 3
    iput-object p1, p0, Lrx/internal/util/BackpressureDrainManager;->exception:Ljava/lang/Throwable;

    const/4 p1, 0x1

    .line 4
    iput-boolean p1, p0, Lrx/internal/util/BackpressureDrainManager;->terminated:Z

    :cond_9
    return-void
.end method

.method public terminateAndDrain()V
    .registers 2

    const/4 v0, 0x1

    .line 1
    iput-boolean v0, p0, Lrx/internal/util/BackpressureDrainManager;->terminated:Z

    .line 2
    invoke-virtual {p0}, Lrx/internal/util/BackpressureDrainManager;->drain()V

    return-void
.end method

.method public terminateAndDrain(Ljava/lang/Throwable;)V
    .registers 3

    .line 3
    iget-boolean v0, p0, Lrx/internal/util/BackpressureDrainManager;->terminated:Z

    if-nez v0, :cond_c

    .line 4
    iput-object p1, p0, Lrx/internal/util/BackpressureDrainManager;->exception:Ljava/lang/Throwable;

    const/4 p1, 0x1

    .line 5
    iput-boolean p1, p0, Lrx/internal/util/BackpressureDrainManager;->terminated:Z

    .line 6
    invoke-virtual {p0}, Lrx/internal/util/BackpressureDrainManager;->drain()V

    :cond_c
    return-void
.end method