|
@@ -36,7 +36,7 @@ static unsigned int getlocalIP(void)
|
|
|
// to the IP and port of the socket, in network byte order.
|
|
// to the IP and port of the socket, in network byte order.
|
|
|
struct evconnlistener *listener_create(struct event_base *evbase,
|
|
struct evconnlistener *listener_create(struct event_base *evbase,
|
|
|
unsigned short bindport, evconnlistener_cb cb, void *ctx,
|
|
unsigned short bindport, evconnlistener_cb cb, void *ctx,
|
|
|
- unsigned int *ip, unsigned short *boundport)
|
|
|
|
|
|
|
+ unsigned int *ip, unsigned short *boundport, bool multithread)
|
|
|
{
|
|
{
|
|
|
struct sockaddr_in sin;
|
|
struct sockaddr_in sin;
|
|
|
sin.sin_family = AF_INET;
|
|
sin.sin_family = AF_INET;
|
|
@@ -52,8 +52,9 @@ struct evconnlistener *listener_create(struct event_base *evbase,
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
struct evconnlistener *listener = evconnlistener_new_bind(evbase,
|
|
struct evconnlistener *listener = evconnlistener_new_bind(evbase,
|
|
|
- cb, ctx, LEV_OPT_CLOSE_ON_FREE|LEV_OPT_REUSEABLE, -1,
|
|
|
|
|
- (struct sockaddr*)&sin, sizeof(sin));
|
|
|
|
|
|
|
+ cb, ctx, LEV_OPT_CLOSE_ON_FREE|LEV_OPT_REUSEABLE|
|
|
|
|
|
+ (multithread ? LEV_OPT_THREADSAFE : 0),
|
|
|
|
|
+ -1, (struct sockaddr*)&sin, sizeof(sin));
|
|
|
if (!listener) {
|
|
if (!listener) {
|
|
|
perror("Unable to create listener");
|
|
perror("Unable to create listener");
|
|
|
return NULL;
|
|
return NULL;
|
|
@@ -74,7 +75,8 @@ struct evconnlistener *listener_create(struct event_base *evbase,
|
|
|
// Create a client connection to the given 6-byte ipport (4 byte IP, 2
|
|
// Create a client connection to the given 6-byte ipport (4 byte IP, 2
|
|
|
// byte port in network byte order).
|
|
// byte port in network byte order).
|
|
|
struct bufferevent *client_create(struct event_base *evbase,
|
|
struct bufferevent *client_create(struct event_base *evbase,
|
|
|
- unsigned char ipport[6], bufferevent_event_cb event_handler)
|
|
|
|
|
|
|
+ unsigned char ipport[6], bufferevent_event_cb event_handler,
|
|
|
|
|
+ bool multithread)
|
|
|
{
|
|
{
|
|
|
// Create a Controller client socket
|
|
// Create a Controller client socket
|
|
|
struct sockaddr_in client_sin;
|
|
struct sockaddr_in client_sin;
|
|
@@ -83,7 +85,7 @@ struct bufferevent *client_create(struct event_base *evbase,
|
|
|
memmove(&client_sin.sin_port, ipport+4, 2);
|
|
memmove(&client_sin.sin_port, ipport+4, 2);
|
|
|
|
|
|
|
|
struct bufferevent *client_bev = bufferevent_socket_new(evbase,
|
|
struct bufferevent *client_bev = bufferevent_socket_new(evbase,
|
|
|
- -1, BEV_OPT_CLOSE_ON_FREE);
|
|
|
|
|
|
|
+ -1, BEV_OPT_CLOSE_ON_FREE|(multithread ? BEV_OPT_THREADSAFE : 0));
|
|
|
|
|
|
|
|
if (bufferevent_socket_connect(client_bev,
|
|
if (bufferevent_socket_connect(client_bev,
|
|
|
(struct sockaddr *)&client_sin, sizeof(client_sin)) < 0) {
|
|
(struct sockaddr *)&client_sin, sizeof(client_sin)) < 0) {
|
|
@@ -102,7 +104,8 @@ struct bufferevent *client_create(struct event_base *evbase,
|
|
|
// fails. This function calls the libevent main loop, so it will only return
|
|
// fails. This function calls the libevent main loop, so it will only return
|
|
|
// when the program is finished.
|
|
// when the program is finished.
|
|
|
int controller_client(const char *controller_host,
|
|
int controller_client(const char *controller_host,
|
|
|
- unsigned short controller_port, bufferevent_event_cb event_handler)
|
|
|
|
|
|
|
+ unsigned short controller_port, bufferevent_event_cb event_handler,
|
|
|
|
|
+ bool multithread)
|
|
|
{
|
|
{
|
|
|
struct event_base *evbase = event_base_new();
|
|
struct event_base *evbase = event_base_new();
|
|
|
|
|
|
|
@@ -117,7 +120,7 @@ int controller_client(const char *controller_host,
|
|
|
controller_sin.sin_port = htons(controller_port);
|
|
controller_sin.sin_port = htons(controller_port);
|
|
|
|
|
|
|
|
struct bufferevent *controller_bev = bufferevent_socket_new(evbase,
|
|
struct bufferevent *controller_bev = bufferevent_socket_new(evbase,
|
|
|
- -1, BEV_OPT_CLOSE_ON_FREE);
|
|
|
|
|
|
|
+ -1, BEV_OPT_CLOSE_ON_FREE|(multithread ? BEV_OPT_THREADSAFE : 0));
|
|
|
|
|
|
|
|
if (bufferevent_socket_connect(controller_bev,
|
|
if (bufferevent_socket_connect(controller_bev,
|
|
|
(struct sockaddr *)&controller_sin, sizeof(controller_sin)) < 0) {
|
|
(struct sockaddr *)&controller_sin, sizeof(controller_sin)) < 0) {
|