OutboundFlowController.smali
.class Lio/grpc/okhttp/OutboundFlowController;
.super Ljava/lang/Object;
.source "OutboundFlowController.java"
# annotations
.annotation system Ldalvik/annotation/MemberClasses;
value = {
Lio/grpc/okhttp/OutboundFlowController$OutboundFlowState;,
Lio/grpc/okhttp/OutboundFlowController$WriteStatus;
}
.end annotation
# instance fields
.field private final connectionState:Lio/grpc/okhttp/OutboundFlowController$OutboundFlowState;
.field private final frameWriter:Lio/grpc/okhttp/internal/framed/FrameWriter;
.field private initialWindowSize:I
.field private final transport:Lio/grpc/okhttp/OkHttpClientTransport;
# direct methods
.method constructor <init>(Lio/grpc/okhttp/OkHttpClientTransport;Lio/grpc/okhttp/internal/framed/FrameWriter;)V
.registers 5
.line 1
invoke-direct {p0}, Ljava/lang/Object;-><init>()V
const v0, 0xffff
.line 2
iput v0, p0, Lio/grpc/okhttp/OutboundFlowController;->initialWindowSize:I
.line 3
new-instance v0, Lio/grpc/okhttp/OutboundFlowController$OutboundFlowState;
const/4 v1, 0x0
invoke-direct {v0, p0, v1}, Lio/grpc/okhttp/OutboundFlowController$OutboundFlowState;-><init>(Lio/grpc/okhttp/OutboundFlowController;I)V
iput-object v0, p0, Lio/grpc/okhttp/OutboundFlowController;->connectionState:Lio/grpc/okhttp/OutboundFlowController$OutboundFlowState;
const-string v0, "transport"
.line 4
invoke-static {p1, v0}, Lcom/google/common/base/r;->a(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
check-cast p1, Lio/grpc/okhttp/OkHttpClientTransport;
iput-object p1, p0, Lio/grpc/okhttp/OutboundFlowController;->transport:Lio/grpc/okhttp/OkHttpClientTransport;
const-string p1, "frameWriter"
.line 5
invoke-static {p2, p1}, Lcom/google/common/base/r;->a(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
check-cast p2, Lio/grpc/okhttp/internal/framed/FrameWriter;
iput-object p2, p0, Lio/grpc/okhttp/OutboundFlowController;->frameWriter:Lio/grpc/okhttp/internal/framed/FrameWriter;
return-void
.end method
.method static synthetic access$100(Lio/grpc/okhttp/OutboundFlowController;)I
.registers 1
.line 1
iget p0, p0, Lio/grpc/okhttp/OutboundFlowController;->initialWindowSize:I
return p0
.end method
.method static synthetic access$200(Lio/grpc/okhttp/OutboundFlowController;)Lio/grpc/okhttp/OutboundFlowController$OutboundFlowState;
.registers 1
.line 1
iget-object p0, p0, Lio/grpc/okhttp/OutboundFlowController;->connectionState:Lio/grpc/okhttp/OutboundFlowController$OutboundFlowState;
return-object p0
.end method
.method static synthetic access$300(Lio/grpc/okhttp/OutboundFlowController;)Lio/grpc/okhttp/internal/framed/FrameWriter;
.registers 1
.line 1
iget-object p0, p0, Lio/grpc/okhttp/OutboundFlowController;->frameWriter:Lio/grpc/okhttp/internal/framed/FrameWriter;
return-object p0
.end method
.method private state(Lio/grpc/okhttp/OkHttpClientStream;)Lio/grpc/okhttp/OutboundFlowController$OutboundFlowState;
.registers 3
.line 1
invoke-virtual {p1}, Lio/grpc/okhttp/OkHttpClientStream;->getOutboundFlowState()Ljava/lang/Object;
move-result-object v0
check-cast v0, Lio/grpc/okhttp/OutboundFlowController$OutboundFlowState;
if-nez v0, :cond_10
.line 2
new-instance v0, Lio/grpc/okhttp/OutboundFlowController$OutboundFlowState;
invoke-direct {v0, p0, p1}, Lio/grpc/okhttp/OutboundFlowController$OutboundFlowState;-><init>(Lio/grpc/okhttp/OutboundFlowController;Lio/grpc/okhttp/OkHttpClientStream;)V
.line 3
invoke-virtual {p1, v0}, Lio/grpc/okhttp/OkHttpClientStream;->setOutboundFlowState(Ljava/lang/Object;)V
:cond_10
return-object v0
.end method
.method private writeStreams()V
.registers 10
.line 1
iget-object v0, p0, Lio/grpc/okhttp/OutboundFlowController;->transport:Lio/grpc/okhttp/OkHttpClientTransport;
invoke-virtual {v0}, Lio/grpc/okhttp/OkHttpClientTransport;->getActiveStreams()[Lio/grpc/okhttp/OkHttpClientStream;
move-result-object v0
.line 2
iget-object v1, p0, Lio/grpc/okhttp/OutboundFlowController;->connectionState:Lio/grpc/okhttp/OutboundFlowController$OutboundFlowState;
invoke-virtual {v1}, Lio/grpc/okhttp/OutboundFlowController$OutboundFlowState;->window()I
move-result v1
.line 3
array-length v2, v0
:goto_d
const/4 v3, 0x0
if-lez v2, :cond_48
if-lez v1, :cond_48
int-to-float v4, v1
int-to-float v5, v2
div-float/2addr v4, v5
float-to-double v4, v4
.line 4
invoke-static {v4, v5}, Ljava/lang/Math;->ceil(D)D
move-result-wide v4
double-to-int v4, v4
const/4 v5, 0x0
:goto_1c
if-ge v3, v2, :cond_46
if-lez v1, :cond_46
.line 5
aget-object v6, v0, v3
.line 6
invoke-direct {p0, v6}, Lio/grpc/okhttp/OutboundFlowController;->state(Lio/grpc/okhttp/OkHttpClientStream;)Lio/grpc/okhttp/OutboundFlowController$OutboundFlowState;
move-result-object v7
.line 7
invoke-virtual {v7}, Lio/grpc/okhttp/OutboundFlowController$OutboundFlowState;->unallocatedBytes()I
move-result v8
invoke-static {v8, v4}, Ljava/lang/Math;->min(II)I
move-result v8
invoke-static {v1, v8}, Ljava/lang/Math;->min(II)I
move-result v8
if-lez v8, :cond_38
.line 8
invoke-virtual {v7, v8}, Lio/grpc/okhttp/OutboundFlowController$OutboundFlowState;->allocateBytes(I)V
sub-int/2addr v1, v8
.line 9
:cond_38
invoke-virtual {v7}, Lio/grpc/okhttp/OutboundFlowController$OutboundFlowState;->unallocatedBytes()I
move-result v7
if-lez v7, :cond_43
add-int/lit8 v7, v5, 0x1
.line 10
aput-object v6, v0, v5
move v5, v7
:cond_43
add-int/lit8 v3, v3, 0x1
goto :goto_1c
:cond_46
move v2, v5
goto :goto_d
.line 11
:cond_48
new-instance v0, Lio/grpc/okhttp/OutboundFlowController$WriteStatus;
const/4 v1, 0x0
invoke-direct {v0, p0, v1}, Lio/grpc/okhttp/OutboundFlowController$WriteStatus;-><init>(Lio/grpc/okhttp/OutboundFlowController;Lio/grpc/okhttp/OutboundFlowController$1;)V
.line 12
iget-object v1, p0, Lio/grpc/okhttp/OutboundFlowController;->transport:Lio/grpc/okhttp/OkHttpClientTransport;
invoke-virtual {v1}, Lio/grpc/okhttp/OkHttpClientTransport;->getActiveStreams()[Lio/grpc/okhttp/OkHttpClientStream;
move-result-object v1
array-length v2, v1
:goto_55
if-ge v3, v2, :cond_6a
aget-object v4, v1, v3
.line 13
invoke-direct {p0, v4}, Lio/grpc/okhttp/OutboundFlowController;->state(Lio/grpc/okhttp/OkHttpClientStream;)Lio/grpc/okhttp/OutboundFlowController$OutboundFlowState;
move-result-object v4
.line 14
invoke-virtual {v4}, Lio/grpc/okhttp/OutboundFlowController$OutboundFlowState;->allocatedBytes()I
move-result v5
invoke-virtual {v4, v5, v0}, Lio/grpc/okhttp/OutboundFlowController$OutboundFlowState;->writeBytes(ILio/grpc/okhttp/OutboundFlowController$WriteStatus;)I
.line 15
invoke-virtual {v4}, Lio/grpc/okhttp/OutboundFlowController$OutboundFlowState;->clearAllocatedBytes()V
add-int/lit8 v3, v3, 0x1
goto :goto_55
.line 16
:cond_6a
invoke-virtual {v0}, Lio/grpc/okhttp/OutboundFlowController$WriteStatus;->hasWritten()Z
move-result v0
if-eqz v0, :cond_73
.line 17
invoke-virtual {p0}, Lio/grpc/okhttp/OutboundFlowController;->flush()V
:cond_73
return-void
.end method
# virtual methods
.method data(ZILokio/Buffer;Z)V
.registers 7
const-string v0, "source"
.line 1
invoke-static {p3, v0}, Lcom/google/common/base/r;->a(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
.line 2
iget-object v0, p0, Lio/grpc/okhttp/OutboundFlowController;->transport:Lio/grpc/okhttp/OkHttpClientTransport;
invoke-virtual {v0, p2}, Lio/grpc/okhttp/OkHttpClientTransport;->getStream(I)Lio/grpc/okhttp/OkHttpClientStream;
move-result-object p2
if-nez p2, :cond_e
return-void
.line 3
:cond_e
invoke-direct {p0, p2}, Lio/grpc/okhttp/OutboundFlowController;->state(Lio/grpc/okhttp/OkHttpClientStream;)Lio/grpc/okhttp/OutboundFlowController$OutboundFlowState;
move-result-object p2
.line 4
invoke-virtual {p2}, Lio/grpc/okhttp/OutboundFlowController$OutboundFlowState;->writableWindow()I
move-result v0
.line 5
invoke-virtual {p2}, Lio/grpc/okhttp/OutboundFlowController$OutboundFlowState;->hasFrame()Z
move-result v1
.line 6
invoke-virtual {p2, p3, p1}, Lio/grpc/okhttp/OutboundFlowController$OutboundFlowState;->newFrame(Lokio/Buffer;Z)Lio/grpc/okhttp/OutboundFlowController$OutboundFlowState$Frame;
move-result-object p1
if-nez v1, :cond_2f
.line 7
invoke-virtual {p1}, Lio/grpc/okhttp/OutboundFlowController$OutboundFlowState$Frame;->size()I
move-result p2
if-lt v0, p2, :cond_2f
.line 8
invoke-virtual {p1}, Lio/grpc/okhttp/OutboundFlowController$OutboundFlowState$Frame;->write()V
if-eqz p4, :cond_2e
.line 9
invoke-virtual {p0}, Lio/grpc/okhttp/OutboundFlowController;->flush()V
:cond_2e
return-void
.line 10
:cond_2f
invoke-virtual {p1}, Lio/grpc/okhttp/OutboundFlowController$OutboundFlowState$Frame;->enqueue()V
if-nez v1, :cond_44
if-gtz v0, :cond_37
goto :goto_44
.line 11
:cond_37
invoke-virtual {p1, v0}, Lio/grpc/okhttp/OutboundFlowController$OutboundFlowState$Frame;->split(I)Lio/grpc/okhttp/OutboundFlowController$OutboundFlowState$Frame;
move-result-object p1
invoke-virtual {p1}, Lio/grpc/okhttp/OutboundFlowController$OutboundFlowState$Frame;->write()V
if-eqz p4, :cond_43
.line 12
invoke-virtual {p0}, Lio/grpc/okhttp/OutboundFlowController;->flush()V
:cond_43
return-void
:cond_44
:goto_44
if-eqz p4, :cond_49
.line 13
invoke-virtual {p0}, Lio/grpc/okhttp/OutboundFlowController;->flush()V
:cond_49
return-void
.end method
.method flush()V
.registers 3
.line 1
:try_start_0
iget-object v0, p0, Lio/grpc/okhttp/OutboundFlowController;->frameWriter:Lio/grpc/okhttp/internal/framed/FrameWriter;
invoke-interface {v0}, Lio/grpc/okhttp/internal/framed/FrameWriter;->flush()V
:try_end_5
.catch Ljava/io/IOException; {:try_start_0 .. :try_end_5} :catch_6
return-void
:catch_6
move-exception v0
.line 2
new-instance v1, Ljava/lang/RuntimeException;
invoke-direct {v1, v0}, Ljava/lang/RuntimeException;-><init>(Ljava/lang/Throwable;)V
throw v1
.end method
.method initialOutboundWindowSize(I)V
.registers 7
if-ltz p1, :cond_31
.line 1
iget v0, p0, Lio/grpc/okhttp/OutboundFlowController;->initialWindowSize:I
sub-int v0, p1, v0
.line 2
iput p1, p0, Lio/grpc/okhttp/OutboundFlowController;->initialWindowSize:I
.line 3
iget-object p1, p0, Lio/grpc/okhttp/OutboundFlowController;->transport:Lio/grpc/okhttp/OkHttpClientTransport;
invoke-virtual {p1}, Lio/grpc/okhttp/OkHttpClientTransport;->getActiveStreams()[Lio/grpc/okhttp/OkHttpClientStream;
move-result-object p1
array-length v1, p1
const/4 v2, 0x0
:goto_10
if-ge v2, v1, :cond_2b
aget-object v3, p1, v2
.line 4
invoke-virtual {v3}, Lio/grpc/okhttp/OkHttpClientStream;->getOutboundFlowState()Ljava/lang/Object;
move-result-object v4
check-cast v4, Lio/grpc/okhttp/OutboundFlowController$OutboundFlowState;
if-nez v4, :cond_25
.line 5
new-instance v4, Lio/grpc/okhttp/OutboundFlowController$OutboundFlowState;
invoke-direct {v4, p0, v3}, Lio/grpc/okhttp/OutboundFlowController$OutboundFlowState;-><init>(Lio/grpc/okhttp/OutboundFlowController;Lio/grpc/okhttp/OkHttpClientStream;)V
.line 6
invoke-virtual {v3, v4}, Lio/grpc/okhttp/OkHttpClientStream;->setOutboundFlowState(Ljava/lang/Object;)V
goto :goto_28
.line 7
:cond_25
invoke-virtual {v4, v0}, Lio/grpc/okhttp/OutboundFlowController$OutboundFlowState;->incrementStreamWindow(I)I
:goto_28
add-int/lit8 v2, v2, 0x1
goto :goto_10
:cond_2b
if-lez v0, :cond_30
.line 8
invoke-direct {p0}, Lio/grpc/okhttp/OutboundFlowController;->writeStreams()V
:cond_30
return-void
.line 9
:cond_31
new-instance v0, Ljava/lang/IllegalArgumentException;
new-instance v1, Ljava/lang/StringBuilder;
invoke-direct {v1}, Ljava/lang/StringBuilder;-><init>()V
const-string v2, "Invalid initial window size: "
invoke-virtual {v1, v2}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
invoke-virtual {v1, p1}, Ljava/lang/StringBuilder;->append(I)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
goto :goto_49
:goto_48
throw v0
:goto_49
goto :goto_48
.end method
.method windowUpdate(Lio/grpc/okhttp/OkHttpClientStream;I)V
.registers 4
if-nez p1, :cond_b
.line 1
iget-object p1, p0, Lio/grpc/okhttp/OutboundFlowController;->connectionState:Lio/grpc/okhttp/OutboundFlowController$OutboundFlowState;
invoke-virtual {p1, p2}, Lio/grpc/okhttp/OutboundFlowController$OutboundFlowState;->incrementStreamWindow(I)I
.line 2
invoke-direct {p0}, Lio/grpc/okhttp/OutboundFlowController;->writeStreams()V
goto :goto_28
.line 3
:cond_b
invoke-direct {p0, p1}, Lio/grpc/okhttp/OutboundFlowController;->state(Lio/grpc/okhttp/OkHttpClientStream;)Lio/grpc/okhttp/OutboundFlowController$OutboundFlowState;
move-result-object p1
.line 4
invoke-virtual {p1, p2}, Lio/grpc/okhttp/OutboundFlowController$OutboundFlowState;->incrementStreamWindow(I)I
.line 5
new-instance p2, Lio/grpc/okhttp/OutboundFlowController$WriteStatus;
const/4 v0, 0x0
invoke-direct {p2, p0, v0}, Lio/grpc/okhttp/OutboundFlowController$WriteStatus;-><init>(Lio/grpc/okhttp/OutboundFlowController;Lio/grpc/okhttp/OutboundFlowController$1;)V
.line 6
invoke-virtual {p1}, Lio/grpc/okhttp/OutboundFlowController$OutboundFlowState;->writableWindow()I
move-result v0
invoke-virtual {p1, v0, p2}, Lio/grpc/okhttp/OutboundFlowController$OutboundFlowState;->writeBytes(ILio/grpc/okhttp/OutboundFlowController$WriteStatus;)I
.line 7
invoke-virtual {p2}, Lio/grpc/okhttp/OutboundFlowController$WriteStatus;->hasWritten()Z
move-result p1
if-eqz p1, :cond_28
.line 8
invoke-virtual {p0}, Lio/grpc/okhttp/OutboundFlowController;->flush()V
:cond_28
:goto_28
return-void
.end method