static void anonymous_put(SS_ID ss, CHAN *ch) { char *var = valPtr(ch,ss); if (ch->queue) { QUEUE queue = ch->queue; pvType type = ch->type->getType; /*BUG? should that be putType?*/ size_t size = ch->type->size; boolean full; struct putq_cp_arg arg = {ch, var}; DEBUG("anonymous_put: type=%d, size=%d, count=%d, buf_size=%d, q=%p\n", type, size, ch->count, pv_size_n(type, ch->count), queue); print_channel_value(DEBUG, ch, var); /* Note: Must lock here because multiple state sets can issue pvPut calls concurrently. OTOH, no need to lock against CA callbacks, because anonymous and named PVs are disjoint. */ epicsMutexMustLock(ch->varLock); full = seqQueuePutF(queue, putq_cp, &arg); if (full) { errlogSevPrintf(errlogMinor, "pvPut on queued channel '%s' (anonymous): " "last queue element overwritten (queue is full)\n", ch->varName ); } epicsMutexUnlock(ch->varLock); } else { /* Set dirty flag only if monitored */ ss_write_buffer(ch, var, 0, ch->monitored); } /* If there's an event flag associated with this channel, set it */ if (ch->syncedTo) seq_efSet(ss, ch->syncedTo); /* Wake up each state set that uses this channel in an event */ ss_wakeup(ss->prog, ch->eventNum); }
epicsShareFunc boolean seqQueuePut(QUEUE q, const void *value) { return seqQueuePutF(q, memcpy, value); }