-
当新的服务处于创建阶段进行 abort 时,感觉有可能会 abort 失败,却又找不到重现的测试用例,能遇到这样的概率应该极低吧。
不确定分析是否有问题,也不知道是否有必要像下面的代码加个判断处理这种情况,所以来讨论区问问。 void
skynet_handle_retireall() {
struct handle_storage *s = H;
for (;;) {
int n=0;
int i;
for (i=0;i<s->slot_size;i++) {
rwlock_rlock(&s->lock);
struct skynet_context * ctx = s->slot[i];
uint32_t handle = 0;
if (ctx)
handle = skynet_context_handle(ctx);
rwlock_runlock(&s->lock);
if (handle != 0) {
if (skynet_handle_retire(handle)) {
++n;
}
} else if (ctx) {
++n; // 当 ctx->handle = skynet_handle_register(ctx); 已经 ctx 已经进入 slot 但还没返回赋值时
}
}
if (n==0)
return;
}
} |
Beta Was this translation helpful? Give feedback.
Answered by
cloudwu
Apr 14, 2022
Replies: 1 comment 1 reply
-
我觉得只需要在 ctx 不为空时 ++n 就足够了,后面那个 retire 失败的条件都不需要。也就是退出时多循环遍历一次而已。 |
Beta Was this translation helpful? Give feedback.
1 reply
Answer selected by
hanxi
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
我觉得只需要在 ctx 不为空时 ++n 就足够了,后面那个 retire 失败的条件都不需要。也就是退出时多循环遍历一次而已。