Loading adb/adb.cpp +1 −2 Original line number Diff line number Diff line Loading @@ -42,7 +42,6 @@ #include <android-base/logging.h> #include <android-base/macros.h> #include <android-base/parsenetaddress.h> #include <android-base/quick_exit.h> #include <android-base/stringprintf.h> #include <android-base/strings.h> Loading Loading @@ -1059,7 +1058,7 @@ int handle_host_request(const char* service, TransportType type, const char* ser SendOkay(reply_fd); // Rely on process exit to close the socket for us. android::base::quick_exit(0); exit(0); } // "transport:" is used for switching transport with a specified serial number Loading adb/client/main.cpp +3 −4 Original line number Diff line number Diff line Loading @@ -28,7 +28,6 @@ #include <android-base/errors.h> #include <android-base/file.h> #include <android-base/logging.h> #include <android-base/quick_exit.h> #include <android-base/stringprintf.h> #include "adb.h" Loading Loading @@ -61,7 +60,7 @@ static void setup_daemon_logging() { static BOOL WINAPI ctrlc_handler(DWORD type) { // TODO: Consider trying to kill a starting up adb server (if we're in // launch_server) by calling GenerateConsoleCtrlEvent(). android::base::quick_exit(STATUS_CONTROL_C_EXIT); exit(STATUS_CONTROL_C_EXIT); return TRUE; } #endif Loading Loading @@ -95,7 +94,7 @@ int adb_server_main(int is_daemon, const std::string& socket_spec, int ack_reply SetConsoleCtrlHandler(ctrlc_handler, TRUE); #else signal(SIGINT, [](int) { fdevent_run_on_main_thread([]() { android::base::quick_exit(0); }); fdevent_run_on_main_thread([]() { exit(0); }); }); #endif Loading @@ -104,7 +103,7 @@ int adb_server_main(int is_daemon, const std::string& socket_spec, int ack_reply setup_daemon_logging(); } android::base::at_quick_exit(adb_server_cleanup); atexit(adb_server_cleanup); init_transport_registration(); init_mdns_transport_discovery(); Loading adb/client/usb_libusb.cpp +1 −1 Original line number Diff line number Diff line Loading @@ -19,6 +19,7 @@ #include "sysdeps.h" #include <stdint.h> #include <stdlib.h> #include <atomic> #include <chrono> Loading @@ -33,7 +34,6 @@ #include <android-base/file.h> #include <android-base/logging.h> #include <android-base/quick_exit.h> #include <android-base/stringprintf.h> #include <android-base/strings.h> Loading adb/fdevent.cpp +28 −16 Original line number Diff line number Diff line Loading @@ -26,6 +26,7 @@ #include <unistd.h> #include <atomic> #include <deque> #include <functional> #include <list> #include <mutex> Loading Loading @@ -81,7 +82,7 @@ static unsigned long main_thread_id; static auto& run_queue_notify_fd = *new unique_fd(); static auto& run_queue_mutex = *new std::mutex(); static auto& run_queue GUARDED_BY(run_queue_mutex) = *new std::vector<std::function<void()>>(); static auto& run_queue GUARDED_BY(run_queue_mutex) = *new std::deque<std::function<void()>>(); void check_main_thread() { if (main_thread_valid) { Loading Loading @@ -359,11 +360,21 @@ static void fdevent_subproc_setup() { } #endif // !ADB_HOST static void fdevent_run_flush() REQUIRES(run_queue_mutex) { for (auto& f : run_queue) { f(); static void fdevent_run_flush() EXCLUDES(run_queue_mutex) { // We need to be careful around reentrancy here, since a function we call can queue up another // function. while (true) { std::function<void()> fn; { std::lock_guard<std::mutex> lock(run_queue_mutex); if (run_queue.empty()) { break; } fn = run_queue.front(); run_queue.pop_front(); } fn(); } run_queue.clear(); } static void fdevent_run_func(int fd, unsigned ev, void* /* userdata */) { Loading @@ -377,11 +388,11 @@ static void fdevent_run_func(int fd, unsigned ev, void* /* userdata */) { PLOG(FATAL) << "failed to empty run queue notify fd"; } std::lock_guard<std::mutex> lock(run_queue_mutex); fdevent_run_flush(); } static void fdevent_run_setup() { { std::lock_guard<std::mutex> lock(run_queue_mutex); CHECK(run_queue_notify_fd.get() == -1); int s[2]; Loading @@ -393,6 +404,7 @@ static void fdevent_run_setup() { fdevent* fde = fdevent_create(s[1], fdevent_run_func, nullptr); CHECK(fde != nullptr); fdevent_add(fde, FDE_READ); } fdevent_run_flush(); } Loading adb/fdevent_test.cpp +28 −0 Original line number Diff line number Diff line Loading @@ -194,3 +194,31 @@ TEST_F(FdeventTest, run_on_main_thread) { ASSERT_EQ(i, vec[i]); } } static std::function<void()> make_appender(std::vector<int>* vec, int value) { return [vec, value]() { check_main_thread(); if (value == 100) { return; } vec->push_back(value); fdevent_run_on_main_thread(make_appender(vec, value + 1)); }; } TEST_F(FdeventTest, run_on_main_thread_reentrant) { std::vector<int> vec; PrepareThread(); std::thread thread(fdevent_loop); fdevent_run_on_main_thread(make_appender(&vec, 0)); TerminateThread(thread); ASSERT_EQ(100u, vec.size()); for (int i = 0; i < 100; ++i) { ASSERT_EQ(i, vec[i]); } } Loading
adb/adb.cpp +1 −2 Original line number Diff line number Diff line Loading @@ -42,7 +42,6 @@ #include <android-base/logging.h> #include <android-base/macros.h> #include <android-base/parsenetaddress.h> #include <android-base/quick_exit.h> #include <android-base/stringprintf.h> #include <android-base/strings.h> Loading Loading @@ -1059,7 +1058,7 @@ int handle_host_request(const char* service, TransportType type, const char* ser SendOkay(reply_fd); // Rely on process exit to close the socket for us. android::base::quick_exit(0); exit(0); } // "transport:" is used for switching transport with a specified serial number Loading
adb/client/main.cpp +3 −4 Original line number Diff line number Diff line Loading @@ -28,7 +28,6 @@ #include <android-base/errors.h> #include <android-base/file.h> #include <android-base/logging.h> #include <android-base/quick_exit.h> #include <android-base/stringprintf.h> #include "adb.h" Loading Loading @@ -61,7 +60,7 @@ static void setup_daemon_logging() { static BOOL WINAPI ctrlc_handler(DWORD type) { // TODO: Consider trying to kill a starting up adb server (if we're in // launch_server) by calling GenerateConsoleCtrlEvent(). android::base::quick_exit(STATUS_CONTROL_C_EXIT); exit(STATUS_CONTROL_C_EXIT); return TRUE; } #endif Loading Loading @@ -95,7 +94,7 @@ int adb_server_main(int is_daemon, const std::string& socket_spec, int ack_reply SetConsoleCtrlHandler(ctrlc_handler, TRUE); #else signal(SIGINT, [](int) { fdevent_run_on_main_thread([]() { android::base::quick_exit(0); }); fdevent_run_on_main_thread([]() { exit(0); }); }); #endif Loading @@ -104,7 +103,7 @@ int adb_server_main(int is_daemon, const std::string& socket_spec, int ack_reply setup_daemon_logging(); } android::base::at_quick_exit(adb_server_cleanup); atexit(adb_server_cleanup); init_transport_registration(); init_mdns_transport_discovery(); Loading
adb/client/usb_libusb.cpp +1 −1 Original line number Diff line number Diff line Loading @@ -19,6 +19,7 @@ #include "sysdeps.h" #include <stdint.h> #include <stdlib.h> #include <atomic> #include <chrono> Loading @@ -33,7 +34,6 @@ #include <android-base/file.h> #include <android-base/logging.h> #include <android-base/quick_exit.h> #include <android-base/stringprintf.h> #include <android-base/strings.h> Loading
adb/fdevent.cpp +28 −16 Original line number Diff line number Diff line Loading @@ -26,6 +26,7 @@ #include <unistd.h> #include <atomic> #include <deque> #include <functional> #include <list> #include <mutex> Loading Loading @@ -81,7 +82,7 @@ static unsigned long main_thread_id; static auto& run_queue_notify_fd = *new unique_fd(); static auto& run_queue_mutex = *new std::mutex(); static auto& run_queue GUARDED_BY(run_queue_mutex) = *new std::vector<std::function<void()>>(); static auto& run_queue GUARDED_BY(run_queue_mutex) = *new std::deque<std::function<void()>>(); void check_main_thread() { if (main_thread_valid) { Loading Loading @@ -359,11 +360,21 @@ static void fdevent_subproc_setup() { } #endif // !ADB_HOST static void fdevent_run_flush() REQUIRES(run_queue_mutex) { for (auto& f : run_queue) { f(); static void fdevent_run_flush() EXCLUDES(run_queue_mutex) { // We need to be careful around reentrancy here, since a function we call can queue up another // function. while (true) { std::function<void()> fn; { std::lock_guard<std::mutex> lock(run_queue_mutex); if (run_queue.empty()) { break; } fn = run_queue.front(); run_queue.pop_front(); } fn(); } run_queue.clear(); } static void fdevent_run_func(int fd, unsigned ev, void* /* userdata */) { Loading @@ -377,11 +388,11 @@ static void fdevent_run_func(int fd, unsigned ev, void* /* userdata */) { PLOG(FATAL) << "failed to empty run queue notify fd"; } std::lock_guard<std::mutex> lock(run_queue_mutex); fdevent_run_flush(); } static void fdevent_run_setup() { { std::lock_guard<std::mutex> lock(run_queue_mutex); CHECK(run_queue_notify_fd.get() == -1); int s[2]; Loading @@ -393,6 +404,7 @@ static void fdevent_run_setup() { fdevent* fde = fdevent_create(s[1], fdevent_run_func, nullptr); CHECK(fde != nullptr); fdevent_add(fde, FDE_READ); } fdevent_run_flush(); } Loading
adb/fdevent_test.cpp +28 −0 Original line number Diff line number Diff line Loading @@ -194,3 +194,31 @@ TEST_F(FdeventTest, run_on_main_thread) { ASSERT_EQ(i, vec[i]); } } static std::function<void()> make_appender(std::vector<int>* vec, int value) { return [vec, value]() { check_main_thread(); if (value == 100) { return; } vec->push_back(value); fdevent_run_on_main_thread(make_appender(vec, value + 1)); }; } TEST_F(FdeventTest, run_on_main_thread_reentrant) { std::vector<int> vec; PrepareThread(); std::thread thread(fdevent_loop); fdevent_run_on_main_thread(make_appender(&vec, 0)); TerminateThread(thread); ASSERT_EQ(100u, vec.size()); for (int i = 0; i < 100; ++i) { ASSERT_EQ(i, vec[i]); } }