Skip to content

Commit 0c631fd

Browse files
author
Tor Didriksen
committed
WL#7755: mysqlpump: Extend mysqldump functionalities
Post push fix: copy all needed .cpp files into our own tree, so that it is possible to build with a standard boost installation (rather than from a boost source tree)
1 parent 99cff0b commit 0c631fd

File tree

13 files changed

+2771
-158
lines changed

13 files changed

+2771
-158
lines changed

client/CMakeLists.txt

Lines changed: 16 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -46,26 +46,28 @@ COPY_OPENSSL_DLLS(copy_openssl_client)
4646

4747
INCLUDE(${MYSQL_CMAKE_SCRIPT_DIR}/compile_flags.cmake)
4848

49+
SET(BOOST_SOURCES_DIR ${BOOST_PATCHES_DIR})
50+
4951
IF(WIN32)
5052
LIST(APPEND BOOST_THREAD_SOURCES
51-
${BOOST_INCLUDE_DIR}/libs/thread/src/win32/thread.cpp
52-
${BOOST_INCLUDE_DIR}/libs/thread/src/win32/tss_dll.cpp
53-
${BOOST_INCLUDE_DIR}/libs/thread/src/win32/tss_pe.cpp
53+
${BOOST_SOURCES_DIR}/libs/thread/src/win32/thread.cpp
54+
${BOOST_SOURCES_DIR}/libs/thread/src/win32/tss_dll.cpp
55+
${BOOST_SOURCES_DIR}/libs/thread/src/win32/tss_pe.cpp
5456
)
5557
ELSE()
5658
LIST(APPEND BOOST_THREAD_SOURCES
57-
${BOOST_INCLUDE_DIR}/libs/thread/src/pthread/once.cpp
58-
${BOOST_INCLUDE_DIR}/libs/thread/src/pthread/thread.cpp
59+
${BOOST_SOURCES_DIR}/libs/thread/src/pthread/once.cpp
60+
${BOOST_SOURCES_DIR}/libs/thread/src/pthread/thread.cpp
5961
)
6062
ENDIF()
6163

6264
SET(BOOST_LIB_SOURCES
63-
${CMAKE_SOURCE_DIR}/include/boost_1_57_0/libs/atomic/src/lockpool.cpp
64-
${BOOST_INCLUDE_DIR}/libs/chrono/src/chrono.cpp
65-
${BOOST_INCLUDE_DIR}/libs/chrono/src/process_cpu_clocks.cpp
66-
${BOOST_INCLUDE_DIR}/libs/chrono/src/thread_clock.cpp
67-
${BOOST_INCLUDE_DIR}/libs/system/src/error_code.cpp
68-
${BOOST_INCLUDE_DIR}/libs/thread/src/future.cpp
65+
${BOOST_SOURCES_DIR}/libs/atomic/src/lockpool.cpp
66+
${BOOST_SOURCES_DIR}/libs/chrono/src/chrono.cpp
67+
${BOOST_SOURCES_DIR}/libs/chrono/src/process_cpu_clocks.cpp
68+
${BOOST_SOURCES_DIR}/libs/chrono/src/thread_clock.cpp
69+
${BOOST_SOURCES_DIR}/libs/system/src/error_code.cpp
70+
${BOOST_SOURCES_DIR}/libs/thread/src/future.cpp
6971
)
7072

