Vuo  2.0.0
libmodule.c
Go to the documentation of this file.
1 
10 #include <dlfcn.h>
11 #include <limits.h>
12 #include "VuoCompositionState.h"
13 
14 #include "module.h"
15 
17 
22 {
23  typedef void * (*funcType)(void);
24  funcType vuoCopyCompositionStateFromThreadLocalStorage = (funcType) dlsym(RTLD_SELF, "vuoCopyCompositionStateFromThreadLocalStorage");
26  vuoCopyCompositionStateFromThreadLocalStorage = (funcType) dlsym(RTLD_DEFAULT, "vuoCopyCompositionStateFromThreadLocalStorage");
27 
29 }
30 
36 dispatch_once_t VuoGetWorkingDirectoryOnce = 0;
37 
43 const char *VuoGetWorkingDirectory(void)
44 {
45  static char *workingDirectoryResult = NULL;
46  dispatch_once(&VuoGetWorkingDirectoryOnce, ^{
47  typedef char * (*vuoGetWorkingDirectoryType)(struct VuoCompositionState *);
48  vuoGetWorkingDirectoryType vuoGetWorkingDirectory = (vuoGetWorkingDirectoryType) dlsym(RTLD_SELF, "vuoGetWorkingDirectory");
50  vuoGetWorkingDirectory = (vuoGetWorkingDirectoryType) dlsym(RTLD_DEFAULT, "vuoGetWorkingDirectory");
51 
53  {
54  void *compositionState = copyCompositionStateFromThreadLocalStorage();
55  workingDirectoryResult = vuoGetWorkingDirectory((struct VuoCompositionState *)compositionState);
56  free(compositionState);
57  }
58  else
59  {
60  // Keep consistent with VuoRuntimePersistentState::getCurrentWorkingDirectory().
61  char currentWorkingDirectory[PATH_MAX+1];
62  getcwd(currentWorkingDirectory, PATH_MAX+1);
63  workingDirectoryResult = strdup(currentWorkingDirectory);
64  }
65  });
66  return workingDirectoryResult;
67 }
68 
69 pid_t VuoGetRunnerPid(void)
70 {
71  typedef pid_t (*vuoGetRunnerPidType)(struct VuoCompositionState *);
72  vuoGetRunnerPidType vuoGetRunnerPid = (vuoGetRunnerPidType) dlsym(RTLD_SELF, "vuoGetRunnerPid");
73  if (!vuoGetRunnerPid)
74  vuoGetRunnerPid = (vuoGetRunnerPidType) dlsym(RTLD_DEFAULT, "vuoGetRunnerPid");
75 
76  void *compositionState = copyCompositionStateFromThreadLocalStorage();
77  pid_t runnerPid = vuoGetRunnerPid((struct VuoCompositionState *)compositionState);
78  free(compositionState);
79  return runnerPid;
80 }
81 
83 {
84  typedef void (*vuoStopCompositionType)(struct VuoCompositionState *);
85  vuoStopCompositionType vuoStopComposition = (vuoStopCompositionType) dlsym(RTLD_SELF, "vuoStopComposition");
86  if (!vuoStopComposition)
87  vuoStopComposition = (vuoStopCompositionType) dlsym(RTLD_DEFAULT, "vuoStopComposition");
88 
89  void *compositionState = copyCompositionStateFromThreadLocalStorage();
90  vuoStopComposition((struct VuoCompositionState *)compositionState);
91  free(compositionState);
92 }
93 
95 {
96  typedef void (*vuoStopCompositionType)(struct VuoCompositionState *);
97  vuoStopCompositionType vuoStopComposition = (vuoStopCompositionType) dlsym(RTLD_SELF, "vuoStopComposition");
98  if (!vuoStopComposition)
99  vuoStopComposition = (vuoStopCompositionType) dlsym(RTLD_DEFAULT, "vuoStopComposition");
100 
101  vuoStopComposition(NULL);
102 }
103 
105 {
106  typedef void (*vuoAddCompositionFiniCallbackType)(struct VuoCompositionState *, VuoCompositionFiniCallback);
107  vuoAddCompositionFiniCallbackType vuoAddCompositionFiniCallback = (vuoAddCompositionFiniCallbackType) dlsym(RTLD_SELF, "vuoAddCompositionFiniCallback");
109  vuoAddCompositionFiniCallback = (vuoAddCompositionFiniCallbackType) dlsym(RTLD_DEFAULT, "vuoAddCompositionFiniCallback");
110 
112  {
113  void *compositionState = copyCompositionStateFromThreadLocalStorage();
114  vuoAddCompositionFiniCallback((struct VuoCompositionState *)compositionState, fini);
115  free(compositionState);
116  }
117 }
118 
120 {
121  typedef void (*vuoDisableTerminationType)(struct VuoCompositionState *);
122  vuoDisableTerminationType vuoDisableTermination = (vuoDisableTerminationType) dlsym(RTLD_SELF, "vuoDisableTermination");
124  vuoDisableTermination = (vuoDisableTerminationType) dlsym(RTLD_DEFAULT, "vuoDisableTermination");
125 
126  void *compositionState = copyCompositionStateFromThreadLocalStorage();
127  vuoDisableTermination((struct VuoCompositionState *)compositionState);
128  free(compositionState);
129 }
130 
132 {
133  typedef void (*vuoEnableTerminationType)(struct VuoCompositionState *);
134  vuoEnableTerminationType vuoEnableTermination = (vuoEnableTerminationType) dlsym(RTLD_SELF, "vuoEnableTermination");
136  vuoEnableTermination = (vuoEnableTerminationType) dlsym(RTLD_DEFAULT, "vuoEnableTermination");
137 
138  void *compositionState = copyCompositionStateFromThreadLocalStorage();
139  vuoEnableTermination((struct VuoCompositionState *)compositionState);
140  free(compositionState);
141 }
142 
144 {
145  typedef bool (*vuoShouldShowSplashWindowType)(void);
146  vuoShouldShowSplashWindowType vuoShouldShowSplashWindow = (vuoShouldShowSplashWindowType) dlsym(RTLD_DEFAULT, "vuoShouldShowSplashWindow");
147  if (!vuoShouldShowSplashWindow)
148  {
149 // VLog("Warning: Couldn't find symbol VuoShouldShowSplashWindow.");
150  return false;
151  }
152 // VLog("shouldShowSplashWindow = %d",vuoShouldShowSplashWindow());
153  return vuoShouldShowSplashWindow();
154 }
155 
160 {
161  // Based on https://software.intel.com/en-us/articles/how-to-detect-new-instruction-support-in-the-4th-generation-intel-core-processor-family
162  uint32_t eax = 7, ebx, ecx = 0, edx;
163  __asm__ ( "cpuid" : "+b" (ebx), "+a" (eax), "+c" (ecx), "=d" (edx) );
164  uint32_t avx2_mask = 1 << 5;
165  return (ebx & avx2_mask) == avx2_mask;
166 }