mirror of
https://github.com/ClickHouse/ClickHouse.git
synced 2024-11-26 01:22:04 +00:00
Merge branch 'fix-build-xenial' into avoid-std-terminate-in-write-buffers
This commit is contained in:
commit
20f0ec6265
2
contrib/libcxxabi
vendored
2
contrib/libcxxabi
vendored
@ -1 +1 @@
|
|||||||
Subproject commit c26cf36f8387c5edf2cabb4a630f0975c35aa9fb
|
Subproject commit 7aacd45028ecf5f1c39985ecbd4f67eed9b11ce5
|
@ -27,10 +27,6 @@ if (GLIBC_COMPATIBILITY)
|
|||||||
list(APPEND glibc_compatibility_sources musl/getentropy.c)
|
list(APPEND glibc_compatibility_sources musl/getentropy.c)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
if(MAKE_STATIC_LIBRARIES)
|
|
||||||
list(APPEND glibc_compatibility_sources libcxxabi/cxa_thread_atexit.cpp)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
# Need to omit frame pointers to match the performance of glibc
|
# Need to omit frame pointers to match the performance of glibc
|
||||||
set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fomit-frame-pointer")
|
set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fomit-frame-pointer")
|
||||||
|
|
||||||
|
@ -1,76 +0,0 @@
|
|||||||
==============================================================================
|
|
||||||
libc++abi License
|
|
||||||
==============================================================================
|
|
||||||
|
|
||||||
The libc++abi library is dual licensed under both the University of Illinois
|
|
||||||
"BSD-Like" license and the MIT license. As a user of this code you may choose
|
|
||||||
to use it under either license. As a contributor, you agree to allow your code
|
|
||||||
to be used under both.
|
|
||||||
|
|
||||||
Full text of the relevant licenses is included below.
|
|
||||||
|
|
||||||
==============================================================================
|
|
||||||
|
|
||||||
University of Illinois/NCSA
|
|
||||||
Open Source License
|
|
||||||
|
|
||||||
Copyright (c) 2009-2018 by the contributors listed in CREDITS.TXT
|
|
||||||
|
|
||||||
All rights reserved.
|
|
||||||
|
|
||||||
Developed by:
|
|
||||||
|
|
||||||
LLVM Team
|
|
||||||
|
|
||||||
University of Illinois at Urbana-Champaign
|
|
||||||
|
|
||||||
http://llvm.org
|
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy of
|
|
||||||
this software and associated documentation files (the "Software"), to deal with
|
|
||||||
the Software without restriction, including without limitation the rights to
|
|
||||||
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
|
|
||||||
of the Software, and to permit persons to whom the Software is furnished to do
|
|
||||||
so, subject to the following conditions:
|
|
||||||
|
|
||||||
* Redistributions of source code must retain the above copyright notice,
|
|
||||||
this list of conditions and the following disclaimers.
|
|
||||||
|
|
||||||
* Redistributions in binary form must reproduce the above copyright notice,
|
|
||||||
this list of conditions and the following disclaimers in the
|
|
||||||
documentation and/or other materials provided with the distribution.
|
|
||||||
|
|
||||||
* Neither the names of the LLVM Team, University of Illinois at
|
|
||||||
Urbana-Champaign, nor the names of its contributors may be used to
|
|
||||||
endorse or promote products derived from this Software without specific
|
|
||||||
prior written permission.
|
|
||||||
|
|
||||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
|
|
||||||
FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
CONTRIBUTORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
||||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS WITH THE
|
|
||||||
SOFTWARE.
|
|
||||||
|
|
||||||
==============================================================================
|
|
||||||
|
|
||||||
Copyright (c) 2009-2014 by the contributors listed in CREDITS.TXT
|
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
of this software and associated documentation files (the "Software"), to deal
|
|
||||||
in the Software without restriction, including without limitation the rights
|
|
||||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
||||||
copies of the Software, and to permit persons to whom the Software is
|
|
||||||
furnished to do so, subject to the following conditions:
|
|
||||||
|
|
||||||
The above copyright notice and this permission notice shall be included in
|
|
||||||
all copies or substantial portions of the Software.
|
|
||||||
|
|
||||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
||||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
||||||
THE SOFTWARE.
|
|
@ -1,8 +0,0 @@
|
|||||||
Imported from https://github.com/llvm-project/llvm-project-20170507
|
|
||||||
revision: ad82e63b9719923cb393bd805730eaca0e3632a8
|
|
||||||
|
|
||||||
This is needed to avoid linking with "__cxa_thread_atexit_impl" function, that require too new (2.18) glibc library.
|
|
||||||
|
|
||||||
Note: "__cxa_thread_atexit_impl" may provide sophisticated implementation to correct destruction of thread-local objects,
|
|
||||||
that was created in different DSO. Read https://sourceware.org/glibc/wiki/Destructor%20support%20for%20thread_local%20variables
|
|
||||||
We simply don't need this implementation, because we don't use thread-local objects from different DSO.
|
|
@ -1,121 +0,0 @@
|
|||||||
//===----------------------- cxa_thread_atexit.cpp ------------------------===//
|
|
||||||
//
|
|
||||||
// The LLVM Compiler Infrastructure
|
|
||||||
//
|
|
||||||
// This file is dual licensed under the MIT and the University of Illinois Open
|
|
||||||
// Source Licenses. See LICENSE.TXT for details.
|
|
||||||
//
|
|
||||||
//===----------------------------------------------------------------------===//
|
|
||||||
|
|
||||||
#include <cstdlib>
|
|
||||||
#include <pthread.h>
|
|
||||||
|
|
||||||
using Dtor = void(*)(void*);
|
|
||||||
|
|
||||||
namespace {
|
|
||||||
// This implementation is used if the C library does not provide
|
|
||||||
// __cxa_thread_atexit_impl() for us. It has a number of limitations that are
|
|
||||||
// difficult to impossible to address without ..._impl():
|
|
||||||
//
|
|
||||||
// - dso_symbol is ignored. This means that a shared library may be unloaded
|
|
||||||
// (via dlclose()) before its thread_local destructors have run.
|
|
||||||
//
|
|
||||||
// - thread_local destructors for the main thread are run by the destructor of
|
|
||||||
// a static object. This is later than expected; they should run before the
|
|
||||||
// destructors of any objects with static storage duration.
|
|
||||||
//
|
|
||||||
// - thread_local destructors on non-main threads run on the first iteration
|
|
||||||
// through the __libccpp_tls_key destructors.
|
|
||||||
// std::notify_all_at_thread_exit() and similar functions must be careful to
|
|
||||||
// wait until the second iteration to provide their intended ordering
|
|
||||||
// guarantees.
|
|
||||||
//
|
|
||||||
// Another limitation, though one shared with ..._impl(), is that any
|
|
||||||
// thread_locals that are first initialized after non-thread_local global
|
|
||||||
// destructors begin to run will not be destroyed. [basic.start.term] states
|
|
||||||
// that all thread_local destructors are sequenced before the destruction of
|
|
||||||
// objects with static storage duration, resulting in a contradiction if a
|
|
||||||
// thread_local is constructed after that point. Thus we consider such
|
|
||||||
// programs ill-formed, and don't bother to run those destructors. (If the
|
|
||||||
// program terminates abnormally after such a thread_local is constructed,
|
|
||||||
// the destructor is not expected to run and thus there is no contradiction.
|
|
||||||
// So construction still has to work.)
|
|
||||||
|
|
||||||
struct DtorList {
|
|
||||||
Dtor dtor;
|
|
||||||
void* obj;
|
|
||||||
DtorList* next;
|
|
||||||
};
|
|
||||||
|
|
||||||
// The linked list of thread-local destructors to run
|
|
||||||
__thread DtorList* dtors = nullptr;
|
|
||||||
// True if the destructors are currently scheduled to run on this thread
|
|
||||||
__thread bool dtors_alive = false;
|
|
||||||
// Used to trigger destructors on thread exit; value is ignored
|
|
||||||
pthread_key_t dtors_key;
|
|
||||||
|
|
||||||
void run_dtors(void*) {
|
|
||||||
while (auto head = dtors) {
|
|
||||||
dtors = head->next;
|
|
||||||
head->dtor(head->obj);
|
|
||||||
std::free(head);
|
|
||||||
}
|
|
||||||
|
|
||||||
dtors_alive = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
struct DtorsManager {
|
|
||||||
DtorsManager() {
|
|
||||||
// There is intentionally no matching std::__libcpp_tls_delete call, as
|
|
||||||
// __cxa_thread_atexit() may be called arbitrarily late (for example, from
|
|
||||||
// global destructors or atexit() handlers).
|
|
||||||
if (pthread_key_create(&dtors_key, run_dtors) != 0) {
|
|
||||||
abort();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
~DtorsManager() {
|
|
||||||
// std::__libcpp_tls_key destructors do not run on threads that call exit()
|
|
||||||
// (including when the main thread returns from main()), so we explicitly
|
|
||||||
// call the destructor here. This runs at exit time (potentially earlier
|
|
||||||
// if libc++abi is dlclose()'d). Any thread_locals initialized after this
|
|
||||||
// point will not be destroyed.
|
|
||||||
run_dtors(nullptr);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
} // namespace
|
|
||||||
|
|
||||||
|
|
||||||
extern "C"
|
|
||||||
{
|
|
||||||
int __cxa_thread_atexit_impl(Dtor dtor, void* obj, void* dso_symbol) throw()
|
|
||||||
{
|
|
||||||
// Initialize the dtors std::__libcpp_tls_key (uses __cxa_guard_*() for
|
|
||||||
// one-time initialization and __cxa_atexit() for destruction)
|
|
||||||
static DtorsManager manager;
|
|
||||||
|
|
||||||
if (!dtors_alive) {
|
|
||||||
if (pthread_setspecific(dtors_key, &dtors_key) != 0) {
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
dtors_alive = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
auto head = static_cast<DtorList*>(std::malloc(sizeof(DtorList)));
|
|
||||||
if (!head) {
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
head->dtor = dtor;
|
|
||||||
head->obj = obj;
|
|
||||||
head->next = dtors;
|
|
||||||
dtors = head;
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
int __attribute__((__weak__)) __cxa_thread_atexit(Dtor dtor, void* obj, void* dso_symbol) throw()
|
|
||||||
{
|
|
||||||
return __cxa_thread_atexit_impl(dtor, obj, dso_symbol);
|
|
||||||
}
|
|
||||||
} // extern "C"
|
|
Loading…
Reference in New Issue
Block a user