HomeServer/skynet-src/skynet_harbor.c

53 lines
1.1 KiB
C
Raw Normal View History

2024-11-20 15:41:09 +08:00
#include "skynet.h"
#include "skynet_harbor.h"
#include "skynet_server.h"
#include "skynet_mq.h"
#include "skynet_handle.h"
#include <string.h>
#include <stdio.h>
#include <assert.h>
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) {
assert(invalid_type(rmsg->type) && REMOTE);
skynet_context_send(REMOTE, rmsg, sizeof(*rmsg) , source, PTYPE_SYSTEM , session);
}
int
skynet_harbor_message_isremote(uint32_t handle) {
assert(HARBOR != ~0);
int h = (handle & ~HANDLE_MASK);
return h != HARBOR && h !=0;
}
void
skynet_harbor_init(int harbor) {
HARBOR = (unsigned int)harbor << HANDLE_REMOTE_SHIFT;
}
void
skynet_harbor_start(void *ctx) {
// the HARBOR must be reserved to ensure the pointer is valid.
// It will be released at last by calling skynet_harbor_exit
skynet_context_reserve(ctx);
REMOTE = ctx;
}
void
skynet_harbor_exit() {
struct skynet_context * ctx = REMOTE;
REMOTE= NULL;
if (ctx) {
skynet_context_release(ctx);
}
}