mirror of
https://github.com/MariaDB/server.git
synced 2025-08-26 01:44:06 +03:00
This is a backport of code from MySQL 6.0 with cleanups and extensions The following new options are supported configure options: --with-libevent ; Enable use of libevent, which is needed for pool of threads mysqld options: --thread-handling=pool-of-threads ; Use a pool of threads to handle queries --thread-pool-size=# ; Define how many threads should be created to handle all queries --extra-port=# ; Extra tcp port that uses the old one-thread-per-connection method --extra-max-connections=# ; Number of connections to accept to 'extra-port' --test-ignore-wrong-options ; Ignore setting an enum value to a wrong option (for mysql-test-run) BUILD/SETUP.sh: Added libevents (and thus pool-of-threads) to max builds CMakeLists.txt: Added libevent Makefile.am: Added libevents config/ac-macros/libevent.m4: Libevent code for configure config/ac-macros/libevent_configure.m4: Libevent code for configure configure.in: Added libevents dbug/dbug.c: Added _db_is_pushed(); Needed for pool-of-threads code extra/Makefile.am: Added libevents extra/libevent: Libevent initial code extra/libevent/CMakeLists.txt: Libevent initial code extra/libevent/Makefile.am: Libevent initial code extra/libevent/README: Libevent initial code extra/libevent/WIN32-Code: Libevent initial code extra/libevent/WIN32-Code/config.h: Libevent initial code extra/libevent/WIN32-Code/misc.c: Libevent initial code extra/libevent/WIN32-Code/misc.h: Libevent initial code extra/libevent/WIN32-Code/tree.h: Libevent initial code extra/libevent/WIN32-Code/win32.c: Libevent initial code extra/libevent/buffer.c: Libevent initial code extra/libevent/compat: Libevent initial code extra/libevent/compat/sys: Libevent initial code extra/libevent/compat/sys/_time.h: Libevent initial code extra/libevent/compat/sys/queue.h: Libevent initial code extra/libevent/compat/sys/tree.h: Libevent initial code extra/libevent/devpoll.c: Libevent initial code extra/libevent/epoll.c: Libevent initial code extra/libevent/epoll_sub.c: Libevent initial code extra/libevent/evbuffer.c: Libevent initial code extra/libevent/evdns.c: Libevent initial code extra/libevent/evdns.h: Libevent initial code extra/libevent/event-config.h: Libevent initial code extra/libevent/event-internal.h: Libevent initial code extra/libevent/event.c: Libevent initial code extra/libevent/event.h: Libevent initial code extra/libevent/event_tagging.c: Libevent initial code extra/libevent/evhttp.h: Libevent initial code extra/libevent/evport.c: Libevent initial code extra/libevent/evrpc-internal.h: Libevent initial code extra/libevent/evrpc.c: Libevent initial code extra/libevent/evrpc.h: Libevent initial code extra/libevent/evsignal.h: Libevent initial code extra/libevent/evutil.c: Libevent initial code extra/libevent/evutil.h: Libevent initial code extra/libevent/http-internal.h: Libevent initial code extra/libevent/http.c: Libevent initial code extra/libevent/kqueue.c: Libevent initial code extra/libevent/log.c: Libevent initial code extra/libevent/log.h: Libevent initial code extra/libevent/min_heap.h: Libevent initial code extra/libevent/poll.c: Libevent initial code extra/libevent/select.c: Libevent initial code extra/libevent/signal.c: Libevent initial code extra/libevent/strlcpy-internal.h: Libevent initial code extra/libevent/strlcpy.c: Libevent initial code include/config-win.h: Libevent support include/my_dbug.h: ADded _db_is_pushed include/mysql.h.pp: Update to handle new prototypes include/typelib.h: Split find_type_or_exit() into two functions include/violite.h: Added vio_is_pending() libmysqld/Makefile.am: Added libevent mysql-test/include/have_pool_of_threads.inc: Added test for pool-of-threads mysql-test/mysql-test-run.pl: Don't abort based on time and don't retry test cases when run under --gdb or --debug mysql-test/r/crash_commit_before.result: USE GLOBAL for debug variable mysql-test/r/have_pool_of_threads.require: Added test for pool-of-threads mysql-test/r/pool_of_threads.result: Added test for pool-of-threads mysql-test/r/subselect_debug.result: USE GLOBAL for debug variable mysql-test/t/crash_commit_before.test: USE GLOBAL for debug variable mysql-test/t/merge-big.test: USE GLOBAL for debug variable mysql-test/t/pool_of_threads-master.opt: Added test for pool-of-threads mysql-test/t/pool_of_threads.test: Added test for pool-of-threads mysys/typelib.c: Split find_type_or_exit() into find_type_with_warning() sql/Makefile.am: Added libevent sql/handler.cc: Indentation fix. Fixed memory loss bug Fixed crash on exit when handler plugin failed sql/mysql_priv.h: Added extra_max_connections and mysqld_extra_port Added extern functions from sql_connect.cc sql/mysqld.cc: Added support for new mysqld options Added code for 'extra-port' and 'extra-max-connections' Split some functions into smaller pieces to be able to reuse code Added code for test-ignore-wrong-options sql/scheduler.cc: Updated schduler code from MySQL 6.0 sql/scheduler.h: Updated schduler code from MySQL 6.0 sql/set_var.cc: Added support for changing "extra_max_connections" sql/sql_class.cc: Iniitalize thread schduler options in THD sql/sql_class.h: Added to extra_port and scheduler to 'THD' sql/sql_connect.cc: Use thd->schduler to check number of connections and terminate connection Made some local functions global (for scheduler.cc) vio/viosocket.c: Added 'vio_pending', needed for scheduler..c
175 lines
5.1 KiB
C
175 lines
5.1 KiB
C
/*
|
|
* Copyright (c) 2007 Niels Provos <provos@citi.umich.edu>
|
|
* All rights reserved.
|
|
*
|
|
* Redistribution and use in source and binary forms, with or without
|
|
* modification, are permitted provided that the following conditions
|
|
* are met:
|
|
* 1. Redistributions of source code must retain the above copyright
|
|
* notice, this list of conditions and the following disclaimer.
|
|
* 2. Redistributions in binary form must reproduce the above copyright
|
|
* notice, this list of conditions and the following disclaimer in the
|
|
* documentation and/or other materials provided with the distribution.
|
|
* 3. The name of the author may not be used to endorse or promote products
|
|
* derived from this software without specific prior written permission.
|
|
*
|
|
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
|
|
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
|
|
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
|
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
|
|
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
|
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
|
|
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
*/
|
|
#ifndef _EVUTIL_H_
|
|
#define _EVUTIL_H_
|
|
|
|
/** @file evutil.h
|
|
|
|
Common convenience functions for cross-platform portability and
|
|
related socket manipulations.
|
|
|
|
*/
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
#include <event-config.h>
|
|
#ifdef _EVENT_HAVE_SYS_TIME_H
|
|
#include <sys/time.h>
|
|
#endif
|
|
#ifdef _EVENT_HAVE_STDINT_H
|
|
#include <stdint.h>
|
|
#elif defined(_EVENT_HAVE_INTTYPES_H)
|
|
#include <inttypes.h>
|
|
#endif
|
|
#ifdef _EVENT_HAVE_SYS_TYPES_H
|
|
#include <sys/types.h>
|
|
#endif
|
|
|
|
#ifdef _EVENT_HAVE_UINT64_T
|
|
#define ev_uint64_t uint64_t
|
|
#define ev_int64_t int64_t
|
|
#elif defined(WIN32)
|
|
#define ev_uint64_t unsigned __int64
|
|
#define ev_int64_t __int64
|
|
#elif _EVENT_SIZEOF_LONG_LONG == 8
|
|
#define ev_uint64_t unsigned long long
|
|
#define ev_int64_t long long
|
|
#elif _EVENT_SIZEOF_LONG == 8
|
|
#define ev_uint64_t unsigned long
|
|
#define ev_int64_t long
|
|
#else
|
|
#error "No way to define ev_uint64_t"
|
|
#endif
|
|
|
|
#ifdef _EVENT_HAVE_UINT32_T
|
|
#define ev_uint32_t uint32_t
|
|
#elif defined(WIN32)
|
|
#define ev_uint32_t unsigned int
|
|
#elif _EVENT_SIZEOF_LONG == 4
|
|
#define ev_uint32_t unsigned long
|
|
#elif _EVENT_SIZEOF_INT == 4
|
|
#define ev_uint32_t unsigned int
|
|
#else
|
|
#error "No way to define ev_uint32_t"
|
|
#endif
|
|
|
|
#ifdef _EVENT_HAVE_UINT16_T
|
|
#define ev_uint16_t uint16_t
|
|
#elif defined(WIN32)
|
|
#define ev_uint16_t unsigned short
|
|
#elif _EVENT_SIZEOF_INT == 2
|
|
#define ev_uint16_t unsigned int
|
|
#elif _EVENT_SIZEOF_SHORT == 2
|
|
#define ev_uint16_t unsigned short
|
|
#else
|
|
#error "No way to define ev_uint16_t"
|
|
#endif
|
|
|
|
#ifdef _EVENT_HAVE_UINT8_T
|
|
#define ev_uint8_t uint8_t
|
|
#else
|
|
#define ev_uint8_t unsigned char
|
|
#endif
|
|
|
|
int evutil_socketpair(int d, int type, int protocol, int sv[2]);
|
|
int evutil_make_socket_nonblocking(int sock);
|
|
#ifdef WIN32
|
|
#define EVUTIL_CLOSESOCKET(s) closesocket(s)
|
|
#else
|
|
#define EVUTIL_CLOSESOCKET(s) close(s)
|
|
#endif
|
|
|
|
#ifdef WIN32
|
|
#define EVUTIL_SOCKET_ERROR() WSAGetLastError()
|
|
#define EVUTIL_SET_SOCKET_ERROR(errcode) \
|
|
do { WSASetLastError(errcode); } while (0)
|
|
#else
|
|
#define EVUTIL_SOCKET_ERROR() (errno)
|
|
#define EVUTIL_SET_SOCKET_ERROR(errcode) \
|
|
do { errno = (errcode); } while (0)
|
|
#endif
|
|
|
|
/*
|
|
* Manipulation functions for struct timeval
|
|
*/
|
|
#ifdef _EVENT_HAVE_TIMERADD
|
|
#define evutil_timeradd(tvp, uvp, vvp) timeradd((tvp), (uvp), (vvp))
|
|
#define evutil_timersub(tvp, uvp, vvp) timersub((tvp), (uvp), (vvp))
|
|
#else
|
|
#define evutil_timeradd(tvp, uvp, vvp) \
|
|
do { \
|
|
(vvp)->tv_sec = (tvp)->tv_sec + (uvp)->tv_sec; \
|
|
(vvp)->tv_usec = (tvp)->tv_usec + (uvp)->tv_usec; \
|
|
if ((vvp)->tv_usec >= 1000000) { \
|
|
(vvp)->tv_sec++; \
|
|
(vvp)->tv_usec -= 1000000; \
|
|
} \
|
|
} while (0)
|
|
#define evutil_timersub(tvp, uvp, vvp) \
|
|
do { \
|
|
(vvp)->tv_sec = (tvp)->tv_sec - (uvp)->tv_sec; \
|
|
(vvp)->tv_usec = (tvp)->tv_usec - (uvp)->tv_usec; \
|
|
if ((vvp)->tv_usec < 0) { \
|
|
(vvp)->tv_sec--; \
|
|
(vvp)->tv_usec += 1000000; \
|
|
} \
|
|
} while (0)
|
|
#endif /* !_EVENT_HAVE_HAVE_TIMERADD */
|
|
|
|
#ifdef _EVENT_HAVE_TIMERCLEAR
|
|
#define evutil_timerclear(tvp) timerclear(tvp)
|
|
#else
|
|
#define evutil_timerclear(tvp) (tvp)->tv_sec = (tvp)->tv_usec = 0
|
|
#endif
|
|
|
|
#ifdef _EVENT_HAVE_TIMERCMP
|
|
#define evutil_timercmp(tvp, uvp, cmp) timercmp((tvp), (uvp), cmp)
|
|
#else
|
|
#define evutil_timercmp(tvp, uvp, cmp) \
|
|
(((tvp)->tv_sec == (uvp)->tv_sec) ? \
|
|
((tvp)->tv_usec cmp (uvp)->tv_usec) : \
|
|
((tvp)->tv_sec cmp (uvp)->tv_sec))
|
|
#endif
|
|
|
|
#ifdef _EVENT_HAVE_TIMERISSET
|
|
#define evutil_timerisset(tvp) timerisset(tvp)
|
|
#else
|
|
#define evutil_timerisset(tvp) ((tvp)->tv_sec || (tvp)->tv_usec)
|
|
#endif
|
|
|
|
|
|
/* big-int related functions */
|
|
ev_int64_t evutil_strtoll(const char *s, char **endptr, int base);
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|
|
|
|
#endif /* _EVUTIL_H_ */
|