全组人已经忙了两个小时。
“中断优先级那边对过了吗?”秦理侧头问隔壁工位的壮壮。壮壮本名周宁,一米九的齐鲁壮汉,全组都叫他壮壮。
“对过了,不是硬件中断的问题。”壮壮把逻辑分析仪的波形图调出来,“我这边抓到的调用栈,最后全卡在同一个地方——图形引擎的显存锁等待。”
“锁?”钟印凑过去看了一眼,“显存分配不是无锁队列吗?”
“理论上是。”壮壮往下拉了拉,“但你看这个任务状态,全在等一个永远不会释放的信号量。像是……”他顿了一下,“像是某个服务异常终止了,但没释放占用的资源。”
办公室里安静了两秒。
“谁写的驱动?”秦理一脸不可思议。
“写的人可能已经离职了。”钟印已经开始翻git提交记录,“但代码还在用。”
他翻了半分钟,停住。
“这段。”他把屏幕转给大家看,“早期的原型代码,显存分配用了二值信号量做互斥。但后面的异常处理分支里,少了一个释放操作。”
秦理凑过来看了一眼,笑了:“这是个祖宗。”
“什么祖宗?”壮壮问道。
“上古代码。”钟印指着提交记录的日期,“四年前的代码,从来没人触发过那个异常分支。昨天那辆车在搓板路上颠得太狠,正好触发了。”
秦理听完,站起来,冲着测试机柜的方向举起了手里的三支签字笔,虔诚地拜了三拜。
“你干嘛?”钟印看着他。
“先拜拜再刷机。”秦理一脸正经,“这是汽车电子人的仪式感,你不懂。”
“行。”钟印忍着笑,“那拜完可以刷了吗?”
“刷,现在刷。”
壮壮连接上OTA服务器,回车键在手指下悬了两秒,看了一眼秦理。
秦理冲他点头:“刷。”
回车落下。
屏幕上开始滚日志——刷写、验证、重启。第一轮启动一切正常,仪表盘自检通过,中控屏亮起。
“装车试试?”壮壮问。
“让测试部去跑。”钟印站起来,“先做个耐久脚本,跑一晚上看看还会不会复现。”
秦理在旁边长叹一口气:“看,活生生的例子。四年前埋的雷,现在炸的坑。我现在终于理解为什么汽车召回要花那么多钱了。”
“行了,”钟印拍了拍手,“我写问题报告,秦理你把这个驱动重写一遍,别用信号量了,改用无锁队列。”
“我来。”秦理已经切到IDE,“半天时间。”
壮壮看着他:“又拜?”
“刚拜过了,效果管一天。”
钟印笑着站起来:“走吧,先去吃午饭,回来之后跑一晚上耐久。”
“那我希望饭吃得久一点,”秦理冲他背影喊,“最好吃到下班。”
三人收拾完东西,往楼梯间走去。
电梯门打开,陆识檐站在里面。
“陆总好!”
“陆总。”
“陆总好——”
三个人此起彼伏地打了招呼。宋宇按着电梯开门键,等他们三个走进来。
陆识檐冲他们点点头,目光扫过一圈,最后在钟印身上停了一瞬,又自然地移开。
“都忙完了?”他问。
“应该没什么大问题了。”秦理笑着接话,“跑完回归了,稳得很。”
“辛苦各位了。”陆识檐说。
壮壮挠了挠后脑勺:“陆总您客气了,问题赶上了就处理呗。刚才跑完那遍回归已经稳了,您放心。”
陆识檐听了,眼角微微弯了一下,带着点笑意。那笑意在脸上停留了两秒,眼神却不自觉地又往旁边飘——落在钟印身上。
钟印正在默默地掏出手机,搜索“如何像山东人一样在职场面对领导游刃有余”。
搜了半天,第一条是“山东人喝酒指南”——算了,这条路走不通。