int update_epoch() { int curr_epoch; int i; if (!TRYLOCK(&qg->update_lock)) { /* Someone could be preempted while holding the update lock. Give * them the CPU. */ return 0; } /* If any CPU hasn't advanced to the current epoch, abort the attempt. */ curr_epoch = qg->global_epoch; for (i = 0; i < ltd.nthreads; i++) { if (shtd[i].in_critical == 1 && shtd[i].epoch != curr_epoch && i != ltd.thread_index) { UNLOCK(&qg->update_lock); /*cond_yield();*/ return 0; } } /* Update the global epoch. */ qg->global_epoch = (curr_epoch + 1) % N_EPOCHS; UNLOCK(&(qg->update_lock)); return 1; }
int addrset_eq_onesidederr (const struct addrset *a, const struct addrset *b) { int iseq; if (a == b) return 1; LOCK (a); if (TRYLOCK (b) == os_resultSuccess) { iseq = addrset_eq_onesidederr1 (&a->ucaddrs, &b->ucaddrs) && addrset_eq_onesidederr1 (&a->mcaddrs, &b->mcaddrs); UNLOCK (b); } else { /* We could try <lock b ; trylock(a)>, in a loop, &c. Or we can just decide it isn't worth the bother. Which it isn't because it doesn't have to be an exact check on equality. A possible improvement would be to use an rwlock. */ iseq = 0; } UNLOCK (a); return iseq; }