#include "jemalloc/internal/jemalloc_preamble.h"
#include "jemalloc/internal/malloc_io.h"
#include "jemalloc/internal/util.h"

/*
 * Define a custom assert() in order to reduce the chances of deadlock during
 * assertion failure.
 */
#ifndef assert
#	define assert(e)                                                            \
		do {                                                                 \
			if (unlikely(config_debug && !(e))) {                        \
				malloc_printf(                                       \
				    "<jemalloc>: %s:%d: Failed assertion: \"%s\"\n", \
				    __FILE__, __LINE__, #e);                         \
				abort();                                             \
			}                                                            \
		} while (0)
#endif

#ifndef not_reached
#	define not_reached()                                                        \
		do {                                                                 \
			if (config_debug) {                                          \
				malloc_printf(                                       \
				    "<jemalloc>: %s:%d: Unreachable code reached\n", \
				    __FILE__, __LINE__);                             \
				abort();                                             \
			}                                                            \
			unreachable();                                               \
		} while (0)
#endif

#ifndef not_implemented
#	define not_implemented()                                              \
		do {                                                           \
			if (config_debug) {                                    \
				malloc_printf(                                 \
				    "<jemalloc>: %s:%d: Not implemented\n",    \
				    __FILE__, __LINE__);                       \
				abort();                                       \
			}                                                      \
		} while (0)
#endif

#ifndef assert_not_implemented
#	define assert_not_implemented(e)                                      \
		do {                                                           \
			if (unlikely(config_debug && !(e))) {                  \
				not_implemented();                             \
			}                                                      \
		} while (0)
#endif

/* Use to assert a particular configuration, e.g., cassert(config_debug). */
#ifndef cassert
#	define cassert(c)                                                     \
		do {                                                           \
			if (unlikely(!(c))) {                                  \
				not_reached();                                 \
			}                                                      \
		} while (0)
#endif
