Skip to content

Commit

Permalink
Code optimization for header files (swoole#3051)
Browse files Browse the repository at this point in the history
* add callback

* fix tests

* Optimization

* Optimization [2]

* Optimization header file

* add header file

* Optimization header file [2]

* fix tests

* fix tests [2]

* fix tests [3]

* fix tests

* fix tests [2]
  • Loading branch information
matyhtf authored and twose committed Jan 13, 2020
1 parent 59c2c20 commit 873cc40
Show file tree
Hide file tree
Showing 45 changed files with 393 additions and 287 deletions.
4 changes: 2 additions & 2 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@ set_target_properties(lib-swoole PROPERTIES OUTPUT_NAME "swoole" VERSION ${SWOOL
target_link_libraries(lib-swoole ${SWOOLE_CLFLAGS})

# test_server
set(TEST_SRC_LIST examples/cpp/test_server.c)
set(TEST_SRC_LIST examples/cpp/test_server.cc)
add_executable(test_server ${TEST_SRC_LIST})
add_dependencies(test_server lib-swoole)
target_link_libraries(test_server ${SWOOLE_CLFLAGS} swoole)
Expand All @@ -54,7 +54,7 @@ set(ext_src_list php_swoole_cxx.cc
swoole.cc
swoole_async_coro.cc
swoole_atomic.cc
swoole_buffer.c
swoole_buffer.cc
swoole_channel_coro.cc
swoole_client.cc
swoole_client_coro.cc
Expand Down
6 changes: 3 additions & 3 deletions config.m4
Original file line number Diff line number Diff line change
Expand Up @@ -445,7 +445,7 @@ if test "$PHP_SWOOLE" != "no"; then
src/network/client.cc \
src/network/connection.cc \
src/network/dns.cc \
src/network/process_pool.c \
src/network/process_pool.cc \
src/network/stream.c \
src/network/thread_pool.c \
src/network/timer.c \
Expand All @@ -469,7 +469,7 @@ if test "$PHP_SWOOLE" != "no"; then
src/protocol/sha1.c \
src/protocol/socks5.c \
src/protocol/ssl.c \
src/protocol/websocket.c \
src/protocol/websocket.cc \
src/reactor/base.cc \
src/reactor/epoll.cc \
src/reactor/kqueue.c \
Expand All @@ -491,7 +491,7 @@ if test "$PHP_SWOOLE" != "no"; then
swoole.cc \
swoole_async_coro.cc \
swoole_atomic.cc \
swoole_buffer.c \
swoole_buffer.cc \
swoole_channel_coro.cc \
swoole_client.cc \
swoole_client_coro.cc \
Expand Down
2 changes: 1 addition & 1 deletion core-tests/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ project(core_tests)

#set(CMAKE_BUILD_TYPE Released)
set(CMAKE_CXX_STANDARD 11)
set(ROOT_DIR "..")
set(ROOT_DIR "${CMAKE_CURRENT_SOURCE_DIR}/..")

file(GLOB_RECURSE SOURCE_FILES FOLLOW_SYMLINKS src/*.cpp)

Expand Down
2 changes: 1 addition & 1 deletion core-tests/src/main.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
static int server_onReceive(swServer *serv, swEventData *req)
{
char *data;
size_t length = swWorker_get_data(serv, req, &data);
size_t length = serv->get_packet(serv, req, &data);

if (length >= sizeof("close") && memcmp(data, SW_STRS("close")) == 0)
{
Expand Down
2 changes: 1 addition & 1 deletion core-tests/src/server.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -119,7 +119,7 @@ int my_onPacket(swServer *serv, swEventData *req)
{
int serv_sock = req->info.server_fd;
char *data;
swWorker_get_data(serv, req, &data);
serv->get_packet(serv, req, &data);
swDgramPacket *packet = (swDgramPacket *) data;

int length;
Expand Down
2 changes: 1 addition & 1 deletion examples/cpp/test_server.c → examples/cpp/test_server.cc
Original file line number Diff line number Diff line change
Expand Up @@ -136,7 +136,7 @@ int my_onPacket(swServer *serv, swEventData *req)

swDgramPacket *packet;

swWorker_get_data(serv, req, &data);
serv->get_packet(serv, req, &data);
packet = (swDgramPacket*) data;

int serv_sock = req->info.server_fd;
Expand Down
1 change: 1 addition & 0 deletions include/error.h
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,7 @@ enum swErrorCode
SW_ERROR_SESSION_NOT_EXIST,
SW_ERROR_SESSION_INVALID_ID,
SW_ERROR_SESSION_DISCARD_TIMEOUT_DATA,
SW_ERROR_SESSION_DISCARD_DATA,
SW_ERROR_OUTPUT_BUFFER_OVERFLOW,
SW_ERROR_OUTPUT_SEND_YIELD,
SW_ERROR_SSL_NOT_READY,
Expand Down
3 changes: 0 additions & 3 deletions include/http.h
Original file line number Diff line number Diff line change
Expand Up @@ -131,9 +131,6 @@ static inline void swHttpRequest_clean(swHttpRequest *request)
memset(request, 0, offsetof(swHttpRequest, buffer));
}

int swHttp_static_handler_hit(swServer *serv, swHttpRequest *request, swConnection *conn);
int swHttp_static_handler_add_location(swServer *serv, const char *location, size_t length);

#ifdef SW_HTTP_100_CONTINUE
int swHttpRequest_has_expect_header(swHttpRequest *request);
#endif
Expand Down
116 changes: 37 additions & 79 deletions include/server.h
Original file line number Diff line number Diff line change
Expand Up @@ -14,14 +14,16 @@
+----------------------------------------------------------------------+
*/

#ifndef SW_SERVER_H_
#define SW_SERVER_H_
#pragma once

#include "swoole_api.h"
#include "buffer.h"
#include "connection.h"
#include "http.h"

SW_EXTERN_C_BEGIN
#include <string>
#include <unordered_map>
#include <unordered_set>

#define SW_REACTOR_NUM SW_CPU_NUM
#define SW_WORKER_NUM (SW_CPU_NUM*2)
Expand Down Expand Up @@ -55,14 +57,6 @@ enum swServer_event_type
SW_SERVER_EVENT_SHUTDOWN,
};

enum swIPC_type
{
SW_IPC_NONE = 0,
SW_IPC_UNIXSOCK = 1,
SW_IPC_MSGQUEUE = 2,
SW_IPC_SOCKET = 3,
};

enum swTask_ipc_mode
{
SW_TASK_IPC_UNIXSOCK = 1,
Expand All @@ -71,13 +65,6 @@ enum swTask_ipc_mode
SW_TASK_IPC_STREAM = 4,
};

enum swWorker_pipe_type
{
SW_PIPE_WORKER = 0,
SW_PIPE_MASTER = 1,
SW_PIPE_NONBLOCK = 2,
};

/**
* use swDataHead->from_fd, 1 byte 8 bit
*/
Expand Down Expand Up @@ -118,7 +105,7 @@ typedef struct _swReactorThread
int notify_pipe;
uint32_t pipe_num;
swSocket *pipe_sockets;
void *send_buffers;
std::unordered_map<int, swString *> *send_buffers;
} swReactorThread;

typedef struct _swListenPort
Expand Down Expand Up @@ -233,15 +220,6 @@ typedef struct _swUserWorker_node
swWorker *worker;
} swUserWorker_node;

typedef struct _swTask_sendfile
{
char *filename;
uint16_t name_len;
int fd;
size_t length;
off_t offset;
} swTask_sendfile;

typedef struct _swWorkerStopMessage
{
pid_t pid;
Expand All @@ -266,26 +244,25 @@ typedef struct _swPacket_ptr
swDataHead info;
swString data;
} swPacket_ptr;

//-----------------------------------Factory--------------------------------------------
struct _swFactory
struct swFactory
{
void *object;
void *ptr; //server object

int (*start)(struct _swFactory *);
int (*shutdown)(struct _swFactory *);
int (*dispatch)(struct _swFactory *, swSendData *);
int (*start)(swFactory *);
int (*shutdown)(swFactory *);
int (*dispatch)(swFactory *, swSendData *);
/**
* Returns the number of bytes sent
*/
int (*finish)(struct _swFactory *, swSendData *);
int (*notify)(struct _swFactory *, swDataHead *); //send a event notify
int (*end)(struct _swFactory *, int fd);
void (*free)(struct _swFactory *);
int (*finish)(swFactory *, swSendData *);
int (*notify)(swFactory *, swDataHead *); //send a event notify
int (*end)(swFactory *, int fd);
void (*free)(swFactory *);
};

typedef int (*swServer_dispatch_function)(swServer *, swConnection *, swSendData *);

int swFactory_create(swFactory *factory);
int swFactory_finish(swFactory *factory, swSendData *_send);
int swFactory_check_callback(swFactory *factory);
Expand Down Expand Up @@ -340,7 +317,7 @@ typedef struct _swServerGS

} swServerGS;

struct _swServer
struct swServer
{
/**
* reactor thread/process num
Expand Down Expand Up @@ -540,6 +517,9 @@ struct _swServer
swServerStats *stats;
swServerGS *gs;

std::unordered_set<std::string> *types;
std::unordered_set<std::string> *locations;

#ifdef HAVE_PTHREAD_BARRIER
pthread_barrier_t barrier;
#endif
Expand Down Expand Up @@ -619,10 +599,19 @@ struct _swServer
int (*close)(swServer *serv, int session_id, int reset);
int (*notify)(swServer *serv, swConnection *conn, int event);
int (*feedback)(swServer *serv, int session_id, int event);

/**
* Chunk control
*/
int (*merge_chunk)(swServer *serv, int key, const char *data, size_t len);
size_t (*get_packet)(swServer *serv, swEventData *req, char **data_ptr);
/**
* Hook
*/
int (*dispatch_func)(swServer *, swConnection *, swSendData *);
};

typedef int (*swServer_dispatch_function)(swServer *, swConnection *, swSendData *);

int swServer_master_onAccept(swReactor *reactor, swEvent *event);
void swServer_master_onTimer(swTimer *timer, swTimer_node *tnode);
int swServer_master_send(swServer *serv, swSendData *_send);
Expand Down Expand Up @@ -897,6 +886,9 @@ static sw_inline int swServer_worker_schedule(swServer *serv, int fd, swSendData
void swServer_worker_onStart(swServer *serv);
void swServer_worker_onStop(swServer *serv);

int swServer_http_static_handler_hit(swServer *serv, swHttpRequest *request, swConnection *conn);
int swServer_http_static_handler_add_location(swServer *serv, const char *location, size_t length);

int swWorker_onTask(swFactory *factory, swEventData *task);
void swWorker_stop(swWorker *worker);

Expand All @@ -907,41 +899,6 @@ static sw_inline swConnection *swWorker_get_connection(swServer *serv, int sessi
return conn;
}

static sw_inline swString *swWorker_get_buffer(swServer *serv, int reactor_id)
{
if (serv->factory_mode == SW_MODE_BASE)
{
return SwooleWG.buffer_input[0];
}
else
{
return SwooleWG.buffer_input[reactor_id];
}
}

static sw_inline size_t swWorker_get_data(swServer *serv, swEventData *req, char **data_ptr)
{
size_t length;
if (req->info.flags & SW_EVENT_DATA_PTR)
{
swPacket_ptr *task = (swPacket_ptr *) req;
*data_ptr = task->data.str;
length = task->data.length;
}
else if (req->info.flags & SW_EVENT_DATA_END)
{
swString *worker_buffer = swWorker_get_buffer(serv, req->info.reactor_id);
*data_ptr = worker_buffer->str;
length = worker_buffer->length;
}
else
{
*data_ptr = req->data;
length = req->info.len;
}
return length;
}

static sw_inline swConnection *swServer_connection_verify_no_ssl(swServer *serv, uint32_t session_id)
{
swSession *session = swServer_get_session(serv, session_id);
Expand Down Expand Up @@ -1034,6 +991,11 @@ static sw_inline uint8_t swServer_dispatch_mode_is_mod(swServer *serv)
return serv->dispatch_mode == SW_DISPATCH_FDMOD || serv->dispatch_mode == SW_DISPATCH_IPMOD;
}

static sw_inline swServer* sw_server()
{
return (swServer *) SwooleG.serv;
}

#define swServer_support_send_yield swServer_dispatch_mode_is_mod

//------------------------------------Listen Port-------------------------------------------
Expand Down Expand Up @@ -1073,7 +1035,3 @@ pid_t swManager_spawn_user_worker(swServer *serv, swWorker* worker);
pid_t swManager_spawn_task_worker(swServer *serv, swWorker* worker);
int swManager_wait_other_worker(swProcessPool *pool, pid_t pid, int status);
void swManager_kill_user_worker(swServer *serv);

SW_EXTERN_C_END

#endif /* SW_SERVER_H_ */
Loading

0 comments on commit 873cc40

Please sign in to comment.