diff options
author | Marko Mäkelä <marko.makela@mariadb.com> | 2020-08-04 07:55:16 +0300 |
---|---|---|
committer | Marko Mäkelä <marko.makela@mariadb.com> | 2020-08-04 07:55:16 +0300 |
commit | 9a7948e3f6d3fd7528e49f43eb4d41f8f55c8a35 (patch) | |
tree | 68f8e54f6c2484dc7791bee8c594d3d07c611d29 /include | |
parent | 56990b18d914b8150c9f777d134724d2b3390360 (diff) | |
parent | bbd70fcc43cc889e4593594ee5ca436fe1433aac (diff) | |
download | mariadb-git-9a7948e3f6d3fd7528e49f43eb4d41f8f55c8a35.tar.gz |
Merge 10.5 into 10.6
Diffstat (limited to 'include')
-rw-r--r-- | include/ilist.h | 103 | ||||
-rw-r--r-- | include/m_ctype.h | 18 | ||||
-rw-r--r-- | include/my_global.h | 2 | ||||
-rw-r--r-- | include/my_rdtsc.h | 14 | ||||
-rw-r--r-- | include/my_sys.h | 9 | ||||
-rw-r--r-- | include/my_time.h | 7 | ||||
-rw-r--r-- | include/mysql/psi/mysql_socket.h | 24 | ||||
-rw-r--r-- | include/mysql/service_wsrep.h | 5 | ||||
-rw-r--r-- | include/mysys_err.h | 3 | ||||
-rw-r--r-- | include/violite.h | 2 |
10 files changed, 121 insertions, 66 deletions
diff --git a/include/ilist.h b/include/ilist.h index 74cb472cd4e..822f0334022 100644 --- a/include/ilist.h +++ b/include/ilist.h @@ -16,7 +16,8 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1335 USA */ -#pragma once +#ifndef ILIST_H +#define ILIST_H #include <cstddef> #include <iterator> @@ -24,15 +25,17 @@ // Derive your class from this struct to insert to a linked list. template <class Tag= void> struct ilist_node { - ilist_node() + ilist_node() noexcept #ifndef DBUG_OFF - : - next(NULL), prev(NULL) + : next(NULL), prev(NULL) #endif { } - ilist_node(ilist_node *next, ilist_node *prev) : next(next), prev(prev) {} + ilist_node(ilist_node *next, ilist_node *prev) noexcept + : next(next), prev(prev) + { + } ilist_node *next; ilist_node *prev; @@ -70,40 +73,40 @@ public: typedef T *pointer; typedef T &reference; - Iterator(ListNode *node) : node_(node) {} + Iterator(ListNode *node) noexcept : node_(node) {} - Iterator &operator++() + Iterator &operator++() noexcept { node_= node_->next; return *this; } - Iterator operator++(int) + Iterator operator++(int) noexcept { Iterator tmp(*this); operator++(); return tmp; } - Iterator &operator--() + Iterator &operator--() noexcept { node_= node_->prev; return *this; } - Iterator operator--(int) + Iterator operator--(int) noexcept { Iterator tmp(*this); operator--(); return tmp; } - reference operator*() { return *static_cast<pointer>(node_); } - pointer operator->() { return static_cast<pointer>(node_); } + reference operator*() noexcept { return *static_cast<pointer>(node_); } + pointer operator->() noexcept { return static_cast<pointer>(node_); } - friend bool operator==(const Iterator &lhs, const Iterator &rhs) + friend bool operator==(const Iterator &lhs, const Iterator &rhs) noexcept { return lhs.node_ == rhs.node_; } - friend bool operator!=(const Iterator &lhs, const Iterator &rhs) + friend bool operator!=(const Iterator &lhs, const Iterator &rhs) noexcept { return !(lhs == rhs); } @@ -114,30 +117,36 @@ public: friend class ilist; }; - ilist() : sentinel_(&sentinel_, &sentinel_) {} + ilist() noexcept : sentinel_(&sentinel_, &sentinel_) {} - reference front() { return *begin(); } - reference back() { return *--end(); } - const_reference front() const { return *begin(); } - const_reference back() const { return *--end(); } + reference front() noexcept { return *begin(); } + reference back() noexcept { return *--end(); } + const_reference front() const noexcept { return *begin(); } + const_reference back() const noexcept { return *--end(); } - iterator begin() { return iterator(sentinel_.next); } - const_iterator begin() const + iterator begin() noexcept { return iterator(sentinel_.next); } + const_iterator begin() const noexcept { return iterator(const_cast<ListNode *>(sentinel_.next)); } - iterator end() { return iterator(&sentinel_); } - const_iterator end() const + iterator end() noexcept { return iterator(&sentinel_); } + const_iterator end() const noexcept { return iterator(const_cast<ListNode *>(&sentinel_)); } - reverse_iterator rbegin() { return reverse_iterator(end()); } - const_reverse_iterator rbegin() const { return reverse_iterator(end()); } - reverse_iterator rend() { return reverse_iterator(begin()); } - const_reverse_iterator rend() const { return reverse_iterator(begin()); } + reverse_iterator rbegin() noexcept { return reverse_iterator(end()); } + const_reverse_iterator rbegin() const noexcept + { + return reverse_iterator(end()); + } + reverse_iterator rend() noexcept { return reverse_iterator(begin()); } + const_reverse_iterator rend() const noexcept + { + return reverse_iterator(begin()); + } - bool empty() const { return sentinel_.next == &sentinel_; } + bool empty() const noexcept { return sentinel_.next == &sentinel_; } // Not implemented because it's O(N) // size_type size() const @@ -145,13 +154,13 @@ public: // return static_cast<size_type>(std::distance(begin(), end())); // } - void clear() + void clear() noexcept { sentinel_.next= &sentinel_; sentinel_.prev= &sentinel_; } - iterator insert(iterator pos, reference value) + iterator insert(iterator pos, reference value) noexcept { ListNode *curr= pos.node_; ListNode *prev= pos.node_->prev; @@ -165,7 +174,7 @@ public: return iterator(&value); } - iterator erase(iterator pos) + iterator erase(iterator pos) noexcept { ListNode *prev= pos.node_->prev; ListNode *next= pos.node_->next; @@ -182,15 +191,15 @@ public: return next; } - void push_back(reference value) { insert(end(), value); } - void pop_back() { erase(end()); } + void push_back(reference value) noexcept { insert(end(), value); } + void pop_back() noexcept { erase(end()); } - void push_front(reference value) { insert(begin(), value); } - void pop_front() { erase(begin()); } + void push_front(reference value) noexcept { insert(begin(), value); } + void pop_front() noexcept { erase(begin()); } // STL version is O(n) but this is O(1) because an element can't be inserted // several times in the same ilist. - void remove(reference value) { erase(iterator(&value)); } + void remove(reference value) noexcept { erase(iterator(&value)); } private: ListNode sentinel_; @@ -216,36 +225,38 @@ public: typedef std::reverse_iterator<iterator> reverse_iterator; typedef std::reverse_iterator<const iterator> const_reverse_iterator; - sized_ilist() : size_(0) {} + sized_ilist() noexcept : size_(0) {} - size_type size() const { return size_; } + size_type size() const noexcept { return size_; } - void clear() + void clear() noexcept { BASE::clear(); size_= 0; } - iterator insert(iterator pos, reference value) + iterator insert(iterator pos, reference value) noexcept { ++size_; return BASE::insert(pos, value); } - iterator erase(iterator pos) + iterator erase(iterator pos) noexcept { --size_; return BASE::erase(pos); } - void push_back(reference value) { insert(BASE::end(), value); } - void pop_back() { erase(BASE::end()); } + void push_back(reference value) noexcept { insert(BASE::end(), value); } + void pop_back() noexcept { erase(BASE::end()); } - void push_front(reference value) { insert(BASE::begin(), value); } - void pop_front() { erase(BASE::begin()); } + void push_front(reference value) noexcept { insert(BASE::begin(), value); } + void pop_front() noexcept { erase(BASE::begin()); } - void remove(reference value) { erase(iterator(&value)); } + void remove(reference value) noexcept { erase(iterator(&value)); } private: size_type size_; }; + +#endif diff --git a/include/m_ctype.h b/include/m_ctype.h index 8440efa971c..59ac7814aee 100644 --- a/include/m_ctype.h +++ b/include/m_ctype.h @@ -226,9 +226,14 @@ extern MY_UNI_CTYPE my_uni_ctype[256]; #define MY_CHARSET_UNDEFINED 0 /* Character repertoire flags */ -#define MY_REPERTOIRE_ASCII 1 /* Pure ASCII U+0000..U+007F */ -#define MY_REPERTOIRE_EXTENDED 2 /* Extended characters: U+0080..U+FFFF */ -#define MY_REPERTOIRE_UNICODE30 3 /* ASCII | EXTENDED: U+0000..U+FFFF */ +typedef enum enum_repertoire_t +{ + MY_REPERTOIRE_NONE= 0, + MY_REPERTOIRE_ASCII= 1, /* Pure ASCII U+0000..U+007F */ + MY_REPERTOIRE_EXTENDED= 2, /* Extended characters: U+0080..U+FFFF */ + MY_REPERTOIRE_UNICODE30= 3 /* ASCII | EXTENDED: U+0000..U+FFFF */ +} my_repertoire_t; + /* Flags for strxfrm */ #define MY_STRXFRM_LEVEL1 0x00000001 /* for primary weights */ @@ -1420,14 +1425,15 @@ my_bool my_propagate_complex(CHARSET_INFO *cs, const uchar *str, size_t len); typedef struct { size_t char_length; - uint repertoire; + my_repertoire_t repertoire; } MY_STRING_METADATA; void my_string_metadata_get(MY_STRING_METADATA *metadata, CHARSET_INFO *cs, const char *str, size_t len); -uint my_string_repertoire(CHARSET_INFO *cs, const char *str, size_t len); +my_repertoire_t my_string_repertoire(CHARSET_INFO *cs, + const char *str, size_t len); my_bool my_charset_is_ascii_based(CHARSET_INFO *cs); -uint my_charset_repertoire(CHARSET_INFO *cs); +my_repertoire_t my_charset_repertoire(CHARSET_INFO *cs); uint my_strxfrm_flag_normalize(uint flags, uint nlevels); void my_strxfrm_desc_and_reverse(uchar *str, uchar *strend, diff --git a/include/my_global.h b/include/my_global.h index 5d80b3881d4..86ef5f882f6 100644 --- a/include/my_global.h +++ b/include/my_global.h @@ -796,6 +796,8 @@ inline unsigned long long my_double2ulonglong(double d) #define LONGLONG_MIN ((long long) 0x8000000000000000LL) #define LONGLONG_MAX ((long long) 0x7FFFFFFFFFFFFFFFLL) #endif +/* Max length needed for a buffer to hold a longlong or ulonglong + end \0 */ +#define LONGLONG_BUFFER_SIZE 21 #if defined(HAVE_LONG_LONG) && !defined(ULONGLONG_MAX) /* First check for ANSI C99 definition: */ diff --git a/include/my_rdtsc.h b/include/my_rdtsc.h index a2e5afcb79f..33d722764d4 100644 --- a/include/my_rdtsc.h +++ b/include/my_rdtsc.h @@ -77,7 +77,7 @@ C_MODE_START /** A cycle timer. - On clang, we use __builtin_readcyclecounter(). + On clang we use __builtin_readcyclecounter(), except for AARCH64. On other compilers: On IA-32 and AMD64, we use the RDTSC instruction. @@ -88,6 +88,9 @@ C_MODE_START On IBM S/390 System z we use the STCK instruction. On ARM, we probably should use the Generic Timer, but should figure out how to ensure that it can be accessed. + On AARCH64, we use the generic timer base register. We override clang + implementation for aarch64 as it access a PMU register which is not + guarenteed to be active. Sadly, we have nothing for the Digital Alpha, MIPS, Motorola m68k, HP PA-RISC or other non-mainstream (or obsolete) processors. @@ -125,7 +128,7 @@ C_MODE_START */ static inline ulonglong my_timer_cycles(void) { -# if __has_builtin(__builtin_readcyclecounter) +# if __has_builtin(__builtin_readcyclecounter) && !defined (__aarch64__) return __builtin_readcyclecounter(); # elif defined _WIN32 || defined __i386__ || defined __x86_64__ return __rdtsc(); @@ -164,6 +167,12 @@ static inline ulonglong my_timer_cycles(void) __asm__ __volatile__ ("stck %0" : "=Q" (result) : : "cc"); return result; } +#elif defined(__GNUC__) && defined (__aarch64__) + { + ulonglong result; + __asm __volatile("mrs %0, CNTVCT_EL0" : "=&r" (result)); + return result; + } #elif defined(HAVE_SYS_TIMES_H) && defined(HAVE_GETHRTIME) /* gethrtime may appear as either cycle or nanosecond counter */ return (ulonglong) gethrtime(); @@ -221,6 +230,7 @@ C_MODE_END #define MY_TIMER_ROUTINE_MACH_ABSOLUTE_TIME 25 #define MY_TIMER_ROUTINE_GETSYSTEMTIMEASFILETIME 26 #define MY_TIMER_ROUTINE_ASM_S390 28 +#define MY_TIMER_ROUTINE_AARCH64 29 #endif diff --git a/include/my_sys.h b/include/my_sys.h index 7cd417fd9cb..9e26aa4f8f4 100644 --- a/include/my_sys.h +++ b/include/my_sys.h @@ -915,6 +915,9 @@ extern MYSQL_PLUGIN_IMPORT my_crc32_t my_checksum; #if defined(__GNUC__) && defined(HAVE_ARMV8_CRC) int crc32_aarch64_available(void); +#if defined(HAVE_ARMV8_CRYPTO) +int crc32c_aarch64_available(void); +#endif #endif #ifdef DBUG_ASSERT_EXISTS @@ -1053,9 +1056,13 @@ extern my_bool resolve_collation(const char *cl_name, CHARSET_INFO **cl); extern void free_charsets(void); extern char *get_charsets_dir(char *buf); -extern my_bool my_charset_same(CHARSET_INFO *cs1, CHARSET_INFO *cs2); +static inline my_bool my_charset_same(CHARSET_INFO *cs1, CHARSET_INFO *cs2) +{ + return (cs1->csname == cs2->csname); +} extern my_bool init_compiled_charsets(myf flags); extern void add_compiled_collation(struct charset_info_st *cs); +extern void add_compiled_extra_collation(struct charset_info_st *cs); extern size_t escape_string_for_mysql(CHARSET_INFO *charset_info, char *to, size_t to_length, const char *from, size_t length); diff --git a/include/my_time.h b/include/my_time.h index bad2b8bf4b0..b7b54db5586 100644 --- a/include/my_time.h +++ b/include/my_time.h @@ -233,9 +233,16 @@ static inline long my_time_fraction_remainder(long nr, uint decimals) DBUG_ASSERT(decimals <= TIME_SECOND_PART_DIGITS); return nr % (long) log_10_int[TIME_SECOND_PART_DIGITS - decimals]; } +static inline void my_datetime_trunc(MYSQL_TIME *ltime, uint decimals) +{ + ltime->second_part-= my_time_fraction_remainder(ltime->second_part, decimals); +} static inline void my_time_trunc(MYSQL_TIME *ltime, uint decimals) { ltime->second_part-= my_time_fraction_remainder(ltime->second_part, decimals); + if (!ltime->second_part && ltime->neg && + !ltime->hour && !ltime->minute && !ltime->second) + ltime->neg= FALSE; } static inline void my_timeval_trunc(struct timeval *tv, uint decimals) { diff --git a/include/mysql/psi/mysql_socket.h b/include/mysql/psi/mysql_socket.h index 765c5aa7793..aa85daaaab1 100644 --- a/include/mysql/psi/mysql_socket.h +++ b/include/mysql/psi/mysql_socket.h @@ -1135,10 +1135,14 @@ inline_mysql_socket_accept #else socket_accept.fd= accept(socket_listen.fd, addr, addr_len); #ifdef FD_CLOEXEC - flags= fcntl(socket_accept.fd, F_GETFD); - if (flags != -1) { - flags |= FD_CLOEXEC; - fcntl(socket_accept.fd, F_SETFD, flags); + if (socket_accept.fd != INVALID_SOCKET) + { + flags= fcntl(socket_accept.fd, F_GETFD); + if (flags != -1) + { + flags |= FD_CLOEXEC; + fcntl(socket_accept.fd, F_SETFD, flags); + } } #endif #endif @@ -1156,10 +1160,14 @@ inline_mysql_socket_accept #else socket_accept.fd= accept(socket_listen.fd, addr, addr_len); #ifdef FD_CLOEXEC - flags= fcntl(socket_accept.fd, F_GETFD); - if (flags != -1) { - flags |= FD_CLOEXEC; - fcntl(socket_accept.fd, F_SETFD, flags); + if (socket_accept.fd != INVALID_SOCKET) + { + flags= fcntl(socket_accept.fd, F_GETFD); + if (flags != -1) + { + flags |= FD_CLOEXEC; + fcntl(socket_accept.fd, F_SETFD, flags); + } } #endif #endif diff --git a/include/mysql/service_wsrep.h b/include/mysql/service_wsrep.h index 5ffa476fdfb..1b1d54c036b 100644 --- a/include/mysql/service_wsrep.h +++ b/include/mysql/service_wsrep.h @@ -87,6 +87,7 @@ extern struct wsrep_service_st { ulong (*wsrep_OSU_method_get_func)(const MYSQL_THD thd); my_bool (*wsrep_thd_has_ignored_error_func)(const MYSQL_THD thd); void (*wsrep_thd_set_ignored_error_func)(MYSQL_THD thd, my_bool val); + bool (*wsrep_thd_set_wsrep_aborter_func)(MYSQL_THD bf_thd, MYSQL_THD thd); } *wsrep_service; #define MYSQL_SERVICE_WSREP_INCLUDED @@ -130,6 +131,7 @@ extern struct wsrep_service_st { #define wsrep_OSU_method_get(T) wsrep_service->wsrep_OSU_method_get_func(T) #define wsrep_thd_has_ignored_error(T) wsrep_service->wsrep_thd_has_ignored_error_func(T) #define wsrep_thd_set_ignored_error(T,V) wsrep_service->wsrep_thd_set_ignored_error_func(T,V) +#define wsrep_thd_set_wsrep_aborter(T) wsrep_service->wsrep_thd_set_wsrep_aborter_func(T1, T2) #else #define MYSQL_SERVICE_WSREP_STATIC_INCLUDED @@ -181,6 +183,8 @@ extern "C" my_bool wsrep_thd_is_local(const MYSQL_THD thd); /* Return true if thd is in high priority mode */ /* todo: rename to is_high_priority() */ extern "C" my_bool wsrep_thd_is_applying(const MYSQL_THD thd); +/* set wsrep_aborter for the target THD */ +extern "C" bool wsrep_thd_set_wsrep_aborter(MYSQL_THD bf_thd, MYSQL_THD victim_thd); /* Return true if thd is in TOI mode */ extern "C" my_bool wsrep_thd_is_toi(const MYSQL_THD thd); /* Return true if thd is in replicating TOI mode */ @@ -224,5 +228,6 @@ extern "C" my_bool wsrep_thd_is_applying(const MYSQL_THD thd); extern "C" ulong wsrep_OSU_method_get(const MYSQL_THD thd); extern "C" my_bool wsrep_thd_has_ignored_error(const MYSQL_THD thd); extern "C" void wsrep_thd_set_ignored_error(MYSQL_THD thd, my_bool val); +extern "C" bool wsrep_thd_set_wsrep_aborter(MYSQL_THD bf_thd, MYSQL_THD victim_thd); #endif #endif /* MYSQL_SERVICE_WSREP_INCLUDED */ diff --git a/include/mysys_err.h b/include/mysys_err.h index 08463c9fedb..e0e97d0284a 100644 --- a/include/mysys_err.h +++ b/include/mysys_err.h @@ -72,7 +72,8 @@ extern const char *globerrs[]; /* my_error_messages is here */ #define EE_BADMEMORYRELEASE 36 #define EE_PERM_LOCK_MEMORY 37 #define EE_MEMCNTL 38 -#define EE_ERROR_LAST 38 /* Copy last error nr */ +#define EE_DUPLICATE_CHARSET 39 +#define EE_ERROR_LAST 39 /* Copy last error nr */ /* Add error numbers before EE_ERROR_LAST and change it accordingly. */ diff --git a/include/violite.h b/include/violite.h index c7feca683cc..6d09621bea6 100644 --- a/include/violite.h +++ b/include/violite.h @@ -112,9 +112,7 @@ my_bool vio_peer_addr(Vio *vio, char *buf, uint16 *port, size_t buflen); /* Wait for an I/O event notification. */ int vio_io_wait(Vio *vio, enum enum_vio_io_event event, int timeout); my_bool vio_is_connected(Vio *vio); -#ifndef DBUG_OFF ssize_t vio_pending(Vio *vio); -#endif /* Set timeout for a network operation. */ extern int vio_timeout(Vio *vio, uint which, int timeout_sec); extern void vio_set_wait_callback(void (*before_wait)(void), |