bugfix: gate start

This commit is contained in:
云风
2013-08-23 10:40:14 +08:00
parent 35b0f28fcc
commit 1fc601612c
12 changed files with 46 additions and 540 deletions

View File

@@ -130,7 +130,7 @@ skynet_socket_close(struct skynet_context *ctx, int id) {
}
void
skynet_socket_accept(struct skynet_context *ctx, int id) {
skynet_socket_start(struct skynet_context *ctx, int id) {
uint32_t source = skynet_context_handle(ctx);
socket_server_accept(SOCKET_SERVER, source, id);
socket_server_start(SOCKET_SERVER, source, id);
}

View File

@@ -26,6 +26,6 @@ int skynet_socket_listen(struct skynet_context *ctx, const char *host, int port,
int skynet_socket_connect(struct skynet_context *ctx, const char *host, int port);
int skynet_socket_bind(struct skynet_context *ctx, int fd);
void skynet_socket_close(struct skynet_context *ctx, int id);
void skynet_socket_accept(struct skynet_context *ctx, int id);
void skynet_socket_start(struct skynet_context *ctx, int id);
#endif

View File

@@ -17,15 +17,15 @@
#define MAX_SOCKET_P 16
#define MAX_EVENT 64
#define MIN_READ_BUFFER 64
#define SOCKET_TYPE_INVALID 0
#define SOCKET_TYPE_RESERVE 1
#define SOCKET_TYPE_LISTEN 2
#define SOCKET_TYPE_CONNECTING 3
#define SOCKET_TYPE_CONNECTED 4
#define SOCKET_TYPE_HALFCLOSE 5
#define SOCKET_TYPE_BIND 6
#define SOCKET_TYPE_NOTACCEPT 7
#define SOCKET_TYPE_PLISTEN 2
#define SOCKET_TYPE_LISTEN 3
#define SOCKET_TYPE_CONNECTING 4
#define SOCKET_TYPE_CONNECTED 5
#define SOCKET_TYPE_HALFCLOSE 6
#define SOCKET_TYPE_PACCEPT 7
#define SOCKET_TYPE_BIND 8
#define MAX_SOCKET (1<<MAX_SOCKET_P)
@@ -90,7 +90,7 @@ struct request_bind {
uintptr_t opaque;
};
struct request_accept {
struct request_start {
int id;
uintptr_t opaque;
};
@@ -104,7 +104,7 @@ struct request_package {
struct request_close close;
struct request_listen listen;
struct request_bind bind;
struct request_accept accept;
struct request_start start;
} u;
};
@@ -197,7 +197,7 @@ force_close(struct socket_server *ss, struct socket *s, struct socket_message *r
FREE(tmp);
}
s->head = s->tail = NULL;
if (s->type != SOCKET_TYPE_NOTACCEPT) {
if (s->type != SOCKET_TYPE_PACCEPT && s->type != SOCKET_TYPE_PLISTEN) {
sp_del(ss->event_fd, s->fd);
}
if (s->type != SOCKET_TYPE_BIND) {
@@ -354,10 +354,11 @@ send_socket(struct socket_server *ss, struct request_send * request, struct sock
struct socket * s = &ss->slot[id % MAX_SOCKET];
if (s->type == SOCKET_TYPE_INVALID || s->id != id
|| s->type == SOCKET_TYPE_HALFCLOSE
|| s->type == SOCKET_TYPE_NOTACCEPT) {
|| s->type == SOCKET_TYPE_PACCEPT) {
FREE(request->buffer);
return -1;
}
assert(s->type != SOCKET_TYPE_PLISTEN && s->type != SOCKET_TYPE_LISTEN);
if (s->head == NULL) {
int n = write(s->fd, request->buffer, request->sz);
if (n<0) {
@@ -428,11 +429,11 @@ listen_socket(struct socket_server *ss, struct request_listen * request, struct
if (listen(listen_fd, request->backlog) == -1) {
goto _failed;
}
struct socket *s = new_fd(ss, id, listen_fd, request->opaque, true);
struct socket *s = new_fd(ss, id, listen_fd, request->opaque, false);
if (s == NULL) {
goto _failed;
}
s->type = SOCKET_TYPE_LISTEN;
s->type = SOCKET_TYPE_PLISTEN;
return -1;
_failed:
close(listen_fd);
@@ -491,7 +492,7 @@ bind_socket(struct socket_server *ss, struct request_bind *request, struct socke
}
static int
accept_socket(struct socket_server *ss, struct request_accept *request, struct socket_message *result) {
start_socket(struct socket_server *ss, struct request_start *request, struct socket_message *result) {
int id = request->id;
result->id = id;
result->opaque = request->opaque;
@@ -501,16 +502,17 @@ accept_socket(struct socket_server *ss, struct request_accept *request, struct s
if (s->type == SOCKET_TYPE_INVALID || s->id !=id) {
return SOCKET_ERROR;
}
if (s->type == SOCKET_TYPE_NOTACCEPT) {
if (s->type == SOCKET_TYPE_PACCEPT || s->type == SOCKET_TYPE_PLISTEN) {
if (sp_add(ss->event_fd, s->fd, s)) {
s->type = SOCKET_TYPE_INVALID;
return SOCKET_ERROR;
}
s->type = (s->type == SOCKET_TYPE_PACCEPT) ? SOCKET_TYPE_CONNECTED : SOCKET_TYPE_LISTEN;
s->opaque = request->opaque;
result->data = "start";
return SOCKET_OPEN;
}
s->type = SOCKET_TYPE_CONNECTED;
s->opaque = request->opaque;
result->data = "accept";
return SOCKET_OPEN;
return -1;
}
static void
@@ -542,8 +544,8 @@ ctrl_cmd(struct socket_server *ss, struct socket_message *result) {
block_readpipe(fd, buffer, len);
// ctrl command only exist in local fd, so don't worry about endian.
switch (type) {
case 'A':
return accept_socket(ss,(struct request_accept *)buffer, result);
case 'S':
return start_socket(ss,(struct request_start *)buffer, result);
case 'B':
return bind_socket(ss,(struct request_bind *)buffer, result);
case 'L':
@@ -661,7 +663,7 @@ report_accept(struct socket_server *ss, struct socket *s, struct socket_message
close(client_fd);
return 0;
}
ns->type = SOCKET_TYPE_NOTACCEPT;
ns->type = SOCKET_TYPE_PACCEPT;
result->opaque = s->opaque;
result->id = s->id;
result->ud = id;
@@ -824,11 +826,11 @@ socket_server_bind(struct socket_server *ss, uintptr_t opaque, int fd) {
}
void
socket_server_accept(struct socket_server *ss, uintptr_t opaque, int id) {
socket_server_start(struct socket_server *ss, uintptr_t opaque, int id) {
struct request_package request;
request.u.accept.id = id;
request.u.accept.opaque = opaque;
send_request(ss, &request, 'A', sizeof(request.u.accept));
request.u.start.id = id;
request.u.start.opaque = opaque;
send_request(ss, &request, 'S', sizeof(request.u.start));
}

View File

@@ -25,7 +25,7 @@ int socket_server_poll(struct socket_server *, struct socket_message *result);
void socket_server_exit(struct socket_server *);
void socket_server_close(struct socket_server *, uintptr_t opaque, int id);
void socket_server_accept(struct socket_server *, uintptr_t opaque, int id);
void socket_server_start(struct socket_server *, uintptr_t opaque, int id);
// return -1 when error
int socket_server_send(struct socket_server *, int id, const void * buffer, int sz);