Vuo  2.3.2
VuoCompositionState.c
Go to the documentation of this file.
1 
10 #include <dlfcn.h>
11 #include "VuoCompositionState.h"
12 
17 {
18  struct VuoCompositionState *compositionState = (struct VuoCompositionState *)malloc(sizeof(struct VuoCompositionState));
19  compositionState->runtimeState = runtimeState;
20  compositionState->compositionIdentifier = compositionIdentifier;
21  return compositionState;
22 }
23 
28 {
29  return compositionState->runtimeState;
30 }
31 
36 {
37  return compositionState->compositionIdentifier;
38 }
39 
43 void vuoFreeCompositionState(struct VuoCompositionState *compositionState)
44 {
45  free(compositionState);
46 }
47 
51 pthread_key_t vuoCompositionStateKey;
52 
56 static void __attribute__((constructor)) compositionStateKey_init(void)
57 {
58  int ret = pthread_key_create(&vuoCompositionStateKey, NULL);
59  if (ret)
60  VUserLog("Couldn't create the key for storing the composition state in thread-local state: %s", strerror(errno));
61 }
62 
68 {
69  int ret = pthread_setspecific(vuoCompositionStateKey, compositionState);
70  if (ret)
71  VUserLog("Couldn't store the composition state in thread-local state: %s", strerror(errno));
72 }
73 
79 {
80  int ret = pthread_setspecific(vuoCompositionStateKey, NULL);
81  if (ret)
82  VUserLog("Couldn't store a null composition state in thread-local state: %s", strerror(errno));
83 }
84 
92 {
93  void *compositionState = pthread_getspecific(vuoCompositionStateKey);
94  if (! compositionState)
95  {
96  void **vuoRuntimeState = (void **) dlsym(RTLD_SELF, "vuoRuntimeState");
97  if (!vuoRuntimeState)
98  vuoRuntimeState = (void **) dlsym(RTLD_DEFAULT, "vuoRuntimeState");
100  VUserLog("Warning: Couldn't find the composition state in thread-local state.");
101  return NULL;
102  }
103 
104  struct VuoCompositionState *compositionStateCopy = (struct VuoCompositionState *)malloc(sizeof(struct VuoCompositionState));
105  compositionStateCopy->runtimeState = ((struct VuoCompositionState *)compositionState)->runtimeState;
106  compositionStateCopy->compositionIdentifier = NULL;
107  return compositionStateCopy;
108 }