/*
  +----------------------------------------------------------------------+
  | Swoole                                                               |
  +----------------------------------------------------------------------+
  | This source file is subject to version 2.0 of the Apache license,    |
  | that is bundled with this package in the file LICENSE, and is        |
  | available through the world-wide-web at the following url:           |
  | http://www.apache.org/licenses/LICENSE-2.0.html                      |
  | If you did not receive a copy of the Apache2.0 license and are unable|
  | to obtain it through the world-wide-web, please send a note to       |
  | license@swoole.com so we can mail you a copy immediately.            |
  +----------------------------------------------------------------------+
  | Author: Tianfeng Han  <mikan.tenny@gmail.com>                        |
  +----------------------------------------------------------------------+
*/
#ifndef SWOOLE_CONFIG_H_
#define SWOOLE_CONFIG_H_

#ifndef __clang__
// gcc version check
#if defined(__GNUC__) && (__GNUC__ < 3 || (__GNUC__ == 4 && __GNUC_MINOR__ < 8))
#error "GCC 4.8 or later required"
#endif
#endif

#define SW_COROUTINE               1

#define SW_MAX_FDTYPE              32   // 32 kinds of event
#define SW_MAX_HOOK_TYPE           32
#define SW_ERROR_MSG_SIZE          16384
#define SW_MAX_FILE_CONTENT        (64*1024*1024) // for swoole_file_get_contents
#define SW_MAX_LISTEN_PORT         60000
#define SW_MAX_CONNECTION          100000
#define SW_MAX_CONCURRENT_TASK     1024
#define SW_STACK_BUFFER_SIZE       65536

#ifdef HAVE_MALLOC_TRIM
#define SW_USE_MALLOC_TRIM         1
#endif
#define SW_MALLOC_TRIM_INTERVAL    1
#define SW_MALLOC_TRIM_PAD         0
#define SW_USE_MONOTONIC_TIME      1

#define SW_SOCKET_OVERFLOW_WAIT    100
#define SW_SOCKET_MAX_DEFAULT      65536
#if defined(__MACH__) || defined(__FreeBSD__)
#define SW_SOCKET_BUFFER_SIZE      262144
#else
#define SW_SOCKET_BUFFER_SIZE      8388608
#endif
#define SW_SYSTEMD_FDS_START       3

#define SW_GLOBAL_MEMORY_PAGESIZE  (2*1024*1024) // global memory page
// #define SW_USE_HUGEPAGE

#define SW_MAX_THREAD_NCPU         4    // n * cpu_num
#define SW_MAX_WORKER_NCPU         1000 // n * cpu_num

#define SW_HOST_MAXSIZE            sizeof(((struct sockaddr_un *)NULL)->sun_path)  // Linux has 108 UNIX_PATH_MAX, but BSD/MacOS limit is only 104

#define SW_LOG_NO_SRCINFO          1 // no source info
#define SW_CLIENT_BUFFER_SIZE      65536
#define SW_CLIENT_CONNECT_TIMEOUT  0.5
#define SW_CLIENT_MAX_PORT         65535

// !!!Don't modify.----------------------------------------------------------
#ifdef __MACH__
#define SW_IPC_MAX_SIZE            2048  // MacOS
#else
#define SW_IPC_MAX_SIZE            8192  // for IPC, dgram and message-queue max size
#endif
#define SW_IPC_BUFFER_SIZE         (SW_IPC_MAX_SIZE - sizeof(struct _swDataHead))
// !!!End.-------------------------------------------------------------------

#define SW_BUFFER_SIZE_STD         8192
#define SW_BUFFER_SIZE_BIG         65536
#define SW_BUFFER_SIZE_UDP         65536
// #define SW_BUFFER_RECV_TIME

#define SW_SENDFILE_CHUNK_SIZE     65536
#define SW_SENDFILE_MAXLEN         4194304

#define SW_HASHMAP_KEY_MAXLEN      256
#define SW_HASHMAP_INIT_BUCKET_N   32  // hashmap bucket num (default value for init)

#define SW_DATA_EOF                "\r\n\r\n"
#define SW_DATA_EOF_MAXLEN         8

#define SW_TASKWAIT_TIMEOUT        0.5

