Vuo 2.4.4
Loading...
Searching...
No Matches
VuoRunningCompositionLibraries.cc
Go to the documentation of this file.
1
11#include "VuoFileUtilities.hh"
12
17{
18 shouldDeleteResourceLibraries = false;
19}
20
25{
26 if (shouldDeleteResourceLibraries)
27 for (vector<string>::iterator i = resourcePathsLoaded.begin(); i != resourcePathsLoaded.end(); ++i)
29
30 for (auto i : cachePathLoadedCallbacks)
31 i.second();
32}
33
40void VuoRunningCompositionLibraries::enqueueResourceLibraryToLoad(const string &path, const set<string> &dependenciesInLibrary,
41 bool isUnloadable)
42{
43 if (find(resourcePathsLoaded.begin(), resourcePathsLoaded.end(), path) == resourcePathsLoaded.end() ||
44 find(resourcePathsToUnload.begin(), resourcePathsToUnload.end(), path) != resourcePathsToUnload.end())
45 {
46 resourcePathsToLoad.push_back(path);
47 canUnloadPathToLoad[path] = isUnloadable;
48 dependenciesToLoad[path] = dependenciesInLibrary;
49 }
50}
51
56{
57 if (find(resourcePathsLoaded.begin(), resourcePathsLoaded.end(), path) != resourcePathsLoaded.end())
58 {
59 if (! canUnloadPathLoaded[path])
60 {
61 VUserLog("The resource library %s can't be unloaded.", path.c_str());
62 return;
63 }
64
65 resourcePathsToUnload.insert(path);
66 }
67}
68
75{
76 set<string> dependenciesInLibraries;
77
78 for (string path : resourcePathsLoaded)
79 {
80 if (canUnloadPathLoaded[path])
81 {
82 resourcePathsToUnload.insert(path);
83 dependenciesInLibraries.insert( dependenciesLoaded[path].begin(), dependenciesLoaded[path].end() );
84 }
85 }
86
87 return dependenciesInLibraries;
88}
89
96void VuoRunningCompositionLibraries::enqueueCacheLibraryToLoad(const string &path, const set<string> &dependenciesInLibrary,
97 bool isUnloadable, CallbackType doAfterLoadAttempted)
98{
99 if (find(cachePathsLoaded.begin(), cachePathsLoaded.end(), path) == cachePathsLoaded.end() ||
100 find(cachePathsToUnload.begin(), cachePathsToUnload.end(), path) != cachePathsToUnload.end())
101 {
102 cachePathsToLoad.push_back(path);
103 canUnloadPathToLoad[path] = isUnloadable;
104 dependenciesToLoad[path] = dependenciesInLibrary;
105 cachePathLoadedCallbacks[path] = doAfterLoadAttempted;
106 }
107}
108
116{
117 if (find(cachePathsLoaded.begin(), cachePathsLoaded.end(), path) != cachePathsLoaded.end())
118 {
119 if (! canUnloadPathLoaded[path])
120 {
121 VUserLog("The cache library %s can't be unloaded.", path.c_str());
122 return {};
123 }
124
125 cachePathsToUnload.insert(path);
126 }
127 else if (find(cachePathsToUnload.begin(), cachePathsToUnload.end(), path) == cachePathsToUnload.end())
128 {
129 return {};
130 }
131
132 return dependenciesLoaded[path];
133}
134
139{
140 for (map<string, set<string> >::iterator i = dependenciesLoaded.begin(); i != dependenciesLoaded.end(); ++i)
141 {
142 if (i->second.find(dependency) != i->second.end())
143 {
144 string libraryPath = i->first;
145
146 if (! canUnloadPathLoaded[libraryPath])
147 {
148 VUserLog("The library containing %s (%s) can't be unloaded.", dependency.c_str(), libraryPath.c_str());
149 break;
150 }
151
152 if (find(resourcePathsLoaded.begin(), resourcePathsLoaded.end(), libraryPath) != resourcePathsLoaded.end())
153 resourcePathsToUnload.insert(libraryPath);
154 if (find(cachePathsLoaded.begin(), cachePathsLoaded.end(), libraryPath) != cachePathsLoaded.end())
155 cachePathsToUnload.insert(libraryPath);
156
157 break;
158 }
159 }
160}
161
171vector<string> VuoRunningCompositionLibraries::dequeueLibrariesToLoad(vector<CallbackType> &doAfterLoadAttempted)
172{
173 vector<string> libraryPathsToLoad;
174
175 for (vector<string>::iterator i = cachePathsLoaded.begin(); i != cachePathsLoaded.end(); ++i)
176 if (canUnloadPathLoaded[*i])
177 libraryPathsToLoad.push_back(*i);
178
179 libraryPathsToLoad.insert(libraryPathsToLoad.end(), cachePathsToLoad.begin(), cachePathsToLoad.end());
180
181 for (const string &cachePath : cachePathsToLoad)
182 {
183 auto callbackIter = cachePathLoadedCallbacks.find(cachePath);
184 if (callbackIter != cachePathLoadedCallbacks.end())
185 {
186 doAfterLoadAttempted.push_back(callbackIter->second);
187 cachePathLoadedCallbacks.erase(callbackIter);
188 }
189 }
190
191 for (vector<string>::iterator i = resourcePathsLoaded.begin(); i != resourcePathsLoaded.end(); ++i)
192 if (canUnloadPathLoaded[*i])
193 libraryPathsToLoad.push_back(*i);
194
195 libraryPathsToLoad.insert(libraryPathsToLoad.end(), resourcePathsToLoad.begin(), resourcePathsToLoad.end());
196
197 resourcePathsLoaded.insert(resourcePathsLoaded.end(), resourcePathsToLoad.begin(), resourcePathsToLoad.end());
198 resourcePathsToLoad.clear();
199
200 cachePathsLoaded.insert(cachePathsLoaded.end(), cachePathsToLoad.begin(), cachePathsToLoad.end());
201 cachePathsToLoad.clear();
202
203 dependenciesLoaded.insert(dependenciesToLoad.begin(), dependenciesToLoad.end());
204 dependenciesToLoad.clear();
205
206 canUnloadPathLoaded.insert(canUnloadPathToLoad.begin(), canUnloadPathToLoad.end());
207 canUnloadPathToLoad.clear();
208
209 return libraryPathsToLoad;
210}
211
220{
221 for (set<string>::iterator i = resourcePathsToUnload.begin(); i != resourcePathsToUnload.end(); ++i)
222 {
223 dependenciesLoaded.erase(*i);
224 canUnloadPathLoaded.erase(*i);
225
226 if (shouldDeleteResourceLibraries)
228 }
229
230 for (set<string>::iterator i = cachePathsToUnload.begin(); i != cachePathsToUnload.end(); ++i)
231 {
232 dependenciesLoaded.erase(*i);
233 canUnloadPathLoaded.erase(*i);
234 }
235
236 for (int i = resourcePathsLoaded.size()-1; i >= 0; --i)
237 if (find(resourcePathsToUnload.begin(), resourcePathsToUnload.end(), resourcePathsLoaded[i]) != resourcePathsToUnload.end())
238 resourcePathsLoaded.erase(resourcePathsLoaded.begin() + i);
239
240 for (int i = cachePathsLoaded.size()-1; i >= 0; --i)
241 if (find(cachePathsToUnload.begin(), cachePathsToUnload.end(), cachePathsLoaded[i]) != cachePathsToUnload.end())
242 cachePathsLoaded.erase(cachePathsLoaded.begin() + i);
243
244 vector<string> libraryPathsToUnload;
245
246 libraryPathsToUnload.insert(libraryPathsToUnload.end(), resourcePathsToUnload.rbegin(), resourcePathsToUnload.rend());
247
248 for (vector<string>::reverse_iterator i = resourcePathsLoaded.rbegin(); i != resourcePathsLoaded.rend(); ++i)
249 if (canUnloadPathLoaded[*i])
250 libraryPathsToUnload.push_back(*i);
251
252 libraryPathsToUnload.insert(libraryPathsToUnload.end(), cachePathsToUnload.rbegin(), cachePathsToUnload.rend());
253
254 for (vector<string>::reverse_iterator i = cachePathsLoaded.rbegin(); i != cachePathsLoaded.rend(); ++i)
255 if (canUnloadPathLoaded[*i])
256 libraryPathsToUnload.push_back(*i);
257
258 resourcePathsToUnload.clear();
259 cachePathsToUnload.clear();
260
261 return libraryPathsToUnload;
262}
263
268{
269 vector<string> libraryPathsLoaded;
270
271 for (vector<string>::iterator i = cachePathsLoaded.begin(); i != cachePathsLoaded.end(); ++i)
272 if (! canUnloadPathLoaded[*i])
273 libraryPathsLoaded.push_back(*i);
274
275 for (vector<string>::iterator i = resourcePathsLoaded.begin(); i != resourcePathsLoaded.end(); ++i)
276 if (! canUnloadPathLoaded[*i])
277 libraryPathsLoaded.push_back(*i);
278
279 return libraryPathsLoaded;
280}
281
286{
287 vector<string> libraryPathsLoaded;
288
289 for (vector<string>::iterator i = cachePathsLoaded.begin(); i != cachePathsLoaded.end(); ++i)
290 if (canUnloadPathLoaded[*i] && cachePathsToUnload.find(*i) == cachePathsToUnload.end())
291 libraryPathsLoaded.push_back(*i);
292
293 for (vector<string>::iterator i = resourcePathsLoaded.begin(); i != resourcePathsLoaded.end(); ++i)
294 if (canUnloadPathLoaded[*i] && resourcePathsToUnload.find(*i) == resourcePathsToUnload.end())
295 libraryPathsLoaded.push_back(*i);
296
297 return libraryPathsLoaded;
298}
299
304{
305 vector<string> unloadableResourcePathsLoaded;
306
307 for (vector<string>::iterator i = resourcePathsLoaded.begin(); i != resourcePathsLoaded.end(); ++i)
308 if (canUnloadPathLoaded[*i] && resourcePathsToUnload.find(*i) == resourcePathsToUnload.end())
309 unloadableResourcePathsLoaded.push_back(*i);
310
311 return unloadableResourcePathsLoaded;
312}
313
318{
319 vector<string> unloadableCachePathsLoaded;
320
321 for (vector<string>::iterator i = cachePathsLoaded.begin(); i != cachePathsLoaded.end(); ++i)
322 if (canUnloadPathLoaded[*i] && cachePathsToUnload.find(*i) == cachePathsToUnload.end())
323 unloadableCachePathsLoaded.push_back(*i);
324
325 return unloadableCachePathsLoaded;
326}
327
332{
333 map<string, set<string>> cachePathsAndDependenciesToUnload;
334
335 for (const string &path : cachePathsToUnload)
336 cachePathsAndDependenciesToUnload[path] = dependenciesLoaded[path];
337
338 return cachePathsAndDependenciesToUnload;
339}
340
345{
346 set<string> dependenciesLoadedSet;
347
348 set<string> libraryPathsLoaded;
349 vector<string> nonUnloadable = getNonUnloadableLibrariesLoaded();
350 vector<string> unloadable = getUnloadableLibrariesLoaded();
351 libraryPathsLoaded.insert(nonUnloadable.begin(), nonUnloadable.end());
352 libraryPathsLoaded.insert(unloadable.begin(), unloadable.end());
353
354 for (set<string>::iterator i = libraryPathsLoaded.begin(); i != libraryPathsLoaded.end(); ++i)
355 {
356 map<string, set<string> >::iterator j = dependenciesLoaded.find(*i);
357 if (j != dependenciesLoaded.end())
358 dependenciesLoadedSet.insert(j->second.begin(), j->second.end());
359 }
360
361 return dependenciesLoadedSet;
362}
363
369{
370 externalLibraries.insert(paths.begin(), paths.end());
371}
372
378{
379 externalFrameworks.insert(paths.begin(), paths.end());
380}
381
386{
387 return externalLibraries;
388}
389
394{
395 return externalFrameworks;
396}
397
403{
404 this->shouldDeleteResourceLibraries = shouldDeleteResourceLibraries;
405}