IdleConnectionReaper.smali

.class public final Lcom/amazonaws/http/IdleConnectionReaper;
.super Ljava/lang/Thread;
.source "IdleConnectionReaper.java"


# static fields
.field private static final CONNECTION_MANAGERS:Ljava/util/ArrayList;
    .annotation system Ldalvik/annotation/Signature;
        value = {
            "Ljava/util/ArrayList<",
            "Lorg/apache/http/conn/ClientConnectionManager;",
            ">;"
        }
    .end annotation
.end field

.field private static final MINUTE_IN_SECONDS:I = 0x3c

.field private static final PERIOD_MILLISECONDS:I = 0xea60

.field private static instance:Lcom/amazonaws/http/IdleConnectionReaper;

.field static final log:Lcom/amazonaws/logging/Log;


# instance fields
.field private volatile shuttingDown:Z


# direct methods
.method static constructor <clinit>()V
    .registers 1

    .line 1
    new-instance v0, Ljava/util/ArrayList;

    invoke-direct {v0}, Ljava/util/ArrayList;-><init>()V

    sput-object v0, Lcom/amazonaws/http/IdleConnectionReaper;->CONNECTION_MANAGERS:Ljava/util/ArrayList;

    .line 2
    const-class v0, Lcom/amazonaws/http/IdleConnectionReaper;

    invoke-static {v0}, Lcom/amazonaws/logging/LogFactory;->getLog(Ljava/lang/Class;)Lcom/amazonaws/logging/Log;

    move-result-object v0

    sput-object v0, Lcom/amazonaws/http/IdleConnectionReaper;->log:Lcom/amazonaws/logging/Log;

    return-void
.end method

.method private constructor <init>()V
    .registers 2

    const-string v0, "java-sdk-http-connection-reaper"

    .line 1
    invoke-direct {p0, v0}, Ljava/lang/Thread;-><init>(Ljava/lang/String;)V

    const/4 v0, 0x1

    .line 2
    invoke-virtual {p0, v0}, Ljava/lang/Thread;->setDaemon(Z)V

    return-void
.end method

.method private markShuttingDown()V
    .registers 2

    const/4 v0, 0x1

    .line 1
    iput-boolean v0, p0, Lcom/amazonaws/http/IdleConnectionReaper;->shuttingDown:Z

    return-void
.end method

.method public static declared-synchronized registerConnectionManager(Lorg/apache/http/conn/ClientConnectionManager;)Z
    .registers 3

    const-class v0, Lcom/amazonaws/http/IdleConnectionReaper;

    monitor-enter v0

    .line 1
    :try_start_3
    sget-object v1, Lcom/amazonaws/http/IdleConnectionReaper;->instance:Lcom/amazonaws/http/IdleConnectionReaper;

    if-nez v1, :cond_13

    .line 2
    new-instance v1, Lcom/amazonaws/http/IdleConnectionReaper;

    invoke-direct {v1}, Lcom/amazonaws/http/IdleConnectionReaper;-><init>()V

    sput-object v1, Lcom/amazonaws/http/IdleConnectionReaper;->instance:Lcom/amazonaws/http/IdleConnectionReaper;

    .line 3
    sget-object v1, Lcom/amazonaws/http/IdleConnectionReaper;->instance:Lcom/amazonaws/http/IdleConnectionReaper;

    invoke-virtual {v1}, Ljava/lang/Thread;->start()V

    .line 4
    :cond_13
    sget-object v1, Lcom/amazonaws/http/IdleConnectionReaper;->CONNECTION_MANAGERS:Ljava/util/ArrayList;

    invoke-virtual {v1, p0}, Ljava/util/ArrayList;->add(Ljava/lang/Object;)Z

    move-result p0
    :try_end_19
    .catchall {:try_start_3 .. :try_end_19} :catchall_1b

    monitor-exit v0

    return p0

    :catchall_1b
    move-exception p0

    monitor-exit v0

    throw p0
.end method

