Merge changes I0783be05,Id8178913 am: 09d5e258ef
am: 2c1b3e9761
Change-Id: I764488803977604f85000cbf12ecf25f2c60c695
This commit is contained in:
commit
d8b711e16b
6 changed files with 61 additions and 24 deletions
|
@ -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>
|
||||
|
||||
|
@ -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
|
||||
|
|
|
@ -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"
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
||||
|
@ -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();
|
||||
|
|
|
@ -19,6 +19,7 @@
|
|||
#include "sysdeps.h"
|
||||
|
||||
#include <stdint.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
#include <atomic>
|
||||
#include <chrono>
|
||||
|
@ -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>
|
||||
|
||||
|
|
|
@ -26,6 +26,7 @@
|
|||
#include <unistd.h>
|
||||
|
||||
#include <atomic>
|
||||
#include <deque>
|
||||
#include <functional>
|
||||
#include <list>
|
||||
#include <mutex>
|
||||
|
@ -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) {
|
||||
|
@ -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 */) {
|
||||
|
@ -377,22 +388,23 @@ 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];
|
||||
if (adb_socketpair(s) != 0) {
|
||||
PLOG(FATAL) << "failed to create run queue notify socketpair";
|
||||
}
|
||||
{
|
||||
std::lock_guard<std::mutex> lock(run_queue_mutex);
|
||||
CHECK(run_queue_notify_fd.get() == -1);
|
||||
int s[2];
|
||||
if (adb_socketpair(s) != 0) {
|
||||
PLOG(FATAL) << "failed to create run queue notify socketpair";
|
||||
}
|
||||
|
||||
run_queue_notify_fd.reset(s[0]);
|
||||
fdevent* fde = fdevent_create(s[1], fdevent_run_func, nullptr);
|
||||
CHECK(fde != nullptr);
|
||||
fdevent_add(fde, FDE_READ);
|
||||
run_queue_notify_fd.reset(s[0]);
|
||||
fdevent* fde = fdevent_create(s[1], fdevent_run_func, nullptr);
|
||||
CHECK(fde != nullptr);
|
||||
fdevent_add(fde, FDE_READ);
|
||||
}
|
||||
|
||||
fdevent_run_flush();
|
||||
}
|
||||
|
|
|
@ -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]);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -34,7 +34,6 @@
|
|||
|
||||
#include <android-base/logging.h>
|
||||
#include <android-base/parsenetaddress.h>
|
||||
#include <android-base/quick_exit.h>
|
||||
#include <android-base/stringprintf.h>
|
||||
#include <android-base/strings.h>
|
||||
#include <android-base/thread_annotations.h>
|
||||
|
|
Loading…
Reference in a new issue