static int psmx_cntr_seterr(struct fid_cntr *cntr, uint64_t value) { struct psmx_fid_cntr *cntr_priv; cntr_priv = container_of(cntr, struct psmx_fid_cntr, cntr); ofi_atomic_set64(&cntr_priv->error_counter, value); psmx_cntr_check_trigger(cntr_priv); if (cntr_priv->wait) cntr_priv->wait->signal(cntr_priv->wait); return 0; }
static int psmx_cntr_set(struct fid_cntr *cntr, uint64_t value) { struct psmx_fid_cntr *cntr_priv; cntr_priv = container_of(cntr, struct psmx_fid_cntr, cntr); cntr_priv->counter = value; psmx_cntr_check_trigger(cntr_priv); if (cntr_priv->wait) psmx_wait_signal((struct fid_wait *)cntr_priv->wait); return 0; }
void psmx_cntr_add_trigger(struct psmx_fid_cntr *cntr, struct psmx_trigger *trigger) { struct psmx_trigger *p, *q; pthread_mutex_lock(&cntr->trigger_lock); q = NULL; p = cntr->trigger; while (p && p->threshold <= trigger->threshold) { q = p; p = p->next; } if (q) q->next = trigger; else cntr->trigger = trigger; trigger->next = p; pthread_mutex_unlock(&cntr->trigger_lock); psmx_cntr_check_trigger(cntr); }