Vuo  2.3.2
libmodule.c
Go to the documentation of this file.
1 
10 #include <dlfcn.h>
11 #include <limits.h>
12 #include <mach-o/dyld.h>
13 
14 #include "VuoCompositionState.h"
15 
16 #include "module.h"
17 
19 
24 {
25  typedef void * (*funcType)(void);
26  funcType vuoCopyCompositionStateFromThreadLocalStorage = (funcType) dlsym(RTLD_SELF, "vuoCopyCompositionStateFromThreadLocalStorage");
28  vuoCopyCompositionStateFromThreadLocalStorage = (funcType) dlsym(RTLD_DEFAULT, "vuoCopyCompositionStateFromThreadLocalStorage");
29 
31 }
32 
38 dispatch_once_t VuoGetWorkingDirectoryOnce = 0;
39 
45 const char *VuoGetWorkingDirectory(void)
46 {
47  static char *workingDirectoryResult = NULL;
48  dispatch_once(&VuoGetWorkingDirectoryOnce, ^{
49  typedef char * (*vuoGetWorkingDirectoryType)(struct VuoCompositionState *);
50  vuoGetWorkingDirectoryType vuoGetWorkingDirectory = (vuoGetWorkingDirectoryType) dlsym(RTLD_SELF, "vuoGetWorkingDirectory");
52  vuoGetWorkingDirectory = (vuoGetWorkingDirectoryType) dlsym(RTLD_DEFAULT, "vuoGetWorkingDirectory");
53 
55  {
56  void *compositionState = copyCompositionStateFromThreadLocalStorage();
57  workingDirectoryResult = vuoGetWorkingDirectory((struct VuoCompositionState *)compositionState);
58  free(compositionState);
59  }
60  else
61  {
62  // Keep consistent with VuoRuntimePersistentState::getCurrentWorkingDirectory().
63  char currentWorkingDirectory[PATH_MAX+1];
64  getcwd(currentWorkingDirectory, PATH_MAX+1);
65  workingDirectoryResult = strdup(currentWorkingDirectory);
66  }
67  });
68  return workingDirectoryResult;
69 }
70 
76 const char *VuoGetFrameworkPath(void)
77 {
78  static char frameworkPath[PATH_MAX+1] = "";
79  static dispatch_once_t once = 0;
80  dispatch_once(&once, ^{
81  uint32_t imageCount = _dyld_image_count();
82  for (uint32_t i = 0; i < imageCount; ++i)
83  {
84  const char *dylibPath = _dyld_get_image_name(i);
85  char *pos;
86  if ( (pos = strstr(dylibPath, "/Vuo.framework/")) )
87  {
88  strncpy(frameworkPath, dylibPath, pos-dylibPath);
89  break;
90  }
91  }
92  });
93  return frameworkPath;
94 }
95 
102 const char *VuoGetRunnerFrameworkPath(void)
103 {
104  static char frameworkPath[PATH_MAX+1] = "";
105  static dispatch_once_t once = 0;
106  dispatch_once(&once, ^{
107  uint32_t imageCount = _dyld_image_count();
108  for (uint32_t i = 0; i < imageCount; ++i)
109  {
110  const char *dylibPath = _dyld_get_image_name(i);
111  char *pos;
112  if ( (pos = strstr(dylibPath, "/VuoRunner.framework/")) )
113  {
114  strncpy(frameworkPath, dylibPath, pos-dylibPath);
115  break;
116  }
117  }
118  });
119  return frameworkPath;
120 }
121 
122 pid_t VuoGetRunnerPid(void)
123 {
124  typedef pid_t (*vuoGetRunnerPidType)(struct VuoCompositionState *);
125  vuoGetRunnerPidType vuoGetRunnerPid = (vuoGetRunnerPidType) dlsym(RTLD_SELF, "vuoGetRunnerPid");
126  if (!vuoGetRunnerPid)
127  vuoGetRunnerPid = (vuoGetRunnerPidType) dlsym(RTLD_DEFAULT, "vuoGetRunnerPid");
128 
129  void *compositionState = copyCompositionStateFromThreadLocalStorage();
130  pid_t runnerPid = vuoGetRunnerPid((struct VuoCompositionState *)compositionState);
131  free(compositionState);
132  return runnerPid;
133 }
134 
136 {
137  typedef void (*vuoStopCompositionType)(struct VuoCompositionState *);
138  vuoStopCompositionType vuoStopComposition = (vuoStopCompositionType) dlsym(RTLD_SELF, "vuoStopComposition");
139  if (!vuoStopComposition)
140  vuoStopComposition = (vuoStopCompositionType) dlsym(RTLD_DEFAULT, "vuoStopComposition");
141 
142  void *compositionState = copyCompositionStateFromThreadLocalStorage();
143  vuoStopComposition((struct VuoCompositionState *)compositionState);
144  free(compositionState);
145 }
146 
148 {
149  typedef void (*vuoStopCompositionType)(struct VuoCompositionState *);
150  vuoStopCompositionType vuoStopComposition = (vuoStopCompositionType) dlsym(RTLD_SELF, "vuoStopComposition");
151  if (!vuoStopComposition)
152  vuoStopComposition = (vuoStopCompositionType) dlsym(RTLD_DEFAULT, "vuoStopComposition");
153 
154  vuoStopComposition(NULL);
155 }
156 
158 {
159  typedef void (*vuoAddCompositionFiniCallbackType)(struct VuoCompositionState *, VuoCompositionFiniCallback);
160  vuoAddCompositionFiniCallbackType vuoAddCompositionFiniCallback = (vuoAddCompositionFiniCallbackType) dlsym(RTLD_SELF, "vuoAddCompositionFiniCallback");
162  vuoAddCompositionFiniCallback = (vuoAddCompositionFiniCallbackType) dlsym(RTLD_DEFAULT, "vuoAddCompositionFiniCallback");
163 
165  {
166  void *compositionState = copyCompositionStateFromThreadLocalStorage();
167  vuoAddCompositionFiniCallback((struct VuoCompositionState *)compositionState, fini);
168  free(compositionState);
169  }
170 }
171 
173 {
174  typedef void (*vuoDisableTerminationType)(struct VuoCompositionState *);
175  vuoDisableTerminationType vuoDisableTermination = (vuoDisableTerminationType) dlsym(RTLD_SELF, "vuoDisableTermination");
177  vuoDisableTermination = (vuoDisableTerminationType) dlsym(RTLD_DEFAULT, "vuoDisableTermination");
178 
179  void *compositionState = copyCompositionStateFromThreadLocalStorage();
180  vuoDisableTermination((struct VuoCompositionState *)compositionState);
181  free(compositionState);
182 }
183 
185 {
186  typedef void (*vuoEnableTerminationType)(struct VuoCompositionState *);
187  vuoEnableTerminationType vuoEnableTermination = (vuoEnableTerminationType) dlsym(RTLD_SELF, "vuoEnableTermination");
189  vuoEnableTermination = (vuoEnableTerminationType) dlsym(RTLD_DEFAULT, "vuoEnableTermination");
190 
191  void *compositionState = copyCompositionStateFromThreadLocalStorage();
192  vuoEnableTermination((struct VuoCompositionState *)compositionState);
193  free(compositionState);
194 }
195 
197 {
198  typedef bool (*vuoShouldShowSplashWindowType)(void);
199  vuoShouldShowSplashWindowType vuoShouldShowSplashWindow = (vuoShouldShowSplashWindowType) dlsym(RTLD_DEFAULT, "vuoShouldShowSplashWindow");
200  if (!vuoShouldShowSplashWindow)
201  {
202 // VLog("Warning: Couldn't find symbol VuoShouldShowSplashWindow.");
203  return false;
204  }
205 // VLog("shouldShowSplashWindow = %d",vuoShouldShowSplashWindow());
206  return vuoShouldShowSplashWindow();
207 }
208 
209 bool VuoIsPro(void)
210 {
211  static bool proEnabledResult = false;
212  static dispatch_once_t once = 0;
213  dispatch_once(&once, ^{
214  bool *proEnabled = (bool *) dlsym(RTLD_SELF, "VuoProEnabled");
215  if (!proEnabled)
216  proEnabled = (bool *) dlsym(RTLD_DEFAULT, "VuoProEnabled");
217  if (!proEnabled)
218  return;
219  proEnabledResult = *proEnabled;
220  });
221  return proEnabledResult;
222 }
223 
228 {
229 #if __x86_64__
230  // Based on https://software.intel.com/en-us/articles/how-to-detect-new-instruction-support-in-the-4th-generation-intel-core-processor-family
231  uint32_t eax = 7, ebx, ecx = 0, edx;
232  __asm__ ( "cpuid" : "+b" (ebx), "+a" (eax), "+c" (ecx), "=d" (edx) );
233  uint32_t avx2_mask = 1 << 5;
234  return (ebx & avx2_mask) == avx2_mask;
235 #else
236  return false;
237 #endif
238 }