pva2pva 1.4.2
Loading...
Searching...
No Matches
ChannelCache Struct Reference

#include <chancache.h>

Collaboration diagram for ChannelCache:

Classes

struct  cacheClean

Public Types

typedef std::map< std::string, ChannelCacheEntry::shared_pointer > entries_t

Public Member Functions

 ChannelCache (const epics::pvAccess::ChannelProvider::shared_pointer &prov)
ChannelCacheEntry::shared_pointer lookup (const std::string &name)

Public Attributes

epicsMutex cacheLock
entries_t entries
epics::pvAccess::ChannelProvider::shared_pointer provider
epicsTimerQueueActive * timerQueue
epicsTimer * cleanTimer
cacheClean * cleaner
size_t cleanerRuns
size_t cleanerDust

Detailed Description

Holds the set of channels the GW is searching for, or has found.

Definition at line 154 of file chancache.h.

Member Typedef Documentation

◆ entries_t

typedef std::map<std::string, ChannelCacheEntry::shared_pointer > ChannelCache::entries_t

Definition at line 156 of file chancache.h.

Constructor & Destructor Documentation

◆ ChannelCache()

ChannelCache::ChannelCache ( const epics::pvAccess::ChannelProvider::shared_pointer & prov)

Definition at line 136 of file chancache.cpp.

137 :provider(prov)
138 ,timerQueue(&epicsTimerQueueActive::allocate(1, epicsThreadPriorityCAServerLow-2))
139 ,cleaner(new cacheClean(this))
140 ,cleanerRuns(0)
141 ,cleanerDust(0)
142{
143 if(!provider)
144 throw std::logic_error("Missing 'pva' provider");
145 assert(timerQueue);
146 cleanTimer = &timerQueue->createTimer();
147 cleanTimer->start(*cleaner, 30.0);
148}

◆ ~ChannelCache()

ChannelCache::~ChannelCache ( )

Definition at line 150 of file chancache.cpp.

151{
152 entries_t E;
153 {
154 Guard G(cacheLock);
155
156 cleanTimer->destroy();
157 timerQueue->release();
158 delete cleaner;
159
160 entries_t E;
161 E.swap(entries);
162 }
163}

Member Function Documentation

◆ lookup()

ChannelCacheEntry::shared_pointer ChannelCache::lookup ( const std::string & name)

Definition at line 166 of file chancache.cpp.

167{
168 ChannelCacheEntry::shared_pointer ret;
169
170 Guard G(cacheLock);
171
172 entries_t::const_iterator it = entries.find(newName);
173
174 if(it==entries.end()) {
175 // first request, create ChannelCacheEntry
176 //TODO: async lookup
177
178 ChannelCacheEntry::shared_pointer ent(new ChannelCacheEntry(this, newName));
179 ent->requester.reset(new ChannelCacheEntry::CRequester(ent));
180
181 entries[newName] = ent;
182
183 pva::Channel::shared_pointer M;
184 {
185 // unlock to call createChannel()
186 epicsGuardRelease<epicsMutex> U(G);
187
188 M = provider->createChannel(newName, ent->requester);
189 if(!M)
190 THROW_EXCEPTION2(std::runtime_error, "Failed to createChannel");
191 }
192 ent->channel = M;
193
194 if(M->isConnected())
195 ret = ent; // immediate connect, mostly for unit-tests (thus delayed connect not covered)
196
197 } else if(it->second->channel && it->second->channel->isConnected()) {
198 // another request, and hey we're connected this time
199
200 ret = it->second;
201 it->second->dropPoke = true;
202
203 } else {
204 // not connected yet, but a client is still interested
205 it->second->dropPoke = true;
206 }
207
208 return ret;
209}

Member Data Documentation

◆ cacheLock

epicsMutex ChannelCache::cacheLock

Definition at line 159 of file chancache.h.

◆ cleaner

cacheClean* ChannelCache::cleaner

Definition at line 168 of file chancache.h.

◆ cleanerDust

size_t ChannelCache::cleanerDust

Definition at line 170 of file chancache.h.

◆ cleanerRuns

size_t ChannelCache::cleanerRuns

Definition at line 169 of file chancache.h.

◆ cleanTimer

epicsTimer* ChannelCache::cleanTimer

Definition at line 166 of file chancache.h.

◆ entries

entries_t ChannelCache::entries

Definition at line 161 of file chancache.h.

◆ provider

epics::pvAccess::ChannelProvider::shared_pointer ChannelCache::provider

Definition at line 163 of file chancache.h.

◆ timerQueue

epicsTimerQueueActive* ChannelCache::timerQueue

Definition at line 165 of file chancache.h.


The documentation for this struct was generated from the following files: