LockfreeEvent是一个无锁事件类。主要用于epoll模型下读、写和错误事件的触发。
void LockfreeEvent::NotifyOn(grpc_closure* closure) {
/*cas失败时,再次循环重试*/
while (true) {
/* 这里用acquire的原因是,当SetShutdown成功时,会将shutdown_err保存在state_中,
* 假设这边检测到状态是已关闭情况,则下面代码会使用到shutdown_err,
* 为了保证shutdown_err在此线程是可见的,即SetShutdown happen-before NotifyOn,所以load
* 要加上acquire。 */
gpr_atm curr = gpr_atm_acq_load(&state_);
if (GRPC_TRACE_FLAG_ENABLED(grpc_polling_trace)) {
gpr_log(GPR_DEBUG, "LockfreeEvent::NotifyOn: %p curr=%p closure=%p", this,
(void*)curr, closure);
}
switch (curr) {
case kClosureNotReady: {
/* 将closure保存在state_中,为了保证closure对之后acquire load的线程是可见 */
if (gpr_atm_rel_cas(&state_, kClosureNotReady, (gpr_atm)closure)) {
return;
}
break;
}
case kClosureReady: {
/*此处不需要保证哪些对象的可见性 */
if (gpr_atm_no_barrier_cas(&state_, kClosureReady, kClosureNotRead