diff options
author | Miller Puckette <millerpuckette@users.sourceforge.net> | 2008-01-24 00:39:51 +0000 |
---|---|---|
committer | Miller Puckette <millerpuckette@users.sourceforge.net> | 2008-01-24 00:39:51 +0000 |
commit | 99a63a7a0c96b302c25079105b4ac3f77bd4b141 (patch) | |
tree | 501810cf5c1c6f1f065c3bcbc7fc22075a047994 /pd/src/s_loader.c | |
parent | cde1ee8fa147dfd15dc5c5b43093cd8c8a402b74 (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.c | 37 |
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)); +} |