334 ->addNestedStructure(
"_options")
338 ->createStructure());
342 FOREACH(PDBProcessor::groups_t::const_iterator, it, end, proc.groups)
344 const GroupInfo &info=it->second;
347 throw std::runtime_error(
"name already in used");
353 pv->pgatomic = info.atomic!=GroupInfo::False;
354 pv->monatomic = info.hastriggers;
358 typedef std::map<std::string, size_t> members_map_t;
359 members_map_t members_map;
362 for(
size_t i=0, N=info.members.size();
i<N;
i++)
363 if(!info.members[
i].pvname.empty())
369 std::vector<dbCommon*> records(members.
size());
372 builder = builder->add(
"record", _options);
374 if(!info.structID.empty())
375 builder = builder->setId(info.structID);
377 for(
size_t i=0, J=0, N=info.members.size();
i<N;
i++)
379 const GroupMemberInfo &mem = info.members[
i];
385 for(
size_t j=0; j<parts.size()-1; j++) {
386 if(parts[j].isArray())
387 builder = builder->addNestedStructureArray(parts[j].name);
389 builder = builder->addNestedStructure(parts[j].name);
393 if(!mem.structID.empty())
394 builder = builder->setId(mem.structID);
397 if(!mem.pvname.empty()) {
398 DBCH temp(mem.pvname);
399 unsigned ftype = dbChannelFieldType(temp);
403 throw std::runtime_error(
"Can't include link fields in group");
409 builder = mem.builder->dtype(builder, parts.back().name, chan);
411 builder = mem.builder->dtype(builder,
"", chan);
414 for(
size_t j=0; j<parts.size()-1; j++)
415 builder = builder->endNested();
418 if(!mem.pvname.empty()) {
419 members_map[mem.pvfldname] = J;
432 records[J] = dbChannelRecord(info.
chan);
437 pv->members.swap(members);
439 pv->fielddesc = builder->createStructure();
440 pv->complete = pvbuilder->createPVStructure(
pv->fielddesc);
444 DBManyLock L(&records[0], records.size(), 0);
448 for(
size_t i=0, J=0, N=info.members.size();
i<N;
i++)
450 const GroupMemberInfo &mem = info.members[
i];
451 if(mem.pvname.empty())
continue;
454 if(mem.triggers.empty())
continue;
456 std::vector<dbCommon*> trig_records;
457 trig_records.reserve(mem.triggers.size());
459 FOREACH(GroupMemberInfo::triggers_t::const_iterator, it, end, mem.triggers) {
460 members_map_t::const_iterator imap(members_map.find(*it));
461 if(imap==members_map.end())
462 throw std::logic_error(
"trigger resolution missed map to non-dbChannel");
464 info.
triggers.push_back(imap->second);
465 trig_records.push_back(records[imap->second]);
468 DBManyLock L(&trig_records[0], trig_records.size(), 0);
474 }
catch(std::exception& e){
475 fprintf(
stderr,
"%s: Error Group not created: %s\n", info.name.c_str(), e.what());
479 if(!proc.groups.empty()) {
480 fprintf(
stderr,
"Group(s) were defined, but need Base >=3.16.0.2 to function. Ignoring.\n");
482 #endif // USE_MULTILOCK 486 throw std::runtime_error(
"Failed to create dbEvent context");
489 throw std::runtime_error(
"Failed to stsart dbEvent context");
495 it = next!=end ? next++ : end;
496 it != end; it = next==end ? end : next++)
498 const PDBPV::shared_pointer& ppv = it->second;
523 }
catch(std::exception& e){
524 fprintf(
stderr,
"%s: Error during dbEvent setup : %s\n", pv->
name.c_str(), e.what());
528 #endif // USE_MULTILOCK
#define assert(exp)
Declare that a condition should be true.
std::tr1::shared_ptr< detail::SharedPut > put
A holder for a contiguous piece of memory.
#define FOREACH(ITERTYPE, IT, END, C)
void pdb_group_event(void *user_arg, struct dbChannel *chan, int eventsRemaining, struct db_field_log *pfl)
std::tr1::shared_ptr< const Structure > StructureConstPtr
std::tr1::shared_ptr< FieldBuilder > FieldBuilderPtr
static size_t num_instances
std::tr1::shared_ptr< PVDataCreate > PVDataCreatePtr
epics::pvData::PVStructurePtr complete
void create(dbEventCtx ctx, dbChannel *ch, EVENTFUNC *fn, unsigned mask)
void swap(shared_vector_base &o)
Swap the contents of this vector with another.
size_t size() const
Number of elements visible through this vector.
FORCE_INLINE const FieldCreatePtr & getFieldCreate()
#define epicsThreadPriorityCAServerLow
Class that holds the data for each possible scalar type.
std::tr1::shared_ptr< FieldCreate > FieldCreatePtr
p2p::auto_ptr< PVIF > pvif
persist_pv_map_t persist_pv_map
std::tr1::shared_ptr< PVIFBuilder > builder
FORCE_INLINE const PVDataCreatePtr & getPVDataCreate()