HARBOR_API int
harbor_init(struct harbor *h, struct skynet_context *ctx, const char * args) {
	h->ctx = ctx;
	int sz = strlen(args)+1;
	//char master_addr[sz];
	//char local_addr[sz];
	char master_addr[100];
	char local_addr[100];
	int harbor_id = 0;
	sscanf(args,"%s %s %d",master_addr, local_addr, &harbor_id);
	h->master_addr = skynet_strdup(master_addr);
	h->id = harbor_id;
	h->master_fd = _connect_to(h, master_addr, true);
	if (h->master_fd == -1) {
		fprintf(stderr, "Harbor: Connect to master failed\n");
		exit(1);
	}
	h->local_addr = skynet_strdup(local_addr);

	_launch_gate(ctx, local_addr);
	skynet_callback(ctx, h, _mainloop);
	_request_master(h, local_addr, strlen(local_addr), harbor_id);

	return 0;
}
Beispiel #2
0
struct skynet_module * 
skynet_module_query(const char * name) {
	struct skynet_module * result = _query(name);
	if (result)
		return result;

	SPIN_LOCK(M)

	result = _query(name); // double check

	if (result == NULL && M->count < MAX_MODULE_TYPE) {
		int index = M->count;
		void * dl = _try_open(M,name);
		if (dl) {
			M->m[index].name = name;
			M->m[index].module = dl;

			if (_open_sym(&M->m[index]) == 0) {
				M->m[index].name = skynet_strdup(name);
				M->count ++;
				result = &M->m[index];
			}
		}
	}

	SPIN_UNLOCK(M)

	return result;
}
Beispiel #3
0
/**
 * 存储 name, handle
 * @param s handle_storage
 * @param name 名字
 * @param handle handle
 * @return 存储的 name, 返回的字符串是复制 name, 新申请的内存数据
 */
static const char *
_insert_name(struct handle_storage *s, const char * name, uint32_t handle) {

	// 查找到可用的索引
	int begin = 0;
	int end = s->name_count - 1;
	while (begin<=end) {
		int mid = (begin+end)/2;
		struct handle_name *n = &s->name[mid];
		int c = strcmp(n->name, name);

		// 如果已经插入过, 那么将不能插入, 1 个 name 只能注册 1 次, 1 个 handle 能够注册多个名字
		if (c==0) {
			return NULL;
		}
		if (c<0) {
			begin = mid + 1;
		} else {
			end = mid - 1;
		}
	}
	char * result = skynet_strdup(name);

	_insert_name_before(s, result, handle, begin);

	return result;
}
Beispiel #4
0
struct skynet_module *
skynet_module_query(const char * name)
{
	struct skynet_module * result = _query(name);
	if (result)
		return result;

	while (__sync_lock_test_and_set(&M->lock, 1))
	{
	}

	result = _query(name); // double check

	if (result == NULL && M->count < MAX_MODULE_TYPE)
	{
		int index = M->count;
		void * dl = _try_open(M, name);
		if (dl)
		{
			M->m[index].name = name;
			M->m[index].module = dl;

			if (_open_sym(&M->m[index]) == 0)
			{
				M->m[index].name = skynet_strdup(name);
				M->count++;
				result = &M->m[index];
			}
		}
	}

	__sync_lock_release(&M->lock);

	return result;
}
Beispiel #5
0
void
skynet_error(struct skynet_context * context, const char *msg, ...)
{
	static uint32_t logger = 0;
	if (logger == 0)
	{
		logger = skynet_handle_findname("logger");
	}
	if (logger == 0)
	{
		return;
	}

	char tmp[LOG_MESSAGE_SIZE];
	char *data = NULL;

	va_list ap;

	va_start(ap, msg);
	int len = vsnprintf(tmp, LOG_MESSAGE_SIZE, msg, ap);
	va_end(ap);
	if (len < LOG_MESSAGE_SIZE)
	{
		data = skynet_strdup(tmp);
	}
	else
	{
		int max_size = LOG_MESSAGE_SIZE;
		for (;;)
		{
			max_size *= 2;
			data = skynet_malloc(max_size);
			va_start(ap, msg);
			len = vsnprintf(data, max_size, msg, ap);
			va_end(ap);
			if (len < max_size)
			{
				break;
			}
			skynet_free(data);
		}
	}


	struct skynet_message smsg;
	if (context == NULL)
	{
		smsg.source = 0;
	}
	else
	{
		smsg.source = skynet_context_handle(context);
	}
	smsg.session = 0;
	smsg.data = data;
	smsg.sz = len | (PTYPE_TEXT << HANDLE_REMOTE_SHIFT);
	skynet_context_push(logger, &smsg);
}
Beispiel #6
0
void
skynet_module_init(const char *path)
{
	struct modules *m = skynet_malloc(sizeof(*m));
	m->count = 0;
	m->path = skynet_strdup(path);
	m->lock = 0;

	M = m;
}
Beispiel #7
0
void skynet_error(skynet_context *context, const char *msg, ...)
{
	static uint32_t logger = 0;
	if (logger == 0) {
		logger = SNServer::Get()->GetHandle().FindName("logger");
	}
	if (logger == 0) {
		return;
	}

	char tmp[LOG_MESSAGE_SIZE];
	char *data = NULL;

	va_list va;
	va_start(va, msg);
	int len = sn_vsprintf(tmp, LOG_MESSAGE_SIZE, msg, va);
	va_end(va);
	if (len != -1 && len < LOG_MESSAGE_SIZE) {
		data = skynet_strdup(tmp);
	}
	else {
		int max_size = LOG_MESSAGE_SIZE;
		for (;;) {
			max_size *= 2;
			data = (char *)sn_malloc(max_size);
			va_start(va, msg);
			len = sn_vsprintf(data, max_size, msg, va);
			va_end(va);
			if (len != -1 && len < max_size) {
				break;
			}
			sn_free(data);
		}
	}

	sn_message smsg;
	if (context == NULL) {
		smsg.source = 0;
	}
	else {
		smsg.source = context->Handle();
	}
	smsg.session = 0;
	smsg.data = data;
	smsg.sz = len | (PTYPE_TEXT << HANDLE_REMOTE_SHIFT);
	SNServer::Get()->ContextPush(logger, &smsg);
}