今天看了MOT中connection_id.h和connection_id.cpp,主要是可重用connection_id的逻辑实现.connection的标识符类型为typedef uint32_t ConnectionId.主要函数如下:
1.InitConnectionIdPool(uint32_t maxConnections):初始化可重用connection标识符池。
首先初始化一个自旋锁,然后分配一个保存连接ID的数组,数组大小的计算为:CONNECTIONS_PER_WORD=64,
connectionIdArraySize=(maxConnectionCount + CONNECTIONS_PER_WORD - 1) / CONNECTIONS_PER_WORD;
计算allocSize = sizeof(uint64_t) * connectionIdArraySize 并分配内存(uint64_t ).
2.AllocConnectionId:为当前连接分配一个可重用的连接标识符
首先获取自旋锁,计算connectionId = CONNECTIONS_PER_WORD * arrayIndex(数组下标) + bitIndex(不为1的位下标);
并标记这一位已经使用,释放自旋锁
3.FreeConnectionId:为当前会话释放可重用的连接标识符。这个标识符可以被另一个连接重用。当一个会话完成它
的执行时,它必须调用这个函数,这样它的连接标识符就可以返回到可重用的连接标识符池中。
首先根据connectionId计算出arrayIndex和bitIndex,获取自旋锁,将这一位标记为free,currentConnectionCount自
减1,最后释放自旋锁.
4.其他函数,如GetMaxConnectionCount,GetCurrentConnectionCount,IsConnectionIdFree等都比较简单,不展开介绍了
网友评论