#define SW_AIO_THREAD_MIN_NUM            4
#define SW_AIO_THREAD_MAX_NUM            1024
#define SW_AIO_MAX_FILESIZE              (4*1024*1024)
#define SW_AIO_EVENT_NUM                 128
#define SW_AIO_DEFAULT_CHUNK_SIZE        65536
#define SW_AIO_MAX_CHUNK_SIZE            (1*1024*1024)
#define SW_AIO_MAX_EVENTS                128
#define SW_AIO_HANDLER_MAX_SIZE          8
#define SW_THREADPOOL_QUEUE_LEN          10000
#define SW_IP_MAX_LENGTH                 46

#define SW_WORKER_WAIT_TIMEOUT           1000

#define SW_WORKER_USE_SIGNALFD           1
#define SW_WORKER_MAX_WAIT_TIME          30

#define SW_REACTOR_MAXEVENTS             4096
#define SW_SESSION_LIST_SIZE             (1*1024*1024)

#define SW_MSGMAX                        65536
#define SW_UNIXSOCK_MAX_BUF_SIZE         (2*1024*1024)

/**
 * The maximum number of Reactor threads
 * the number of the CPU cores threads will be started by default
 * number 8 is the maximum
 */
#define SW_REACTOR_MAX_THREAD            8

/**
 * Loops read data from the pipeline,
 * helping to alleviate pipeline cache congestion
 * reduce the pressure of interprocess communication
 */
#define SW_REACTOR_RECV_AGAIN            1
#define SW_REACTOR_SYNC_SEND             1    // direct send

/**
 * RINGBUFFER
 */
#define SW_RINGQUEUE_LEN                 1024
#define SW_RINGBUFFER_FREE_N_MAX         4     // when free_n > MAX, execute collect
#define SW_RINGBUFFER_WARNING            100

/**
 * ringbuffer memory pool size
 */
#define SW_BUFFER_OUTPUT_SIZE            (2*1024*1024)
#define SW_BUFFER_INPUT_SIZE             (2*1024*1024)
#define SW_BUFFER_MIN_SIZE               65536
#define SW_SEND_BUFFER_SIZE              65536

#define SW_BACKLOG                       512

/**
 * Whether to cycle accept
 * you can process the full listen queue in one time
 * for a large number of concurrent connections
 */
#define SW_ACCEPT_AGAIN                  1

/**
 * max accept times for single time
 */
#define SW_ACCEPT_MAX_COUNT              64

#define SW_TCP_KEEPCOUNT                 5
#define SW_TCP_KEEPIDLE                  3600 // 1 hour
#define SW_TCP_KEEPINTERVAL              60

#define SW_USE_EVENTFD                   1 // Whether to use eventfd for message notification, Linux 2.6.22 or later is required to support

#define SW_TASK_TMP_FILE                 "/tmp/swoole.task.XXXXXX"
#define SW_TASK_TMPDIR_SIZE              128

#define SW_FILE_CHUNK_SIZE               65536

#define SW_TABLE_CONFLICT_PROPORTION     0.2 // 20%
#define SW_TABLE_KEY_SIZE                64
#define SW_TABLE_USE_SPINLOCK            1

#define SW_SSL_BUFFER_SIZE               16384
#define SW_SSL_CIPHER_LIST               "EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH"
#define SW_SSL_ECDH_CURVE                "secp384r1"
#define SW_SSL_NPN_ADVERTISE             "\x08http/1.1"
#define SW_SSL_HTTP2_NPN_ADVERTISE       "\x02h2"

#define SW_SPINLOCK_LOOP_N               1024

#define SW_STRING_BUFFER_MAXLEN          (1024*1024*128)
#define SW_STRING_BUFFER_DEFAULT         128
#define SW_STRING_BUFFER_GARBAGE_MIN     (1024*64)
#define SW_STRING_BUFFER_GARBAGE_RATIO   4

#define SW_SIGNO_MAX                     128
#define SW_UNREGISTERED_SIGNAL_FMT       "Unable to find callback function for signal %s"

#define SW_DNS_HOST_BUFFER_SIZE          16
#define SW_DNS_SERVER_PORT               53
#define SW_DNS_DEFAULT_SERVER            "8.8.8.8"

/**
 * HTTP Protocol
 */