.method public static declared-synchronized removeConnectionManager(Lorg/apache/http/conn/ClientConnectionManager;)Z
    .registers 3

    const-class v0, Lcom/amazonaws/http/IdleConnectionReaper;

    monitor-enter v0

    .line 1
    :try_start_3
    sget-object v1, Lcom/amazonaws/http/IdleConnectionReaper;->CONNECTION_MANAGERS:Ljava/util/ArrayList;

    invoke-virtual {v1, p0}, Ljava/util/ArrayList;->remove(Ljava/lang/Object;)Z

    move-result p0

    .line 2
    sget-object v1, Lcom/amazonaws/http/IdleConnectionReaper;->CONNECTION_MANAGERS:Ljava/util/ArrayList;

    invoke-virtual {v1}, Ljava/util/ArrayList;->isEmpty()Z

    move-result v1

    if-eqz v1, :cond_14

    .line 3
    invoke-static {}, Lcom/amazonaws/http/IdleConnectionReaper;->shutdown()Z
    :try_end_14
    .catchall {:try_start_3 .. :try_end_14} :catchall_16

    .line 4
    :cond_14
    monitor-exit v0

    return p0

    :catchall_16
    move-exception p0

    monitor-exit v0

    throw p0
.end method

.method public static declared-synchronized shutdown()Z
    .registers 2

    const-class v0, Lcom/amazonaws/http/IdleConnectionReaper;

    monitor-enter v0

    .line 1
    :try_start_3
    sget-object v1, Lcom/amazonaws/http/IdleConnectionReaper;->instance:Lcom/amazonaws/http/IdleConnectionReaper;

    if-eqz v1, :cond_1c

    .line 2
    sget-object v1, Lcom/amazonaws/http/IdleConnectionReaper;->instance:Lcom/amazonaws/http/IdleConnectionReaper;

    invoke-direct {v1}, Lcom/amazonaws/http/IdleConnectionReaper;->markShuttingDown()V

    .line 3
    sget-object v1, Lcom/amazonaws/http/IdleConnectionReaper;->instance:Lcom/amazonaws/http/IdleConnectionReaper;

    invoke-virtual {v1}, Ljava/lang/Thread;->interrupt()V

    .line 4
    sget-object v1, Lcom/amazonaws/http/IdleConnectionReaper;->CONNECTION_MANAGERS:Ljava/util/ArrayList;

    invoke-virtual {v1}, Ljava/util/ArrayList;->clear()V

    const/4 v1, 0x0

    .line 5
    sput-object v1, Lcom/amazonaws/http/IdleConnectionReaper;->instance:Lcom/amazonaws/http/IdleConnectionReaper;
    :try_end_19
    .catchall {:try_start_3 .. :try_end_19} :catchall_1f

    const/4 v1, 0x1

    .line 6
    monitor-exit v0

    return v1

    :cond_1c
    const/4 v1, 0x0

    .line 7
    monitor-exit v0

    return v1

    :catchall_1f
    move-exception v1

    monitor-exit v0

    throw v1
.end method

.method static declared-synchronized size()I
    .registers 2

    const-class v0, Lcom/amazonaws/http/IdleConnectionReaper;

    monitor-enter v0

    .line 1
    :try_start_3
    sget-object v1, Lcom/amazonaws/http/IdleConnectionReaper;->CONNECTION_MANAGERS:Ljava/util/ArrayList;

    invoke-virtual {v1}, Ljava/util/ArrayList;->size()I

    move-result v1
    :try_end_9
    .catchall {:try_start_3 .. :try_end_9} :catchall_b

    monitor-exit v0

    return v1

    :catchall_b
    move-exception v1

    monitor-exit v0

    throw v1
.end method


