Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 34f45c56 authored by Yabin Cui's avatar Yabin Cui
Browse files

adb: keep all asocket operations in the main thread.

As far as I can see, all asockets operations happen in fdevent_loop()
in the main thread, excepting close_all_sockets(). Instead of adding
lock and ref_count for each asocket, a simpler way would be moving
close_all_sockets() from input_thread to the main thread.

In input_thread(), there are two path to break the loop and call
close_all_sockets(). One path is when receiving offline A_SYNC, which
is sent by the main thread. The other path is when read_packet
fails, which I believe is almost not possible and doesn't matter
(Because t->fd is closed just before t is freed.). So I move
close_all_sockets() to handle_offline() in the main thread.

the socket_list_lock in sockets.cpp could be removed. But I prefer
to leave it for the following changes.

Bug: 6558362
Change-Id: I5da23f60a67a331262c62693b9b127fe2689c799
parent 0ac29519
Loading
Loading
Loading
Loading
+5 −0
Original line number Original line Diff line number Diff line
@@ -243,6 +243,11 @@ void handle_offline(atransport *t)
    D("adb: offline\n");
    D("adb: offline\n");
    //Close the associated usb
    //Close the associated usb
    t->online = 0;
    t->online = 0;

    // This is necessary to avoid a race condition that occured when a transport closes
    // while a client socket is still active.
    close_all_sockets(t);

    run_transport_disconnects(t);
    run_transport_disconnects(t);
}
}


+0 −4
Original line number Original line Diff line number Diff line
@@ -330,10 +330,6 @@ static void *input_thread(void *_t)
        put_apacket(p);
        put_apacket(p);
    }
    }


    // this is necessary to avoid a race condition that occured when a transport closes
    // while a client socket is still active.
    close_all_sockets(t);

    D("%s: transport input thread is exiting, fd %d\n", t->serial, t->fd);
    D("%s: transport input thread is exiting, fd %d\n", t->serial, t->fd);
    kick_transport(t);
    kick_transport(t);
    transport_unref(t);
    transport_unref(t);