/* * Get value from a queued PV. */ epicsShareFunc boolean seq_pvGetQ(SS_ID ss, CH_ID chId) { PROG *sp = ss->prog; CHAN *ch = sp->chan + chId; void *var = valPtr(ch,ss); EF_ID ev_flag = ch->syncedTo; PVMETA *meta = metaPtr(ch,ss); boolean was_empty; struct getq_cp_arg arg = {ch, var, meta}; if (!ch->queue) { errlogSevPrintf(errlogMajor, "pvGetQ(%s): user error (not queued)\n", ch->varName ); return FALSE; } was_empty = seqQueueGetF(ch->queue, getq_cp, &arg); if (ev_flag) { epicsMutexMustLock(sp->lock); /* If queue is now empty, clear the event flag */ if (seqQueueIsEmpty(ch->queue)) { bitClear(sp->evFlags, ev_flag); } epicsMutexUnlock(sp->lock); } return (!was_empty); }
epicsShareFunc boolean seqQueueGet(QUEUE q, void *value) { return seqQueueGetF(q, memcpy, value); }