Respecify our way out of some very high contention

Theres no need for every thread to exit polling early if an alarm might finish, so there's no need to contend here.
pull/407/head
Craig Tiller 10 years ago
parent 53476f1d0e
commit 3dd8c2e53d
  1. 3
      src/core/iomgr/alarm.c
  2. 9
      src/core/iomgr/alarm_internal.h

@ -335,8 +335,7 @@ static int run_some_expired_alarms(gpr_mu *drop_mu, gpr_timespec now,
gpr_mu_unlock(&g_mu);
gpr_mu_unlock(&g_checker_mu);
} else if (next) {
gpr_mu_lock(&g_mu);
} else if (next && gpr_mu_trylock(&g_mu)) {
*next = gpr_time_min(*next, g_shard_queue[0]->min_deadline);
gpr_mu_unlock(&g_mu);
}

@ -39,6 +39,15 @@
/* iomgr internal api for dealing with alarms */
/* Check for alarms to be run, and run them.
Return non zero if alarm callbacks were executed.
Drops drop_mu if it is non-null before executing callbacks.
If next is non-null, TRY to update *next with the next running alarm
IF that alarm occurs before *next current value.
*next is never guaranteed to be updated on any given execution; however,
with high probability at least one thread in the system will see an update
at any time slice. */
int grpc_alarm_check(gpr_mu *drop_mu, gpr_timespec now, gpr_timespec *next);
void grpc_alarm_list_init(gpr_timespec now);

Loading…
Cancel
Save