mirror of
https://github.com/cloudwu/skynet.git
synced 2026-07-22 02:53:09 +00:00
fix a legacy problem. make harbor service more stable
This commit is contained in:
@@ -690,21 +690,27 @@ mainloop(struct skynet_context * context, void * ud, int type, int session, uint
|
||||
harbor_command(h, msg,sz,session,source);
|
||||
return 0;
|
||||
}
|
||||
default: {
|
||||
case PTYPE_SYSTEM : {
|
||||
// remote message out
|
||||
const struct remote_message *rmsg = msg;
|
||||
if (rmsg->destination.handle == 0) {
|
||||
if (remote_send_name(h, source , rmsg->destination.name, type, session, rmsg->message, rmsg->sz)) {
|
||||
if (remote_send_name(h, source , rmsg->destination.name, rmsg->type, session, rmsg->message, rmsg->sz)) {
|
||||
return 0;
|
||||
}
|
||||
} else {
|
||||
if (remote_send_handle(h, source , rmsg->destination.handle, type, session, rmsg->message, rmsg->sz)) {
|
||||
if (remote_send_handle(h, source , rmsg->destination.handle, rmsg->type, session, rmsg->message, rmsg->sz)) {
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
skynet_free((void *)rmsg->message);
|
||||
return 0;
|
||||
}
|
||||
default:
|
||||
skynet_error(context, "recv invalid message from %x, type = %d", source, type);
|
||||
if (session != 0) {
|
||||
skynet_send(context,0,source,PTYPE_ERROR, session, NULL, 0);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -11,12 +11,15 @@
|
||||
static struct skynet_context * REMOTE = 0;
|
||||
static unsigned int HARBOR = ~0;
|
||||
|
||||
static inline int
|
||||
invalid_type(int type) {
|
||||
return type != PTYPE_SYSTEM && type != PTYPE_HARBOR;
|
||||
}
|
||||
|
||||
void
|
||||
skynet_harbor_send(struct remote_message *rmsg, uint32_t source, int session) {
|
||||
int type = rmsg->sz >> MESSAGE_TYPE_SHIFT;
|
||||
rmsg->sz &= MESSAGE_TYPE_MASK;
|
||||
assert(type != PTYPE_SYSTEM && type != PTYPE_HARBOR && REMOTE);
|
||||
skynet_context_send(REMOTE, rmsg, sizeof(*rmsg) , source, type , session);
|
||||
assert(invalid_type(rmsg->type) && REMOTE);
|
||||
skynet_context_send(REMOTE, rmsg, sizeof(*rmsg) , source, PTYPE_SYSTEM , session);
|
||||
}
|
||||
|
||||
int
|
||||
|
||||
@@ -16,6 +16,7 @@ struct remote_message {
|
||||
struct remote_name destination;
|
||||
const void * message;
|
||||
size_t sz;
|
||||
int type;
|
||||
};
|
||||
|
||||
void skynet_harbor_send(struct remote_message *rmsg, uint32_t source, int session);
|
||||
|
||||
@@ -718,7 +718,8 @@ skynet_send(struct skynet_context * context, uint32_t source, uint32_t destinati
|
||||
struct remote_message * rmsg = skynet_malloc(sizeof(*rmsg));
|
||||
rmsg->destination.handle = destination;
|
||||
rmsg->message = data;
|
||||
rmsg->sz = sz;
|
||||
rmsg->sz = sz & MESSAGE_TYPE_MASK;
|
||||
rmsg->type = sz >> MESSAGE_TYPE_SHIFT;
|
||||
skynet_harbor_send(rmsg, source, session);
|
||||
} else {
|
||||
struct skynet_message smsg;
|
||||
@@ -758,7 +759,8 @@ skynet_sendname(struct skynet_context * context, uint32_t source, const char * a
|
||||
copy_name(rmsg->destination.name, addr);
|
||||
rmsg->destination.handle = 0;
|
||||
rmsg->message = data;
|
||||
rmsg->sz = sz;
|
||||
rmsg->sz = sz & MESSAGE_TYPE_MASK;
|
||||
rmsg->type = sz >> MESSAGE_TYPE_SHIFT;
|
||||
|
||||
skynet_harbor_send(rmsg, source, session);
|
||||
return session;
|
||||
|
||||
Reference in New Issue
Block a user