#define SW_HTTP_SERVER_SOFTWARE          "swoole-http-server"
#define SW_HTTP_PARAM_MAX_NUM            128
#define SW_HTTP_COOKIE_KEYLEN            128
#define SW_HTTP_COOKIE_VALLEN            4096
#define SW_HTTP_RESPONSE_INIT_SIZE       65536
#define SW_HTTP_HEADER_MAX_SIZE          65536
#define SW_HTTP_HEADER_KEY_SIZE          128
#define SW_HTTP_HEADER_VALUE_SIZE        4096
#define SW_HTTP_HEADER_BUFFER_SIZE       128
#define SW_HTTP_UPLOAD_TMPDIR_SIZE       256
#define SW_HTTP_DATE_FORMAT              "D, d M Y H:i:s T"
#define SW_HTTP_RFC1123_DATE_GMT         "%a, %d %b %Y %T GMT"
#define SW_HTTP_RFC1123_DATE_UTC         "%a, %d %b %Y %T UTC"
#define SW_HTTP_RFC850_DATE              "%A, %d-%b-%y %T GMT"
#define SW_HTTP_ASCTIME_DATE             "%a %b %e %T %Y"
// #define SW_HTTP_100_CONTINUE
#define SW_HTTP_SEND_TWICE               1

#define SW_HTTP_BAD_REQUEST_PACKET         "HTTP/1.1 400 Bad Request\r\n\r\n"
#define SW_HTTP_SERVICE_UNAVAILABLE_PACKET "HTTP/1.1 503 Service Unavailable\r\n\r\n"

/**
 * HTTP2 Protocol
 */
#define SW_HTTP2_DATA_BUFFER_SIZE              8192
#define SW_HTTP2_DEFAULT_HEADER_TABLE_SIZE     (1 << 12)
#define SW_HTTP2_MAX_MAX_CONCURRENT_STREAMS    128
#define SW_HTTP2_MAX_MAX_FRAME_SIZE            ((1u << 14))
#define SW_HTTP2_MAX_WINDOW_SIZE               ((1u << 31) - 1)
#define SW_HTTP2_DEFAULT_WINDOW_SIZE           65535
#define SW_HTTP2_DEFAULT_MAX_HEADER_LIST_SIZE  SW_HTTP2_DEFAULT_HEADER_TABLE_SIZE
#define SW_HTTP2_MAX_MAX_HEADER_LIST_SIZE      UINT32_MAX

#define SW_HTTP_CLIENT_USERAGENT             "swoole-http-client"
#define SW_HTTP_CLIENT_BOUNDARY_PREKEY       "----SwooleBoundary"
#define SW_HTTP_CLIENT_BOUNDARY_TOTAL_SIZE   39
#define SW_HTTP_FORM_RAW_DATA_FMT            "--%.*s\r\nContent-Disposition: form-data; name=\"%.*s\"\r\n\r\n"
#define SW_HTTP_FORM_RAW_DATA_FMT_LEN        8
#define SW_HTTP_FORM_FILE_DATA_FMT           "--%.*s\r\nContent-Disposition: form-data; name=\"%.*s\"; filename=\"%.*s\"\r\nContent-Type: %.*s\r\n\r\n"
#define SW_HTTP_FORM_FILE_DATA_FMT_LEN       16

#define SW_WEBSOCKET_SERVER_SOFTWARE     "swoole-websocket-server"
#define SW_WEBSOCKET_VERSION             "13"
#define SW_WEBSOCKET_KEY_LENGTH          16
#define SW_WEBSOCKET_QUEUE_SIZE          16

/**
 * MySQL Client
 */
#define SW_MYSQL_DEFAULT_PORT            3306
#define SW_MYSQL_CONNECT_TIMEOUT         1.0
#define SW_MYSQL_DEFAULT_CHARSET         33  // 0x21, utf8_general_ci

/**
 * Redis Client
 */
#define SW_REDIS_CONNECT_TIMEOUT         1.0

/**
 * PGSQL Client
 */
#define SW_PGSQL_CONNECT_TIMEOUT         3.0

/**
 * Coroutine
 */
#define SW_DEFAULT_C_STACK_SIZE          (2 *1024 * 1024)
#define SW_CORO_SWAP_BAILOUT
// #define SW_CORO_ZEND_TRY

#ifdef SW_DEBUG
#ifndef SW_LOG_TRACE_OPEN
#define SW_LOG_TRACE_OPEN                1
#endif
#endif

#endif /* SWOOLE_CONFIG_H_ */
