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; }
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; }
/** * 存储 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; }
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; }
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); }
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; }
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); }