mirror of
https://github.com/MariaDB/server.git
synced 2025-08-08 11:22:35 +03:00
Add ATTRIBUTE_NORETURN and ATTRIBUTE_COLD
ATTRIBUTE_NORETURN is supported on all platforms (MSVS and GCC-like). It declares that a function will not return; instead, the thread or the whole process will terminate. ATTRIBUTE_COLD is supported starting with GCC 4.3. It declares that a function is supposed to be executed rarely. Rarely used error-handling functions and functions that emit messages to the error log should be tagged such.
This commit is contained in:
@@ -574,15 +574,17 @@ struct st_replace *glob_replace= 0;
|
|||||||
void replace_strings_append(struct st_replace *rep, DYNAMIC_STRING* ds,
|
void replace_strings_append(struct st_replace *rep, DYNAMIC_STRING* ds,
|
||||||
const char *from, int len);
|
const char *from, int len);
|
||||||
|
|
||||||
static void cleanup_and_exit(int exit_code) __attribute__((noreturn));
|
ATTRIBUTE_NORETURN
|
||||||
|
static void cleanup_and_exit(int exit_code);
|
||||||
|
|
||||||
void really_die(const char *msg) __attribute__((noreturn));
|
ATTRIBUTE_NORETURN
|
||||||
|
void really_die(const char *msg);
|
||||||
void report_or_die(const char *fmt, ...) ATTRIBUTE_FORMAT(printf, 1, 2);
|
void report_or_die(const char *fmt, ...) ATTRIBUTE_FORMAT(printf, 1, 2);
|
||||||
void die(const char *fmt, ...) ATTRIBUTE_FORMAT(printf, 1, 2)
|
ATTRIBUTE_NORETURN ATTRIBUTE_FORMAT(printf, 1, 2)
|
||||||
__attribute__((noreturn));
|
void die(const char *fmt, ...);
|
||||||
static void make_error_message(char *buf, size_t len, const char *fmt, va_list args);
|
static void make_error_message(char *buf, size_t len, const char *fmt, va_list args);
|
||||||
void abort_not_supported_test(const char *fmt, ...) ATTRIBUTE_FORMAT(printf, 1, 2)
|
ATTRIBUTE_NORETURN ATTRIBUTE_FORMAT(printf, 1, 2)
|
||||||
__attribute__((noreturn));
|
void abort_not_supported_test(const char *fmt, ...);
|
||||||
void verbose_msg(const char *fmt, ...) ATTRIBUTE_FORMAT(printf, 1, 2);
|
void verbose_msg(const char *fmt, ...) ATTRIBUTE_FORMAT(printf, 1, 2);
|
||||||
void log_msg(const char *fmt, ...) ATTRIBUTE_FORMAT(printf, 1, 2);
|
void log_msg(const char *fmt, ...) ATTRIBUTE_FORMAT(printf, 1, 2);
|
||||||
|
|
||||||
|
@@ -148,6 +148,29 @@ struct my_aligned_storage
|
|||||||
#define MY_ALIGNED(size)
|
#define MY_ALIGNED(size)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifdef __GNUC__
|
||||||
|
# define ATTRIBUTE_NORETURN __attribute__((noreturn))
|
||||||
|
# if MY_GNUC_PREREQ(4,3)
|
||||||
|
/** Starting with GCC 4.3, the "cold" attribute is used to inform the
|
||||||
|
compiler that a function is unlikely executed. The function is
|
||||||
|
optimized for size rather than speed and on many targets it is placed
|
||||||
|
into special subsection of the text section so all cold functions
|
||||||
|
appears close together improving code locality of non-cold parts of
|
||||||
|
program. The paths leading to call of cold functions within code are
|
||||||
|
marked as unlikely by the branch prediction mechanism. optimize a
|
||||||
|
rarely invoked function for size instead for speed. */
|
||||||
|
# define ATTRIBUTE_COLD __attribute__((cold))
|
||||||
|
# endif
|
||||||
|
#elif defined _WIN32
|
||||||
|
# define ATTRIBUTE_NORETURN __declspec(noreturn)
|
||||||
|
#else
|
||||||
|
# define ATTRIBUTE_NORETURN /* empty */
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef ATTRIBUTE_COLD
|
||||||
|
# define ATTRIBUTE_COLD /* empty */
|
||||||
|
#endif
|
||||||
|
|
||||||
#include <my_attribute.h>
|
#include <my_attribute.h>
|
||||||
|
|
||||||
#endif /* MY_COMPILER_INCLUDED */
|
#endif /* MY_COMPILER_INCLUDED */
|
||||||
|
@@ -19,6 +19,6 @@
|
|||||||
#include "my_global.h" /* ulong */
|
#include "my_global.h" /* ulong */
|
||||||
|
|
||||||
void unireg_init(ulong options);
|
void unireg_init(ulong options);
|
||||||
void unireg_end(void) __attribute__((noreturn));
|
ATTRIBUTE_NORETURN void unireg_end(void);
|
||||||
|
|
||||||
#endif /* INIT_INCLUDED */
|
#endif /* INIT_INCLUDED */
|
||||||
|
@@ -1570,7 +1570,7 @@ static void close_server_sock();
|
|||||||
static void clean_up_mutexes(void);
|
static void clean_up_mutexes(void);
|
||||||
static void wait_for_signal_thread_to_end(void);
|
static void wait_for_signal_thread_to_end(void);
|
||||||
static void create_pid_file();
|
static void create_pid_file();
|
||||||
static void mysqld_exit(int exit_code) __attribute__((noreturn));
|
ATTRIBUTE_NORETURN static void mysqld_exit(int exit_code);
|
||||||
#endif
|
#endif
|
||||||
static void delete_pid_file(myf flags);
|
static void delete_pid_file(myf flags);
|
||||||
static void end_ssl();
|
static void end_ssl();
|
||||||
|
@@ -708,7 +708,7 @@ enum enum_query_type
|
|||||||
/* query_id */
|
/* query_id */
|
||||||
extern query_id_t global_query_id;
|
extern query_id_t global_query_id;
|
||||||
|
|
||||||
void unireg_end(void) __attribute__((noreturn));
|
ATTRIBUTE_NORETURN void unireg_end(void);
|
||||||
|
|
||||||
/* increment query_id and return it. */
|
/* increment query_id and return it. */
|
||||||
inline __attribute__((warn_unused_result)) query_id_t next_query_id()
|
inline __attribute__((warn_unused_result)) query_id_t next_query_id()
|
||||||
|
@@ -1005,7 +1005,7 @@ skip_flush:
|
|||||||
@param[in] size desired size in number of pages
|
@param[in] size desired size in number of pages
|
||||||
@param[out] success whether the operation succeeded
|
@param[out] success whether the operation succeeded
|
||||||
@return whether the operation should be retried */
|
@return whether the operation should be retried */
|
||||||
static UNIV_COLD __attribute__((warn_unused_result, nonnull))
|
static ATTRIBUTE_COLD __attribute__((warn_unused_result, nonnull))
|
||||||
bool
|
bool
|
||||||
fil_space_extend_must_retry(
|
fil_space_extend_must_retry(
|
||||||
fil_space_t* space,
|
fil_space_t* space,
|
||||||
|
@@ -102,7 +102,7 @@ then we will not allocate more extents
|
|||||||
@param[in,out] space tablespace
|
@param[in,out] space tablespace
|
||||||
@param[in,out] header tablespace header
|
@param[in,out] header tablespace header
|
||||||
@param[in,out] mtr mini-transaction */
|
@param[in,out] mtr mini-transaction */
|
||||||
static UNIV_COLD
|
static ATTRIBUTE_COLD
|
||||||
void
|
void
|
||||||
fsp_fill_free_list(
|
fsp_fill_free_list(
|
||||||
bool init_space,
|
bool init_space,
|
||||||
@@ -899,7 +899,7 @@ data file.
|
|||||||
@param[in,out] header tablespace header
|
@param[in,out] header tablespace header
|
||||||
@param[in,out] mtr mini-transaction
|
@param[in,out] mtr mini-transaction
|
||||||
@return true if success */
|
@return true if success */
|
||||||
static UNIV_COLD MY_ATTRIBUTE((warn_unused_result))
|
static ATTRIBUTE_COLD __attribute__((warn_unused_result))
|
||||||
bool
|
bool
|
||||||
fsp_try_extend_data_file_with_pages(
|
fsp_try_extend_data_file_with_pages(
|
||||||
fil_space_t* space,
|
fil_space_t* space,
|
||||||
@@ -932,7 +932,7 @@ fsp_try_extend_data_file_with_pages(
|
|||||||
@param[in,out] mtr mini-transaction
|
@param[in,out] mtr mini-transaction
|
||||||
@return number of pages added
|
@return number of pages added
|
||||||
@retval 0 if the tablespace was not extended */
|
@retval 0 if the tablespace was not extended */
|
||||||
UNIV_COLD MY_ATTRIBUTE((nonnull))
|
ATTRIBUTE_COLD __attribute__((nonnull))
|
||||||
static
|
static
|
||||||
ulint
|
ulint
|
||||||
fsp_try_extend_data_file(fil_space_t* space, fsp_header_t* header, mtr_t* mtr)
|
fsp_try_extend_data_file(fil_space_t* space, fsp_header_t* header, mtr_t* mtr)
|
||||||
|
@@ -271,7 +271,7 @@ innobase_get_int_col_max_value(
|
|||||||
const Field* field); /*!< in: MySQL field */
|
const Field* field); /*!< in: MySQL field */
|
||||||
|
|
||||||
/* Report an InnoDB error to the client by invoking my_error(). */
|
/* Report an InnoDB error to the client by invoking my_error(). */
|
||||||
static UNIV_COLD MY_ATTRIBUTE((nonnull))
|
static ATTRIBUTE_COLD __attribute__((nonnull))
|
||||||
void
|
void
|
||||||
my_error_innodb(
|
my_error_innodb(
|
||||||
/*============*/
|
/*============*/
|
||||||
|
@@ -172,7 +172,7 @@ btr_corruption_report(
|
|||||||
/*==================*/
|
/*==================*/
|
||||||
const buf_block_t* block, /*!< in: corrupted block */
|
const buf_block_t* block, /*!< in: corrupted block */
|
||||||
const dict_index_t* index) /*!< in: index tree */
|
const dict_index_t* index) /*!< in: index tree */
|
||||||
UNIV_COLD MY_ATTRIBUTE((nonnull));
|
ATTRIBUTE_COLD __attribute__((nonnull));
|
||||||
|
|
||||||
/** Assert that a B-tree page is not corrupted.
|
/** Assert that a B-tree page is not corrupted.
|
||||||
@param block buffer block containing a B-tree page
|
@param block buffer block containing a B-tree page
|
||||||
|
@@ -1867,7 +1867,7 @@ dict_set_corrupted(
|
|||||||
dict_index_t* index, /*!< in/out: index */
|
dict_index_t* index, /*!< in/out: index */
|
||||||
trx_t* trx, /*!< in/out: transaction */
|
trx_t* trx, /*!< in/out: transaction */
|
||||||
const char* ctx) /*!< in: context */
|
const char* ctx) /*!< in: context */
|
||||||
UNIV_COLD MY_ATTRIBUTE((nonnull));
|
ATTRIBUTE_COLD __attribute__((nonnull));
|
||||||
|
|
||||||
/** Flags an index corrupted in the data dictionary cache only. This
|
/** Flags an index corrupted in the data dictionary cache only. This
|
||||||
is used mostly to mark a corrupted index when index's own dictionary
|
is used mostly to mark a corrupted index when index's own dictionary
|
||||||
|
@@ -128,10 +128,8 @@ os_thread_join(
|
|||||||
/** Exits the current thread.
|
/** Exits the current thread.
|
||||||
@param[in] detach if true, the thread will be detached right before
|
@param[in] detach if true, the thread will be detached right before
|
||||||
exiting. If false, another thread is responsible for joining this thread */
|
exiting. If false, another thread is responsible for joining this thread */
|
||||||
void
|
ATTRIBUTE_NORETURN ATTRIBUTE_COLD
|
||||||
os_thread_exit(
|
void os_thread_exit(bool detach = true);
|
||||||
bool detach = true)
|
|
||||||
UNIV_COLD MY_ATTRIBUTE((noreturn));
|
|
||||||
|
|
||||||
/*****************************************************************//**
|
/*****************************************************************//**
|
||||||
Returns the thread identifier of current thread.
|
Returns the thread identifier of current thread.
|
||||||
|
@@ -101,7 +101,7 @@ row_log_online_op(
|
|||||||
const dtuple_t* tuple, /*!< in: index tuple */
|
const dtuple_t* tuple, /*!< in: index tuple */
|
||||||
trx_id_t trx_id) /*!< in: transaction ID for insert,
|
trx_id_t trx_id) /*!< in: transaction ID for insert,
|
||||||
or 0 for delete */
|
or 0 for delete */
|
||||||
UNIV_COLD MY_ATTRIBUTE((nonnull));
|
ATTRIBUTE_COLD __attribute__((nonnull));
|
||||||
|
|
||||||
/******************************************************//**
|
/******************************************************//**
|
||||||
Gets the error status of the online index rebuild log.
|
Gets the error status of the online index rebuild log.
|
||||||
@@ -137,7 +137,7 @@ row_log_table_delete(
|
|||||||
const ulint* offsets,/*!< in: rec_get_offsets(rec,index) */
|
const ulint* offsets,/*!< in: rec_get_offsets(rec,index) */
|
||||||
const byte* sys) /*!< in: DB_TRX_ID,DB_ROLL_PTR that should
|
const byte* sys) /*!< in: DB_TRX_ID,DB_ROLL_PTR that should
|
||||||
be logged, or NULL to use those in rec */
|
be logged, or NULL to use those in rec */
|
||||||
UNIV_COLD MY_ATTRIBUTE((nonnull(1,2,3)));
|
ATTRIBUTE_COLD __attribute__((nonnull(1,2,3)));
|
||||||
|
|
||||||
/******************************************************//**
|
/******************************************************//**
|
||||||
Logs an update operation to a table that is being rebuilt.
|
Logs an update operation to a table that is being rebuilt.
|
||||||
@@ -174,7 +174,7 @@ row_log_table_get_pk(
|
|||||||
byte* sys, /*!< out: DB_TRX_ID,DB_ROLL_PTR for
|
byte* sys, /*!< out: DB_TRX_ID,DB_ROLL_PTR for
|
||||||
row_log_table_delete(), or NULL */
|
row_log_table_delete(), or NULL */
|
||||||
mem_heap_t** heap) /*!< in/out: memory heap where allocated */
|
mem_heap_t** heap) /*!< in/out: memory heap where allocated */
|
||||||
UNIV_COLD MY_ATTRIBUTE((nonnull(1,2,5), warn_unused_result));
|
ATTRIBUTE_COLD __attribute__((nonnull(1,2,5), warn_unused_result));
|
||||||
|
|
||||||
/******************************************************//**
|
/******************************************************//**
|
||||||
Logs an insert to a table that is being rebuilt.
|
Logs an insert to a table that is being rebuilt.
|
||||||
@@ -195,7 +195,7 @@ row_log_table_blob_free(
|
|||||||
/*====================*/
|
/*====================*/
|
||||||
dict_index_t* index, /*!< in/out: clustered index, X-latched */
|
dict_index_t* index, /*!< in/out: clustered index, X-latched */
|
||||||
ulint page_no)/*!< in: starting page number of the BLOB */
|
ulint page_no)/*!< in: starting page number of the BLOB */
|
||||||
UNIV_COLD MY_ATTRIBUTE((nonnull));
|
ATTRIBUTE_COLD __attribute__((nonnull));
|
||||||
/******************************************************//**
|
/******************************************************//**
|
||||||
Notes that a BLOB is being allocated during online ALTER TABLE. */
|
Notes that a BLOB is being allocated during online ALTER TABLE. */
|
||||||
void
|
void
|
||||||
@@ -203,7 +203,7 @@ row_log_table_blob_alloc(
|
|||||||
/*=====================*/
|
/*=====================*/
|
||||||
dict_index_t* index, /*!< in/out: clustered index, X-latched */
|
dict_index_t* index, /*!< in/out: clustered index, X-latched */
|
||||||
ulint page_no)/*!< in: starting page number of the BLOB */
|
ulint page_no)/*!< in: starting page number of the BLOB */
|
||||||
UNIV_COLD MY_ATTRIBUTE((nonnull));
|
ATTRIBUTE_COLD __attribute__((nonnull));
|
||||||
|
|
||||||
/** Apply the row_log_table log to a table upon completing rebuild.
|
/** Apply the row_log_table log to a table upon completing rebuild.
|
||||||
@param[in] thr query graph
|
@param[in] thr query graph
|
||||||
|
@@ -319,7 +319,7 @@ void
|
|||||||
trx_undo_free_prepared(
|
trx_undo_free_prepared(
|
||||||
/*===================*/
|
/*===================*/
|
||||||
trx_t* trx) /*!< in/out: PREPARED transaction */
|
trx_t* trx) /*!< in/out: PREPARED transaction */
|
||||||
UNIV_COLD MY_ATTRIBUTE((nonnull));
|
ATTRIBUTE_COLD __attribute__((nonnull));
|
||||||
|
|
||||||
/* Forward declaration. */
|
/* Forward declaration. */
|
||||||
namespace undo {
|
namespace undo {
|
||||||
|
@@ -258,23 +258,6 @@ easy way to get it to work. See http://bugs.mysql.com/bug.php?id=52263. */
|
|||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(COMPILER_HINTS) \
|
|
||||||
&& defined __GNUC__ \
|
|
||||||
&& (__GNUC__ > 4 || __GNUC__ == 4 && __GNUC_MINOR__ >= 3)
|
|
||||||
|
|
||||||
/** Starting with GCC 4.3, the "cold" attribute is used to inform the
|
|
||||||
compiler that a function is unlikely executed. The function is
|
|
||||||
optimized for size rather than speed and on many targets it is placed
|
|
||||||
into special subsection of the text section so all cold functions
|
|
||||||
appears close together improving code locality of non-cold parts of
|
|
||||||
program. The paths leading to call of cold functions within code are
|
|
||||||
marked as unlikely by the branch prediction mechanism. optimize a
|
|
||||||
rarely invoked function for size instead for speed. */
|
|
||||||
# define UNIV_COLD MY_ATTRIBUTE((cold))
|
|
||||||
#else
|
|
||||||
# define UNIV_COLD /* empty */
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#define UNIV_INLINE static inline
|
#define UNIV_INLINE static inline
|
||||||
|
|
||||||
#define UNIV_WORD_SIZE SIZEOF_SIZE_T
|
#define UNIV_WORD_SIZE SIZEOF_SIZE_T
|
||||||
|
@@ -39,13 +39,13 @@ Created 1/30/1994 Heikki Tuuri
|
|||||||
|
|
||||||
/*************************************************************//**
|
/*************************************************************//**
|
||||||
Report a failed assertion. */
|
Report a failed assertion. */
|
||||||
|
ATTRIBUTE_NORETURN ATTRIBUTE_COLD __attribute__((nonnull(2)))
|
||||||
void
|
void
|
||||||
ut_dbg_assertion_failed(
|
ut_dbg_assertion_failed(
|
||||||
/*====================*/
|
/*====================*/
|
||||||
const char* expr, /*!< in: the failed assertion */
|
const char* expr, /*!< in: the failed assertion */
|
||||||
const char* file, /*!< in: source file containing the assertion */
|
const char* file, /*!< in: source file containing the assertion */
|
||||||
unsigned line) /*!< in: line number of the assertion */
|
unsigned line); /*!< in: line number of the assertion */
|
||||||
UNIV_COLD MY_ATTRIBUTE((nonnull(2), noreturn));
|
|
||||||
|
|
||||||
/** Abort execution if EXPR does not evaluate to nonzero.
|
/** Abort execution if EXPR does not evaluate to nonzero.
|
||||||
@param EXPR assertion expression that should hold */
|
@param EXPR assertion expression that should hold */
|
||||||
|
@@ -299,7 +299,7 @@ void
|
|||||||
ut_print_timestamp(
|
ut_print_timestamp(
|
||||||
/*===============*/
|
/*===============*/
|
||||||
FILE* file) /*!< in: file where to print */
|
FILE* file) /*!< in: file where to print */
|
||||||
UNIV_COLD MY_ATTRIBUTE((nonnull));
|
ATTRIBUTE_COLD __attribute__((nonnull));
|
||||||
|
|
||||||
#ifndef UNIV_INNOCHECKSUM
|
#ifndef UNIV_INNOCHECKSUM
|
||||||
|
|
||||||
@@ -505,6 +505,7 @@ use this class directly, instead use one of the derived classes. */
|
|||||||
class logger {
|
class logger {
|
||||||
public:
|
public:
|
||||||
template<typename T>
|
template<typename T>
|
||||||
|
ATTRIBUTE_COLD
|
||||||
logger& operator<<(const T& rhs)
|
logger& operator<<(const T& rhs)
|
||||||
{
|
{
|
||||||
m_oss << rhs;
|
m_oss << rhs;
|
||||||
@@ -515,6 +516,7 @@ public:
|
|||||||
@param[in] buf the buffer whose contents will be logged.
|
@param[in] buf the buffer whose contents will be logged.
|
||||||
@param[in] count the length of the buffer buf.
|
@param[in] count the length of the buffer buf.
|
||||||
@return the output stream into which buffer was written. */
|
@return the output stream into which buffer was written. */
|
||||||
|
ATTRIBUTE_COLD
|
||||||
std::ostream&
|
std::ostream&
|
||||||
write(
|
write(
|
||||||
const char* buf,
|
const char* buf,
|
||||||
@@ -527,6 +529,7 @@ public:
|
|||||||
@param[in] buf the buffer whose contents will be logged.
|
@param[in] buf the buffer whose contents will be logged.
|
||||||
@param[in] count the length of the buffer buf.
|
@param[in] count the length of the buffer buf.
|
||||||
@return the output stream into which buffer was written. */
|
@return the output stream into which buffer was written. */
|
||||||
|
ATTRIBUTE_COLD
|
||||||
std::ostream&
|
std::ostream&
|
||||||
write(
|
write(
|
||||||
const byte* buf,
|
const byte* buf,
|
||||||
@@ -539,6 +542,7 @@ public:
|
|||||||
protected:
|
protected:
|
||||||
/* This class must not be used directly, hence making the default
|
/* This class must not be used directly, hence making the default
|
||||||
constructor protected. */
|
constructor protected. */
|
||||||
|
ATTRIBUTE_COLD
|
||||||
logger() {}
|
logger() {}
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -555,6 +559,7 @@ statement. If a named object is created, then the log message will be emitted
|
|||||||
only when it goes out of scope or destroyed. */
|
only when it goes out of scope or destroyed. */
|
||||||
class info : public logger {
|
class info : public logger {
|
||||||
public:
|
public:
|
||||||
|
ATTRIBUTE_COLD
|
||||||
~info();
|
~info();
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -562,6 +567,7 @@ public:
|
|||||||
class info for further details. */
|
class info for further details. */
|
||||||
class warn : public logger {
|
class warn : public logger {
|
||||||
public:
|
public:
|
||||||
|
ATTRIBUTE_COLD
|
||||||
~warn();
|
~warn();
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -569,6 +575,7 @@ public:
|
|||||||
documentation of class info for further details. */
|
documentation of class info for further details. */
|
||||||
class error : public logger {
|
class error : public logger {
|
||||||
public:
|
public:
|
||||||
|
ATTRIBUTE_COLD
|
||||||
~error();
|
~error();
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -577,6 +584,7 @@ by crashing it. Use this class when MySQL server needs to be stopped
|
|||||||
immediately. Refer to the documentation of class info for usage details. */
|
immediately. Refer to the documentation of class info for usage details. */
|
||||||
class fatal : public logger {
|
class fatal : public logger {
|
||||||
public:
|
public:
|
||||||
|
ATTRIBUTE_NORETURN
|
||||||
~fatal();
|
~fatal();
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -584,10 +592,12 @@ public:
|
|||||||
warning message */
|
warning message */
|
||||||
class error_or_warn : public logger {
|
class error_or_warn : public logger {
|
||||||
public:
|
public:
|
||||||
|
ATTRIBUTE_COLD
|
||||||
error_or_warn(bool pred)
|
error_or_warn(bool pred)
|
||||||
: m_error(pred)
|
: m_error(pred)
|
||||||
{}
|
{}
|
||||||
|
|
||||||
|
ATTRIBUTE_COLD
|
||||||
~error_or_warn();
|
~error_or_warn();
|
||||||
private:
|
private:
|
||||||
const bool m_error;
|
const bool m_error;
|
||||||
@@ -597,10 +607,12 @@ private:
|
|||||||
error message. */
|
error message. */
|
||||||
class fatal_or_error : public logger {
|
class fatal_or_error : public logger {
|
||||||
public:
|
public:
|
||||||
|
ATTRIBUTE_COLD
|
||||||
fatal_or_error(bool pred)
|
fatal_or_error(bool pred)
|
||||||
: m_fatal(pred)
|
: m_fatal(pred)
|
||||||
{}
|
{}
|
||||||
|
|
||||||
|
ATTRIBUTE_COLD
|
||||||
~fatal_or_error();
|
~fatal_or_error();
|
||||||
private:
|
private:
|
||||||
const bool m_fatal;
|
const bool m_fatal;
|
||||||
|
@@ -174,9 +174,9 @@ os_thread_join(
|
|||||||
/** Exits the current thread.
|
/** Exits the current thread.
|
||||||
@param[in] detach if true, the thread will be detached right before
|
@param[in] detach if true, the thread will be detached right before
|
||||||
exiting. If false, another thread is responsible for joining this thread */
|
exiting. If false, another thread is responsible for joining this thread */
|
||||||
|
ATTRIBUTE_NORETURN
|
||||||
void
|
void
|
||||||
os_thread_exit(
|
os_thread_exit(bool detach)
|
||||||
bool detach)
|
|
||||||
{
|
{
|
||||||
#ifdef UNIV_DEBUG_THREAD_CREATION
|
#ifdef UNIV_DEBUG_THREAD_CREATION
|
||||||
ib::info() << "Thread exits, id "
|
ib::info() << "Thread exits, id "
|
||||||
|
@@ -158,7 +158,7 @@ TODO: Remove this function. Everything should use MYSQL_TYPE_NEWDECIMAL.
|
|||||||
@param[in] b_length length of b, in bytes (not UNIV_SQL_NULL)
|
@param[in] b_length length of b, in bytes (not UNIV_SQL_NULL)
|
||||||
@return positive, 0, negative, if a is greater, equal, less than b,
|
@return positive, 0, negative, if a is greater, equal, less than b,
|
||||||
respectively */
|
respectively */
|
||||||
static UNIV_COLD
|
static ATTRIBUTE_COLD
|
||||||
int
|
int
|
||||||
cmp_decimal(
|
cmp_decimal(
|
||||||
const byte* a,
|
const byte* a,
|
||||||
|
@@ -30,6 +30,7 @@ Created 1/30/1994 Heikki Tuuri
|
|||||||
|
|
||||||
/*************************************************************//**
|
/*************************************************************//**
|
||||||
Report a failed assertion. */
|
Report a failed assertion. */
|
||||||
|
ATTRIBUTE_NORETURN
|
||||||
void
|
void
|
||||||
ut_dbg_assertion_failed(
|
ut_dbg_assertion_failed(
|
||||||
/*====================*/
|
/*====================*/
|
||||||
|
@@ -834,6 +834,7 @@ error::~error()
|
|||||||
sql_print_error("InnoDB: %s", m_oss.str().c_str());
|
sql_print_error("InnoDB: %s", m_oss.str().c_str());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ATTRIBUTE_NORETURN
|
||||||
fatal::~fatal()
|
fatal::~fatal()
|
||||||
{
|
{
|
||||||
sql_print_error("[FATAL] InnoDB: %s", m_oss.str().c_str());
|
sql_print_error("[FATAL] InnoDB: %s", m_oss.str().c_str());
|
||||||
|
@@ -89,7 +89,7 @@ static int sort_record_index(MARIA_SORT_PARAM *sort_param, MARIA_PAGE *page,
|
|||||||
uint sortkey, File new_file,
|
uint sortkey, File new_file,
|
||||||
my_bool update_index);
|
my_bool update_index);
|
||||||
static my_bool write_log_record(HA_CHECK *param);
|
static my_bool write_log_record(HA_CHECK *param);
|
||||||
static void my_exit(int exit_code) __attribute__ ((noreturn));
|
ATTRIBUTE_NORETURN static void my_exit(int exit_code);
|
||||||
|
|
||||||
HA_CHECK check_param;
|
HA_CHECK check_param;
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user