# virtual methods
.method public run()V
    .registers 6

    .line 1
    :cond_0
    :goto_0
    iget-boolean v0, p0, Lcom/amazonaws/http/IdleConnectionReaper;->shuttingDown:Z

    if-eqz v0, :cond_c

    .line 2
    sget-object v0, Lcom/amazonaws/http/IdleConnectionReaper;->log:Lcom/amazonaws/logging/Log;

    const-string v1, "Shutting down reaper thread."

    invoke-interface {v0, v1}, Lcom/amazonaws/logging/Log;->debug(Ljava/lang/Object;)V

    return-void

    :cond_c
    const-wide/32 v0, 0xea60

    .line 3
    :try_start_f
    invoke-static {v0, v1}, Ljava/lang/Thread;->sleep(J)V

    .line 4
    const-class v0, Lcom/amazonaws/http/IdleConnectionReaper;

    monitor-enter v0
    :try_end_15
    .catch Ljava/lang/Throwable; {:try_start_f .. :try_end_15} :catch_42

    .line 5
    :try_start_15
    sget-object v1, Lcom/amazonaws/http/IdleConnectionReaper;->CONNECTION_MANAGERS:Ljava/util/ArrayList;

    .line 6
    invoke-virtual {v1}, Ljava/util/ArrayList;->clone()Ljava/lang/Object;

    move-result-object v1

    check-cast v1, Ljava/util/List;

    .line 7
    monitor-exit v0
    :try_end_1e
    .catchall {:try_start_15 .. :try_end_1e} :catchall_3f

    .line 8
    :try_start_1e
    invoke-interface {v1}, Ljava/util/List;->iterator()Ljava/util/Iterator;

    move-result-object v0

    :goto_22
    invoke-interface {v0}, Ljava/util/Iterator;->hasNext()Z

    move-result v1

    if-eqz v1, :cond_0

    invoke-interface {v0}, Ljava/util/Iterator;->next()Ljava/lang/Object;

    move-result-object v1

    check-cast v1, Lorg/apache/http/conn/ClientConnectionManager;
    :try_end_2e
    .catch Ljava/lang/Throwable; {:try_start_1e .. :try_end_2e} :catch_42

    const-wide/16 v2, 0x3c

    .line 9
    :try_start_30
    sget-object v4, Ljava/util/concurrent/TimeUnit;->SECONDS:Ljava/util/concurrent/TimeUnit;

    invoke-interface {v1, v2, v3, v4}, Lorg/apache/http/conn/ClientConnectionManager;->closeIdleConnections(JLjava/util/concurrent/TimeUnit;)V
    :try_end_35
    .catch Ljava/lang/Exception; {:try_start_30 .. :try_end_35} :catch_36
    .catch Ljava/lang/Throwable; {:try_start_30 .. :try_end_35} :catch_42

    goto :goto_22

    :catch_36
    move-exception v1

    .line 10
    :try_start_37
    sget-object v2, Lcom/amazonaws/http/IdleConnectionReaper;->log:Lcom/amazonaws/logging/Log;

    const-string v3, "Unable to close idle connections"

    invoke-interface {v2, v3, v1}, Lcom/amazonaws/logging/Log;->warn(Ljava/lang/Object;Ljava/lang/Throwable;)V
    :try_end_3e
    .catch Ljava/lang/Throwable; {:try_start_37 .. :try_end_3e} :catch_42

    goto :goto_22

    :catchall_3f
    move-exception v1

    .line 11
    :try_start_40
    monitor-exit v0
    :try_end_41
    .catchall {:try_start_40 .. :try_end_41} :catchall_3f

    :try_start_41
    throw v1
    :try_end_42
    .catch Ljava/lang/Throwable; {:try_start_41 .. :try_end_42} :catch_42

    :catch_42
    move-exception v0

    .line 12
    sget-object v1, Lcom/amazonaws/http/IdleConnectionReaper;->log:Lcom/amazonaws/logging/Log;

    const-string v2, "Reaper thread: "

    invoke-interface {v1, v2, v0}, Lcom/amazonaws/logging/Log;->debug(Ljava/lang/Object;Ljava/lang/Throwable;)V

    goto :goto_0
.end method