麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 學院 > 開發設計 > 正文

skynet學習之skynet_handle

2019-11-11 05:02:42
字體:
來源:轉載
供稿:網友

今天學習skynet_handle文件。

這個文件是管理句柄的。建立skynet_context與skynet_handle之間的唯一映射關系。

即一個sc對應一個唯一的handle。

先看初始化:

void skynet_handle_init(int harbor) {	assert(H==NULL);	struct handle_storage * s = skynet_malloc(sizeof(*H));	s->slot_size = DEFAULT_SLOT_SIZE;	s->slot = skynet_malloc(s->slot_size * sizeof(struct skynet_context *));	memset(s->slot, 0, s->slot_size * sizeof(struct skynet_context *));	rwlock_init(&s->lock);	// reserve 0 for system	s->harbor = (uint32_t) (harbor & 0xff) << HANDLE_REMOTE_SHIFT;	s->handle_index = 1;	s->name_cap = 2;	s->name_count = 0;	s->name = skynet_malloc(s->name_cap * sizeof(struct handle_name));	H = s;	// Don't need to free H}

生成一個handle_storage對象即句柄倉庫結構體。初始化分配DEFAULT_SLOT_SIZE個元素的slot數組。

生成harbor的ID,只能占用高8位。

初始化name數組,暫時不清楚用處,猜測可能是建立一個字符串名與handle之間的映射方便查詢吧。

sc被存放在一個數組中,數組的下標選取是通過hash來計算的。

uint32_tskynet_handle_register(struct skynet_context *ctx) {	struct handle_storage *s = H;	rwlock_wlock(&s->lock);		for (;;) {		int i;		for (i=0;i<s->slot_size;i++) {			uint32_t handle = (i+s->handle_index) & HANDLE_MASK;//HANDLE_MASK用于取低24位,高8位是遠程節點ID			int hash = handle & (s->slot_size-1);//保證下標不會超過孔位數量。孔位數量始終是2的N次方。			if (s->slot[hash] == NULL) {				s->slot[hash] = ctx;				s->handle_index = handle + 1;//單調遞增,假設了最多不會超過0xffffff個。				rwlock_wunlock(&s->lock);				handle |= s->harbor;				return handle;			}		}		assert((s->slot_size*2 - 1) <= HANDLE_MASK);		struct skynet_context ** new_slot = skynet_malloc(s->slot_size * 2 * sizeof(struct skynet_context *));//雙倍擴充容量		memset(new_slot, 0, s->slot_size * 2 * sizeof(struct skynet_context *));		for (i=0;i<s->slot_size;i++) {			int hash = skynet_context_handle(s->slot[i]) & (s->slot_size * 2 - 1);			assert(new_slot[hash] == NULL);			new_slot[hash] = s->slot[i];		}		skynet_free(s->slot);		s->slot = new_slot;		s->slot_size *= 2;	}}

存儲好后,其他業務就可以用handle來尋找sc了。

struct skynet_context * skynet_handle_grab(uint32_t handle) {	struct handle_storage *s = H;	struct skynet_context * result = NULL;	rwlock_rlock(&s->lock);	uint32_t hash = handle & (s->slot_size-1);	struct skynet_context * ctx = s->slot[hash];	if (ctx && skynet_context_handle(ctx) == handle) {		result = ctx;		skynet_context_grab(result);	}	rwlock_runlock(&s->lock);	return result;}當然,還有回收釋放handle的
intskynet_handle_retire(uint32_t handle)

每個sc在生成的時候,都會調用skynet_handle_register來進行注冊。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 久久久www成人免费精品 | 国产毛片毛片毛片 | 深夜福利视频免费观看 | 高清视频91 | 精品国产91久久久久久久妲己 | 欧美成人理论片乱 | 欧美日韩精品一区二区三区蜜桃 | 国产羞羞网站 | 日韩美女电影 | 日日草视频| 亚洲第一视频在线 | 久草在线视频新 | 一级黄色性感片 | 337p日本欧洲亚洲大胆精蜜臀 | 日本欧美一区二区三区视频麻豆 | 视频国产一区二区 | 九一免费国产 | 97青青 | 久久精品中文字幕一区二区 | 操操插插| 亚洲视频网 | 国产欧美在线观看不卡一 | 国产精品免费大片 | 日韩黄色精品视频 | 国产自在线 | 天堂福利电影 | 国产午夜亚洲精品 | 日本搞逼视频 | 26uuu成人人网图片 | 高潮激情aaaaa免费看 | 亚洲视频高清 | 国产小视频在线观看 | 久久小视频 | 久久精品视频1 | 国产亚洲精品综合一区91 | 国产精品视频一区二区三区四区国 | 国产亚洲黑人性受xxxx精品 | 精品一区二区在线播放 | 五月天影院,久久综合, | 一级性色 | 毛片免费在线 |