aboutsummaryrefslogtreecommitdiff
path: root/pd/src/s_loader.c
diff options
context:
space:
mode:
authorMiller Puckette <millerpuckette@users.sourceforge.net>2008-01-24 00:39:51 +0000
committerMiller Puckette <millerpuckette@users.sourceforge.net>2008-01-24 00:39:51 +0000
commit99a63a7a0c96b302c25079105b4ac3f77bd4b141 (patch)
tree501810cf5c1c6f1f065c3bcbc7fc22075a047994 /pd/src/s_loader.c
parentcde1ee8fa147dfd15dc5c5b43093cd8c8a402b74 (diff)
release 0.41-0
svn path=/trunk/; revision=9157
Diffstat (limited to 'pd/src/s_loader.c')
-rw-r--r--pd/src/s_loader.c37
1 files changed, 37 insertions, 0 deletions
diff --git a/pd/src/s_loader.c b/pd/src/s_loader.c
index 4788c13c..aac50898 100644
--- a/pd/src/s_loader.c
+++ b/pd/src/s_loader.c
@@ -20,6 +20,9 @@
#include "m_pd.h"
#include "s_stuff.h"
#include <stdio.h>
+#ifdef _MSC_VER /* This is only for Microsoft's compiler, not cygwin, e.g. */
+#define snprintf sprintf_s
+#endif
typedef void (*t_xxx)(void);
@@ -238,3 +241,37 @@ int sys_load_lib(t_canvas *canvas, char *classname)
return ok;
}
+int sys_run_scheduler(const char *externalschedlibname,
+ const char *sys_extraflagsstring)
+{
+ typedef int (*t_externalschedlibmain)(const char *);
+ t_externalschedlibmain externalmainfunc;
+ char filename[MAXPDSTRING];
+ snprintf(filename, sizeof(filename), "%s.%s", externalschedlibname,
+ sys_dllextent);
+ sys_bashfilename(filename, filename);
+#ifdef MSW
+ {
+ HINSTANCE ntdll = LoadLibrary(filename);
+ if (!ntdll)
+ {
+ post("%s: couldn't load external scheduler lib ", filename);
+ return (0);
+ }
+ externalmainfunc =
+ (t_externalschedlibmain)GetProcAddress(ntdll, "main");
+ }
+#else
+ {
+ void *dlobj = dlopen(filename, RTLD_NOW | RTLD_GLOBAL);
+ if (!dlobj)
+ {
+ post("%s: %s", filename, dlerror());
+ return (0);
+ }
+ externalmainfunc = (t_externalschedlibmain)dlsym(dlobj,
+ "pd_extern_sched");
+ }
+#endif
+ return((*externalmainfunc)(sys_extraflagsstring));
+}