Merge "Remove Mac/Windows quick_exit() implementation."
This commit is contained in:
commit
4645210097
4 changed files with 0 additions and 136 deletions
|
@ -61,7 +61,6 @@ cc_defaults {
|
|||
"parsenetaddress.cpp",
|
||||
"process.cpp",
|
||||
"properties.cpp",
|
||||
"quick_exit.cpp",
|
||||
"stringprintf.cpp",
|
||||
"strings.cpp",
|
||||
"threads.cpp",
|
||||
|
@ -154,7 +153,6 @@ cc_test {
|
|||
"parsenetaddress_test.cpp",
|
||||
"process_test.cpp",
|
||||
"properties_test.cpp",
|
||||
"quick_exit_test.cpp",
|
||||
"result_test.cpp",
|
||||
"scopeguard_test.cpp",
|
||||
"stringprintf_test.cpp",
|
||||
|
|
|
@ -1,34 +0,0 @@
|
|||
/*
|
||||
* Copyright (C) 2016 The Android Open Source Project
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <stdlib.h>
|
||||
|
||||
// Provide emulation for at_quick_exit/quick_exit on platforms that don't have it.
|
||||
namespace android {
|
||||
namespace base {
|
||||
|
||||
// Bionic and glibc have quick_exit, Darwin and Windows don't.
|
||||
#if !defined(__linux__)
|
||||
void quick_exit(int exit_code) __attribute__((noreturn));
|
||||
int at_quick_exit(void (*func)());
|
||||
#else
|
||||
using ::at_quick_exit;
|
||||
using ::quick_exit;
|
||||
#endif
|
||||
}
|
||||
}
|
|
@ -1,46 +0,0 @@
|
|||
/*
|
||||
* Copyright (C) 2016 The Android Open Source Project
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
#include "android-base/quick_exit.h"
|
||||
|
||||
#if !defined(__linux__)
|
||||
|
||||
#include <mutex>
|
||||
#include <vector>
|
||||
|
||||
namespace android {
|
||||
namespace base {
|
||||
|
||||
static auto& quick_exit_mutex = *new std::mutex();
|
||||
static auto& quick_exit_handlers = *new std::vector<void (*)()>();
|
||||
|
||||
void quick_exit(int exit_code) {
|
||||
std::lock_guard<std::mutex> lock(quick_exit_mutex);
|
||||
for (auto it = quick_exit_handlers.rbegin(); it != quick_exit_handlers.rend(); ++it) {
|
||||
(*it)();
|
||||
}
|
||||
_Exit(exit_code);
|
||||
}
|
||||
|
||||
int at_quick_exit(void (*func)()) {
|
||||
std::lock_guard<std::mutex> lock(quick_exit_mutex);
|
||||
quick_exit_handlers.push_back(func);
|
||||
return 0;
|
||||
}
|
||||
|
||||
} // namespace base
|
||||
} // namespace android
|
||||
#endif
|
|
@ -1,54 +0,0 @@
|
|||
/*
|
||||
* Copyright (C) 2016 The Android Open Source Project
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
#include "android-base/quick_exit.h"
|
||||
|
||||
#include <gtest/gtest.h>
|
||||
|
||||
#include <errno.h>
|
||||
#include <fcntl.h>
|
||||
#include <unistd.h>
|
||||
|
||||
#include <string>
|
||||
|
||||
#include "android-base/test_utils.h"
|
||||
|
||||
// These tests are a bit sketchy, since each test run adds global state that affects subsequent
|
||||
// tests (including ones not in this file!). Exit with 0 in Exiter and stick the at_quick_exit test
|
||||
// at the end to hack around this.
|
||||
struct Exiter {
|
||||
~Exiter() {
|
||||
_Exit(0);
|
||||
}
|
||||
};
|
||||
|
||||
TEST(quick_exit, smoke) {
|
||||
ASSERT_EXIT(android::base::quick_exit(123), testing::ExitedWithCode(123), "");
|
||||
}
|
||||
|
||||
TEST(quick_exit, skip_static_destructors) {
|
||||
static Exiter exiter;
|
||||
ASSERT_EXIT(android::base::quick_exit(123), testing::ExitedWithCode(123), "");
|
||||
}
|
||||
|
||||
TEST(quick_exit, at_quick_exit) {
|
||||
static int counter = 4;
|
||||
// "Functions passed to at_quick_exit are called in reverse order of their registration."
|
||||
ASSERT_EQ(0, android::base::at_quick_exit([]() { _exit(counter); }));
|
||||
ASSERT_EQ(0, android::base::at_quick_exit([]() { counter += 2; }));
|
||||
ASSERT_EQ(0, android::base::at_quick_exit([]() { counter *= 10; }));
|
||||
ASSERT_EXIT(android::base::quick_exit(123), testing::ExitedWithCode(42), "");
|
||||
}
|
Loading…
Reference in a new issue