@@ -87,10 +87,10 @@ int clock_gettime(clock_id_t which_clock, struct timespec *t);
#define SWOOLE_MAJOR_VERSION 4
#define SWOOLE_MINOR_VERSION 2
#define SWOOLE_RELEASE_VERSION 12
#define SWOOLE_RELEASE_VERSION 13
#define SWOOLE_EXTRA_VERSION " "
#define SWOOLE_VERSION " 4.2.12 "
#define SWOOLE_VERSION_ID 40212
#define SWOOLE_VERSION " 4.2.13 "
#define SWOOLE_VERSION_ID 40213
#define SWOOLE_BUG_REPORT \
" A bug occurred in Swoole-v" SWOOLE_VERSION " , please report it.\n " \
" The Swoole developers probably don't know about it,\n " \
@@ -148,7 +148,7 @@ typedef unsigned long ulong_t;
#endif
#define SW_START_LINE " -------------------------START----------------------------"
#define SW_END_LINE " -------------------------END- -----------------------------"
#define SW_END_LINE " --------------------------END -----------------------------"
#define SW_ECHO_RED " \e [31m%s \e [0m"
#define SW_ECHO_GREEN " \e [32m%s \e [0m"
#define SW_ECHO_YELLOW " \e [33m%s \e [0m"
@@ -180,25 +180,30 @@ typedef unsigned long ulong_t;
#include " array.h"
#include " error.h"
#define SW_MAX_UINT UINT_MAX
#define SW_MAX_INT INT_MAX
#define SW_MAX ( A, B ) ((A) > (B) ? (A) : (B))
#define SW_MIN ( A, B ) ((A) < (B) ? (A) : (B))
#ifndef MAX
#define MAX (A, B ) ((A) > (B) ? (A) : (B) )
#define MAX (A, B ) SW_MAX(A, B )
#endif
#ifndef MIN
#define MIN (A, B ) ((A) < (B) ? (A) : (B) )
#define MIN (A, B ) SW_MIN(A, B )
#endif
#ifdef SW_DEBUG
#define SW_ASSERT (e ) assert(e)
#else
#define SW_ASSERT (e )
#endif
#define SW_STRS (s ) s, sizeof (s)
#define SW_STRL (s ) s, sizeof (s)-1
#define SW_START_SLEEP usleep (100000 ) // sleep 1s,wait fork and pthread_create
/* -----------------------------------Memory------------------------------------*/
#define SW_MEM_ALIGNED_SIZE (size ) \
SW_MM_ALIGNED_SIZE_EX (size, 8 )
#define SW_MEM_ALIGNED_SIZE_EX (size, alignment ) \
(((size) + ((alignment) - 1LL )) & ~((alignment) - 1LL ))
#ifdef SW_USE_EMALLOC
#define sw_malloc emalloc
#define sw_free efree
@@ -219,8 +224,21 @@ typedef unsigned long ulong_t;
#endif
#endif
#define SW_MEM_ALIGNED_SIZE (size ) SW_MM_ALIGNED_SIZE_EX(size, 8 )
#define SW_MEM_ALIGNED_SIZE_EX (size, alignment ) (((size) + ((alignment) - 1LL )) & ~((alignment) - 1LL ))
/* ----------------------------------String-------------------------------------*/
#define SW_STRS (s ) s, sizeof (s)
#define SW_STRL (s ) s, sizeof (s)-1
#if defined(SW_USE_JEMALLOC) || defined(SW_USE_TCMALLOC)
#define sw_strdup swoole_strdup
#define sw_strndup swoole_strndup
#else
#define sw_strdup strdup
#define sw_strndup strndup
#endif
/* * always return less than size */
size_t sw_snprintf (char *buf, size_t s, const char *format, ...);
static sw_inline char * swoole_strdup (const char *s)
{
@@ -238,17 +256,8 @@ static sw_inline char* swoole_strndup(const char *s, size_t n)
return p;
}
#if defined(SW_USE_JEMALLOC) || defined(SW_USE_TCMALLOC)
#define sw_strdup swoole_strdup
#define sw_strndup swoole_strndup
#else
#define sw_strdup strdup
#define sw_strndup strndup
#endif
/* --------------------------------Constants------------------------------------*/
#define METHOD_DEF (class,name,...) class##_##name(class *object, ##__VA_ARGS__)
#define METHOD (class,name,...) class##_##name(object, ##__VA_ARGS__)
// -------------------------------------------------------------------------------
#define SW_OK 0
#define SW_ERR -1
#define SW_AGAIN -2
@@ -297,11 +306,13 @@ enum swBool_type
enum swEvent_type
{
SW_EVENT_DEAULT = 256 ,
SW_EVENT_READ = 1u << 9 ,
SW_EVENT_WRITE = 1u << 10 ,
SW_EVENT_ERROR = 1u << 11 ,
SW_EVENT_ONCE = 1u << 12 ,
SW_EVENT_NULL = 0 ,
SW_EVENT_DEAULT = 1u << 8 ,
SW_EVENT_READ = 1u << 9 ,
SW_EVENT_WRITE = 1u << 10 ,
SW_EVENT_RDWR = SW_EVENT_READ | SW_EVENT_WRITE,
SW_EVENT_ERROR = 1u << 11 ,
SW_EVENT_ONCE = 1u << 12 ,
};
enum swPipe_type
@@ -385,11 +396,11 @@ enum swWorker_status
SwooleGS->lock_2 .unlock (&SwooleGS->lock_2 );\
exit (1 )
#define swSysError (str,...) SwooleGS->lock_2.lock(&SwooleGS->lock_2);\
#define swSysError (str,...) do { SwooleGS->lock_2 .lock (&SwooleGS->lock_2 );\
snprintf (sw_error,SW_ERROR_MSG_SIZE," %s (:%d ): " str " Error: %s [%d ]." ,__func__,__LINE__,##__VA_ARGS__,strerror (errno),errno);\
swLog_put (SW_LOG_ERROR, sw_error);\
SwooleG.error =errno;\
SwooleGS->lock_2 .unlock (&SwooleGS->lock_2 )
SwooleGS->lock_2 .unlock (&SwooleGS->lock_2 );} while ( 0 )
#define swoole_error_log (level, __errno, str, ...) do {SwooleG.error =__errno;\
if (level >= SwooleG.log_level ){\
@@ -643,7 +654,7 @@ typedef struct _swConnection
/* *
* memory buffer size;
*/
int buffer_size;
uint32_t buffer_size;
/* *
* upgarde websocket
@@ -722,7 +733,7 @@ static sw_inline size_t swoole_size_align(size_t size, int pagesize)
#define SW_STRINGCVL (s ) s->str + s->offset, s->length - s->offset
swString *swString_new (size_t size);
swString *swString_dup (const char *src_str, int length);
swString *swString_dup (const char *src_str, size_t length);
swString *swString_dup2 (swString *src);
void swString_print (swString *str);
@@ -756,6 +767,14 @@ static sw_inline int swString_extend_align(swString *str, size_t _new_size)
}
// ------------------------------Base--------------------------------
enum _swEventData_flag
{
SW_EVENT_DATA_NORMAL,
SW_EVENT_DATA_PTR = 1u << 1 ,
SW_EVENT_DATA_CHUNK = 1u << 2 ,
SW_EVENT_DATA_END = 1u << 3 ,
};
typedef struct _swDataHead
{
int fd;
@@ -780,21 +799,12 @@ typedef struct _swEvent
typedef struct _swEventData
{
swDataHead info;
char data[SW_BUFFER_SIZE ];
char data[SW_IPC_BUFFER_SIZE ];
} swEventData;
typedef struct _swDgramPacket
{
union
{
struct in6_addr v6;
struct in_addr v4;
struct
{
uint16_t path_length;
} un;
} addr;
uint16_t port;
swSocketAddress info;
uint32_t length;
char data[0 ];
} swDgramPacket;
@@ -1399,30 +1409,14 @@ int swSocket_recv_blocking(int fd, void *__data, size_t __len, int flags);
static sw_inline int swWaitpid (pid_t __pid, int *__stat_loc, int __options)
{
int ret;
do
{
ret = waitpid (__pid, __stat_loc, __options);
if (ret < 0 && errno == EINTR)
{
continue ;
}
break ;
} while (1 );
do { ret = waitpid (__pid, __stat_loc, __options); } while (ret < 0 && errno == EINTR);
return ret;
}
static sw_inline int swKill (pid_t __pid, int __sig)
{
int ret;
do
{
ret = kill (__pid, __sig);
if (ret < 0 && errno == EINTR)
{
continue ;
}
break ;
} while (1 );
do { ret = kill (__pid, __sig); } while (ret < 0 && errno == EINTR);
return ret;
}
#endif
@@ -1639,6 +1633,9 @@ struct _swProcessPool
uint8_t dispatch_mode;
uint8_t ipc_mode;
uint8_t started;
uint32_t reload_worker_i;
uint32_t max_wait_time;
swWorker *reload_workers;
/* *
* process type
@@ -1775,11 +1772,7 @@ static sw_inline swConnection* swReactor_get(swReactor *reactor, int fd)
return &reactor->socket_list [fd];
}
swConnection *socket = (swConnection*) swArray_alloc (reactor->socket_array , fd);
if (socket == NULL )
{
return NULL ;
}
if (!socket->active )
if (socket && !socket->active )
{
socket->fd = fd;
}
@@ -1900,6 +1893,26 @@ int swProcessPool_add_worker(swProcessPool *pool, swWorker *worker);
int swProcessPool_del_worker (swProcessPool *pool, swWorker *worker);
int swProcessPool_get_max_request (swProcessPool *pool);
static sw_inline void swProcessPool_set_start_id (swProcessPool *pool, int start_id)
{
int i;
pool->start_id = start_id;
for (i = 0 ; i < pool->worker_num ; i++)
{
pool->workers [i].id = pool->start_id + i;
}
}
static sw_inline void swProcessPool_set_type (swProcessPool *pool, int type)
{
int i;
pool->type = type;
for (i = 0 ; i < pool->worker_num ; i++)
{
pool->workers [i].type = type;
}
}
static sw_inline swWorker* swProcessPool_get_worker (swProcessPool *pool, int worker_id)
{
return &(pool->workers [worker_id - pool->start_id ]);
@@ -2021,6 +2034,13 @@ typedef struct _swTimer swTimer;
typedef struct _swTimer_node swTimer_node;
typedef void (*swTimerCallback)(swTimer *, swTimer_node *);
typedef void (*swTimerDtor)(swTimer_node *);
enum swTimer_type
{
SW_TIMER_TYPE_KERNEL,
SW_TIMER_TYPE_PHP,
};
struct _swTimer_node
{
@@ -2031,19 +2051,10 @@ struct _swTimer_node
int64_t interval;
uint64_t round ;
long id;
int type; // 0 normal node 1 node for client_coro
enum swTimer_type type;
uint8_t remove ;
};
enum swTimer_type
{
SW_TIMER_TYPE_KERNEL,
SW_TIMER_TYPE_PHP,
SW_TIMER_TYPE_CORO_READ,
SW_TIMER_TYPE_CORO_WRITE,
SW_TIMER_TYPE_CORO_ALL,
};
struct _swTimer
{
/* --------------signal timer--------------*/
@@ -2063,7 +2074,8 @@ struct _swTimer
};
swTimer_node* swTimer_add (swTimer *timer, long _msec, int interval, void *data, swTimerCallback callback);
int swTimer_del (swTimer *timer, swTimer_node *node);
enum swBool_type swTimer_del (swTimer *timer, swTimer_node *node);
enum swBool_type swTimer_del_ex (swTimer *timer, swTimer_node *node, swTimerDtor dtor);
void swTimer_free (swTimer *timer);
int swTimer_select (swTimer *timer);
int swTimer_now (struct timeval *time );
@@ -2123,8 +2135,6 @@ typedef struct
uint16_t id;
uint8_t type;
uint8_t update_time;
uint8_t factory_lock_target;
int16_t factory_target_worker;
swString *buffer_stack;
swReactor *reactor;
} swThreadG;