他又敲了一行。屏幕上吐出一行错误日志。
“deadlockdetected:processAwaitingforlockheldbyprocessB,processBwaitingforlockheldbyprocessA…”
死锁。
逻辑死锁。
赵磊盯着那行日志,手指悬在键盘上方。
他认识这个。不是系统级的死锁。是业务逻辑层面的。写在游戏引擎底层的。
他回头看了一眼李栋。李栋也打开了电脑,脸色不对。
“赵哥,我查了一下触发条件。是并发连接数等于一十万的时候,底层有一段代码会把所有线程的锁标记同时翻转。”
赵磊凑过去看。
一段藏在内存管理模块最深处的条件判断。ifconcurrent_connections>=1000,执行一个函数。
那个函数做的事情是:把所有共享资源的互斥锁全部置为占用状态。然后让每个线程去等待其他线程释放锁。
没有人会释放。因为所有人都在等。
死循环。
“这段代码谁写的?”赵磊问。
李栋看了眼提交记录。没有提交记录。这段代码不在版本管理里。它是直接写在编译后的二进制文件里的。
硬件指令层面。
赵磊的脸白了。
他想起来了。这套引擎,是从际华那边带出来的。底层架构是际华的人搭的。
他们带走的是源码。但编译好的核心库,是用际华提供的工具链生成的。
工具链里动了手脚。
编译的时候,自动把这段死锁逻辑注入到二进制文件里。源码层面看不到。代码审查查不出来。只有反汇编才能发现。
陈天宇走过来了。香槟瓶放下了。脸上什么表情都没有。
“怎么回事。”
赵磊抬头看他。嘴巴张了张,说不出话。
李栋替他说了:“陈总,底层引擎被下了套。并发到十万的时候自动触发逻辑死锁。不是软件bug,是编译层面注入的。查不到,改不掉。”
“重启呢?”
“重启没用。服务一起来,玩家重新连接,并发数一到十万,又死。”
“那把并发限制在十万以下。”
赵磊摇头:“来不及。限流逻辑要改源码重新编译,但编译工具链本身就有问题。用它编译出来的东西,还是带那段代码。”
“换编译器。”
“换了也没用。核心库的二进制已经污染了。除非把整个底层引擎推翻重写。”
陈天宇站在那里。
宴会厅里的人已经不聊天了。所有人都在看着他。
老沈放下酒杯,站起来,走了。没跟任何人打招呼。
IDG的两个副总裁对视了一眼,也站起来了。
记者们在拍照。闪光灯一下一下。