7173
ADD_CONVENIENCE_LIBRARY(boost_lib
@@ -82,7 +84,7 @@ SET_PROPERTY(TARGET boost_lib PROPERTY EXCLUDE_FROM_ALL TRUE)
8284
MY_CHECK_CXX_COMPILER_FLAG("-Wno-logical-op" HAVE_NO_LOGICAL_OP)
8385
IF(HAVE_NO_LOGICAL_OP)
8486
ADD_COMPILE_FLAGS(
85-
${BOOST_INCLUDE_DIR}/libs/thread/src/pthread/thread.cpp
87+
${BOOST_SOURCES_DIR}/libs/thread/src/pthread/thread.cpp
8688
COMPILE_FLAGS "-Wno-logical-op"
8789
)
8890
ENDIF()
@@ -91,8 +93,8 @@ ENDIF()
9193
MY_CHECK_CXX_COMPILER_FLAG("-Wno-unused-local-typedefs" HAVE_NO_UNUSED_TYPEDEFS)
9294
IF(HAVE_NO_UNUSED_TYPEDEFS)
9395
ADD_COMPILE_FLAGS(
94-
${BOOST_INCLUDE_DIR}/libs/thread/src/pthread/once.cpp
95-
${BOOST_INCLUDE_DIR}/libs/thread/src/pthread/thread.cpp
96+
${BOOST_SOURCES_DIR}/libs/thread/src/pthread/once.cpp
97+
${BOOST_SOURCES_DIR}/libs/thread/src/pthread/thread.cpp
9698
COMPILE_FLAGS "-Wno-unused-local-typedefs"
9799
)
98100
ENDIF()
Lines changed: 151 additions & 144 deletions
Original file line numberDiff line numberDiff line change
@@ -1,144 +1,151 @@
1-
/*
2-
* Distributed under the Boost Software License, Version 1.0.
3-
* (See accompanying file LICENSE_1_0.txt or copy at
4-
* http://www.boost.org/LICENSE_1_0.txt)
5-
*
6-
* Copyright (c) 2011 Helge Bahmann
7-
* Copyright (c) 2013-2014 Andrey Semashev
8-
*/
9-
/*!
10-
* \file lockpool.cpp
11-
*
12-
* This file contains implementation of the lockpool used to emulate atomic ops.
13-
*/
14-
15-
#include <cstddef>
16-
#include <boost/config.hpp>
17-
#include <boost/assert.hpp>
18-
#include <boost/memory_order.hpp>
19-
#include <boost/atomic/capabilities.hpp>
20-
21-
#if BOOST_ATOMIC_FLAG_LOCK_FREE == 2
22-
#include <boost/atomic/detail/operations_lockfree.hpp>
23-
#elif !defined(BOOST_HAS_PTHREADS)
24-
#error Boost.Atomic: Unsupported target platform, POSIX threads are required when native atomic operations are not available
25-
#else
26-
#include <pthread.h>
27-
#define BOOST_ATOMIC_USE_PTHREAD
28-
#endif
29-
30-
#include <boost/atomic/detail/lockpool.hpp>
31-
#include <boost/atomic/detail/pause.hpp>
32-
33-
namespace boost {
34-
namespace atomics {
35-
namespace detail {
36-
37-
namespace {
38-
39-
// This seems to be the maximum across all modern CPUs
40-
// NOTE: This constant is made as a macro because some compilers (gcc 4.4 for one) don't allow enums or namespace scope constants in alignment attributes
41-
#define BOOST_ATOMIC_CACHE_LINE_SIZE 64
42-
43-
template< unsigned int N >
44-
struct padding
45-
{
46-
char data[N];
47-
};
48-
template< >
49-
struct padding< 0 >
50-
{
51-
};
52-
53-
struct BOOST_ALIGNMENT(BOOST_ATOMIC_CACHE_LINE_SIZE) padded_lock
54-
{
55-
#if defined(BOOST_ATOMIC_USE_PTHREAD)
56-
typedef pthread_mutex_t lock_type;
57-
#else
58-
typedef atomics::detail::operations< 1u, false > operations;
59-
typedef operations::storage_type lock_type;
60-
#endif
61-
62-
lock_type lock;
63-
// The additional padding is needed to avoid false sharing between locks
64-
enum { padding_size = (sizeof(lock_type) <= BOOST_ATOMIC_CACHE_LINE_SIZE ?
65-
(BOOST_ATOMIC_CACHE_LINE_SIZE - sizeof(lock_type)) :
66-
(BOOST_ATOMIC_CACHE_LINE_SIZE - sizeof(lock_type) % BOOST_ATOMIC_CACHE_LINE_SIZE)) };
67-
padding< padding_size > pad;
68-
};
69-
70-
static padded_lock g_lock_pool[41]
71-
#if defined(BOOST_ATOMIC_USE_PTHREAD)
72-
=
73-
{
74-
{ PTHREAD_MUTEX_INITIALIZER }, { PTHREAD_MUTEX_INITIALIZER }, { PTHREAD_MUTEX_INITIALIZER }, { PTHREAD_MUTEX_INITIALIZER }, { PTHREAD_MUTEX_INITIALIZER },
75-
{ PTHREAD_MUTEX_INITIALIZER }, { PTHREAD_MUTEX_INITIALIZER }, { PTHREAD_MUTEX_INITIALIZER }, { PTHREAD_MUTEX_INITIALIZER }, { PTHREAD_MUTEX_INITIALIZER },
76-
{ PTHREAD_MUTEX_INITIALIZER }, { PTHREAD_MUTEX_INITIALIZER }, { PTHREAD_MUTEX_INITIALIZER }, { PTHREAD_MUTEX_INITIALIZER }, { PTHREAD_MUTEX_INITIALIZER },
77-
{ PTHREAD_MUTEX_INITIALIZER }, { PTHREAD_MUTEX_INITIALIZER }, { PTHREAD_MUTEX_INITIALIZER }, { PTHREAD_MUTEX_INITIALIZER }, { PTHREAD_MUTEX_INITIALIZER },
78-
{ PTHREAD_MUTEX_INITIALIZER }, { PTHREAD_MUTEX_INITIALIZER }, { PTHREAD_MUTEX_INITIALIZER }, { PTHREAD_MUTEX_INITIALIZER }, { PTHREAD_MUTEX_INITIALIZER },
79-
{ PTHREAD_MUTEX_INITIALIZER }, { PTHREAD_MUTEX_INITIALIZER }, { PTHREAD_MUTEX_INITIALIZER }, { PTHREAD_MUTEX_INITIALIZER }, { PTHREAD_MUTEX_INITIALIZER },
80-
{ PTHREAD_MUTEX_INITIALIZER }, { PTHREAD_MUTEX_INITIALIZER }, { PTHREAD_MUTEX_INITIALIZER }, { PTHREAD_MUTEX_INITIALIZER }, { PTHREAD_MUTEX_INITIALIZER },
81-
{ PTHREAD_MUTEX_INITIALIZER }, { PTHREAD_MUTEX_INITIALIZER }, { PTHREAD_MUTEX_INITIALIZER }, { PTHREAD_MUTEX_INITIALIZER }, { PTHREAD_MUTEX_INITIALIZER },
82-
{ PTHREAD_MUTEX_INITIALIZER }
83-
}
84-
#endif
85-
;
86-
87-
} // namespace
88-
89-
90-
#if !defined(BOOST_ATOMIC_USE_PTHREAD)
91-
92-
// NOTE: This function must NOT be inline. Otherwise MSVC 9 will sometimes generate broken code for modulus operation which result in crashes.
93-
BOOST_ATOMIC_DECL lockpool::scoped_lock::scoped_lock(const volatile void* addr) BOOST_NOEXCEPT :
94-
m_lock(&g_lock_pool[reinterpret_cast< std::size_t >(addr) % (sizeof(g_lock_pool) / sizeof(*g_lock_pool))].lock)
95-
{
96-
while (padded_lock::operations::test_and_set(*static_cast< padded_lock::lock_type* >(m_lock), memory_order_acquire))
97-
{
98-
atomics::detail::pause();
99-
}
100-
}
101-
102-
BOOST_ATOMIC_DECL lockpool::scoped_lock::~scoped_lock() BOOST_NOEXCEPT
103-
{
104-
padded_lock::operations::clear(*static_cast< padded_lock::lock_type* >(m_lock), memory_order_release);
105-
}
106-
107-
BOOST_ATOMIC_DECL void signal_fence() BOOST_NOEXCEPT;
108-
109-
#else // !defined(BOOST_ATOMIC_USE_PTHREAD)
110-
111-
BOOST_ATOMIC_DECL lockpool::scoped_lock::scoped_lock(const volatile void* addr) BOOST_NOEXCEPT :
112-
m_lock(&g_lock_pool[reinterpret_cast< std::size_t >(addr) % (sizeof(g_lock_pool) / sizeof(*g_lock_pool))].lock)
113-
{
114-
BOOST_VERIFY(pthread_mutex_lock(static_cast< pthread_mutex_t* >(m_lock)) == 0);
115-
}
116-
117-
BOOST_ATOMIC_DECL lockpool::scoped_lock::~scoped_lock() BOOST_NOEXCEPT
118-
{
119-
BOOST_VERIFY(pthread_mutex_unlock(static_cast< pthread_mutex_t* >(m_lock)) == 0);
120-
}
121-
122-
#endif // !defined(BOOST_ATOMIC_USE_PTHREAD)
123-
124-
BOOST_ATOMIC_DECL void lockpool::thread_fence() BOOST_NOEXCEPT
125-
{
126-
#if BOOST_ATOMIC_THREAD_FENCE > 0
127-
atomics::detail::thread_fence(memory_order_seq_cst);
128-
#else
129-
// Emulate full fence by locking/unlocking a mutex
130-
scoped_lock lock(0);
131-
#endif
132-
}
133-
134-
BOOST_ATOMIC_DECL void lockpool::signal_fence() BOOST_NOEXCEPT
135-
{
136-
// This function is intentionally non-inline, even if empty. This forces the compiler to treat its call as a compiler barrier.
137-
#if BOOST_ATOMIC_SIGNAL_FENCE > 0
138-
atomics::detail::signal_fence(memory_order_seq_cst);
139-
#endif
140-
}
141-
142-
} // namespace detail
143-
} // namespace atomics
144-
} // namespace boost
1+
/*
2+
* Distributed under the Boost Software License, Version 1.0.
3+
* (See accompanying file LICENSE_1_0.txt or copy at
4+
* http://www.boost.org/LICENSE_1_0.txt)
5+
*
6+
* Copyright (c) 2011 Helge Bahmann
7+
* Copyright (c) 2013-2014 Andrey Semashev
8+
*/
9+
/*!
10+
* \file lockpool.cpp
11+
*
12+
* This file contains implementation of the lockpool used to emulate atomic ops.
13+
*/
14+
15+
#include <cstddef>
16+
#include <boost/config.hpp>
17+
#include <boost/assert.hpp>
18+
#include <boost/memory_order.hpp>
19+
#include <boost/atomic/capabilities.hpp>
20+
21+
#if BOOST_ATOMIC_FLAG_LOCK_FREE == 2
22+
#include <boost/atomic/detail/operations_lockfree.hpp>
23+
#elif !defined(BOOST_HAS_PTHREADS)
24+
#error Boost.Atomic: Unsupported target platform, POSIX threads are required when native atomic operations are not available
25+
#else
26+
#include <pthread.h>
27+
#define BOOST_ATOMIC_USE_PTHREAD
28+
#endif
29+
30+
#include <boost/atomic/detail/lockpool.hpp>
31+
#include <boost/atomic/detail/pause.hpp>
32+
33+
namespace boost {
34+
namespace atomics {
35+
namespace detail {
36+
37+
namespace {
38+
39+
// This seems to be the maximum across all modern CPUs
40+
// NOTE: This constant is made as a macro because some compilers (gcc 4.4 for one) don't allow enums or namespace scope constants in alignment attributes
41+
#define BOOST_ATOMIC_CACHE_LINE_SIZE 64
42+
43+
#if defined(BOOST_ATOMIC_USE_PTHREAD)
44+
typedef pthread_mutex_t lock_type;
45+
#else
46+
typedef atomics::detail::operations< 1u, false > lock_operations;
47+
typedef lock_operations::storage_type lock_type;
48+
#endif
49+
50+
enum
51+
{
52+
padding_size = (sizeof(lock_type) <= BOOST_ATOMIC_CACHE_LINE_SIZE ?
53+
(BOOST_ATOMIC_CACHE_LINE_SIZE - sizeof(lock_type)) :
54+
(BOOST_ATOMIC_CACHE_LINE_SIZE - sizeof(lock_type) % BOOST_ATOMIC_CACHE_LINE_SIZE))
55+
};
56+
57+
template< unsigned int PaddingSize >
58+
struct BOOST_ALIGNMENT(BOOST_ATOMIC_CACHE_LINE_SIZE) padded_lock
59+
{
60+
lock_type lock;
61+
// The additional padding is needed to avoid false sharing between locks
62+
char padding[PaddingSize];
63+
};
64+
65+
template< >
66+
struct BOOST_ALIGNMENT(BOOST_ATOMIC_CACHE_LINE_SIZE) padded_lock< 0u >
67+
{
68+
lock_type lock;
69+
};
70+
71+
typedef padded_lock< padding_size > padded_lock_t;
72+
73+
static padded_lock_t g_lock_pool[41]
74+
#if defined(BOOST_ATOMIC_USE_PTHREAD)
75+
=
76+
{
77+
{ PTHREAD_MUTEX_INITIALIZER }, { PTHREAD_MUTEX_INITIALIZER }, { PTHREAD_MUTEX_INITIALIZER }, { PTHREAD_MUTEX_INITIALIZER }, { PTHREAD_MUTEX_INITIALIZER },
78+
{ PTHREAD_MUTEX_INITIALIZER }, { PTHREAD_MUTEX_INITIALIZER }, { PTHREAD_MUTEX_INITIALIZER }, { PTHREAD_MUTEX_INITIALIZER }, { PTHREAD_MUTEX_INITIALIZER },
79+
{ PTHREAD_MUTEX_INITIALIZER }, { PTHREAD_MUTEX_INITIALIZER }, { PTHREAD_MUTEX_INITIALIZER }, { PTHREAD_MUTEX_INITIALIZER }, { PTHREAD_MUTEX_INITIALIZER },
80+
{ PTHREAD_MUTEX_INITIALIZER }, { PTHREAD_MUTEX_INITIALIZER }, { PTHREAD_MUTEX_INITIALIZER }, { PTHREAD_MUTEX_INITIALIZER }, { PTHREAD_MUTEX_INITIALIZER },
81+
{ PTHREAD_MUTEX_INITIALIZER }, { PTHREAD_MUTEX_INITIALIZER }, { PTHREAD_MUTEX_INITIALIZER }, { PTHREAD_MUTEX_INITIALIZER }, { PTHREAD_MUTEX_INITIALIZER },
82+
{ PTHREAD_MUTEX_INITIALIZER }, { PTHREAD_MUTEX_INITIALIZER }, { PTHREAD_MUTEX_INITIALIZER }, { PTHREAD_MUTEX_INITIALIZER }, { PTHREAD_MUTEX_INITIALIZER },
83+
{ PTHREAD_MUTEX_INITIALIZER }, { PTHREAD_MUTEX_INITIALIZER }, { PTHREAD_MUTEX_INITIALIZER }, { PTHREAD_MUTEX_INITIALIZER }, { PTHREAD_MUTEX_INITIALIZER },
84+
{ PTHREAD_MUTEX_INITIALIZER }, { PTHREAD_MUTEX_INITIALIZER }, { PTHREAD_MUTEX_INITIALIZER }, { PTHREAD_MUTEX_INITIALIZER }, { PTHREAD_MUTEX_INITIALIZER },
85+
{ PTHREAD_MUTEX_INITIALIZER }
86+
}
87+
#endif
88+
;
89+
90+
} // namespace
91+
92+
93+
#if !defined(BOOST_ATOMIC_USE_PTHREAD)
94+
95+
// NOTE: This function must NOT be inline. Otherwise MSVC 9 will sometimes generate broken code for modulus operation which result in crashes.
96+
BOOST_ATOMIC_DECL lockpool::scoped_lock::scoped_lock(const volatile void* addr) BOOST_NOEXCEPT :
97+
m_lock(&g_lock_pool[reinterpret_cast< std::size_t >(addr) % (sizeof(g_lock_pool) / sizeof(*g_lock_pool))].lock)
98+
{
99+
while (lock_operations::test_and_set(*static_cast< lock_type* >(m_lock), memory_order_acquire))
100+
{
101+
do
102+
{
103+
atomics::detail::pause();
104+
}
105+
while (!!lock_operations::load(*static_cast< lock_type* >(m_lock), memory_order_relaxed));
106+
}
107+
}
108+
109+
BOOST_ATOMIC_DECL lockpool::scoped_lock::~scoped_lock() BOOST_NOEXCEPT
110+
{
111+
lock_operations::clear(*static_cast< lock_type* >(m_lock), memory_order_release);
112+
}
113+
114+
BOOST_ATOMIC_DECL void signal_fence() BOOST_NOEXCEPT;
115+
116+
#else // !defined(BOOST_ATOMIC_USE_PTHREAD)
117+
118+
BOOST_ATOMIC_DECL lockpool::scoped_lock::scoped_lock(const volatile void* addr) BOOST_NOEXCEPT :
119+
m_lock(&g_lock_pool[reinterpret_cast< std::size_t >(addr) % (sizeof(g_lock_pool) / sizeof(*g_lock_pool))].lock)
120+
{
121+
BOOST_VERIFY(pthread_mutex_lock(static_cast< pthread_mutex_t* >(m_lock)) == 0);
122+
}
123+
124+
BOOST_ATOMIC_DECL lockpool::scoped_lock::~scoped_lock() BOOST_NOEXCEPT
125+
{
126+
BOOST_VERIFY(pthread_mutex_unlock(static_cast< pthread_mutex_t* >(m_lock)) == 0);
127+
}
128+
129+
#endif // !defined(BOOST_ATOMIC_USE_PTHREAD)
130+
131+
BOOST_ATOMIC_DECL void lockpool::thread_fence() BOOST_NOEXCEPT
132+
{
133+
#if BOOST_ATOMIC_THREAD_FENCE > 0
134+
atomics::detail::thread_fence(memory_order_seq_cst);
135+
#else
136+
// Emulate full fence by locking/unlocking a mutex
137+
scoped_lock lock(0);
138+
#endif
139+
}
140+
141+
BOOST_ATOMIC_DECL void lockpool::signal_fence() BOOST_NOEXCEPT
142+
{
143+
// This function is intentionally non-inline, even if empty. This forces the compiler to treat its call as a compiler barrier.
144+
#if BOOST_ATOMIC_SIGNAL_FENCE > 0
145+
atomics::detail::signal_fence(memory_order_seq_cst);
146+
#endif
147+
}
148+
149+
} // namespace detail
150+
} // namespace atomics
151+
} // namespace boost
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
// chrono.cpp --------------------------------------------------------------//
2+
3+
// Copyright Beman Dawes 2008
4+
// Copyright Vicente J. Botet Escriba 2009-2010
5+
6+
// Distributed under the Boost Software License, Version 1.0.
7+
// See http://www.boost.org/LICENSE_1_0.txt
8+
9+
// define BOOST_CHRONO_SOURCE so that <boost/filesystem/config.hpp> knows
10+
// the library is being built (possibly exporting rather than importing code)
11+
12+
#define BOOST_CHRONO_SOURCE
13+
14+
#include <boost/chrono/detail/inlined/chrono.hpp>
15+
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
// boost process_cpu_clocks.cpp -----------------------------------------------------------//
2+
3+
// Copyright 2009-2010 Vicente J. Botet Escriba
4+
5+
// Distributed under the Boost Software License, Version 1.0.
6+
// See http://www.boost.org/LICENSE_1_0.txt
7+
8+
// See http://www.boost.org/libs/chrono for documentation.
9+
10+
//--------------------------------------------------------------------------------------//
11+
12+
// define BOOST_CHRONO_SOURCE so that <boost/chrono/config.hpp> knows
13+
// the library is being built (possibly exporting rather than importing code)
14+
15+
#define BOOST_CHRONO_SOURCE
16+
17+
#include <boost/chrono/detail/inlined/process_cpu_clocks.hpp>
18+

0 commit comments

Comments
 (0)