aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorIOhannes m zmölnig <zmoelnig@users.sourceforge.net>2015-04-30 20:06:23 +0000
committerIOhannes m zmölnig <zmoelnig@users.sourceforge.net>2015-04-30 20:06:23 +0000
commit332485a61701a72ba8c8aa25eef602c4f1ef92a6 (patch)
tree0a4ffa93ba8996a7608999b3a414b8eb03d4a4c2 /src
parent7ea745f9ab7c2346632889c340e8586a09f986de (diff)
provide a wrapper around sys_close()
that always works, even with old Pd-versions (where we fallback to close()) svn path=/trunk/externals/iem/iemmatrix/; revision=17458
Diffstat (limited to 'src')
-rw-r--r--src/iemmatrix.h6
-rw-r--r--src/iemmatrix_utility.c42
2 files changed, 48 insertions, 0 deletions
diff --git a/src/iemmatrix.h b/src/iemmatrix.h
index dc02288..72d6d57 100644
--- a/src/iemmatrix.h
+++ b/src/iemmatrix.h
@@ -197,6 +197,12 @@ t_matrixfloat*mtx_doTranspose(t_matrixfloat*output, int row, int col);
t_matrixfloat*mtx_doMultiply(int rowA, t_matrixfloat*A, int colArowB, t_matrixfloat*B, int colB);
+/** wrapper functions in iemmatrix_utility.c
+ *
+ * iemmatrix_fdclose == sys_close
+ */
+int iemmatrix_fdclose(int fd);
+
/* for debugging purposes */
#define MARK startpost("MARK[%s:%d@%s]", __FILE__, __LINE__, __FUNCTION__), post
diff --git a/src/iemmatrix_utility.c b/src/iemmatrix_utility.c
index 5d3d208..53cc2bc 100644
--- a/src/iemmatrix_utility.c
+++ b/src/iemmatrix_utility.c
@@ -16,6 +16,22 @@
G.Holzmann: this has been in mtx_matrix.c before
now here should be the shared code !!!
*/
+#if defined __linux__ || defined __APPLE__
+# define DL_OPEN
+#endif
+
+#ifdef DL_OPEN
+# define _GNU_SOURCE
+# include <dlfcn.h>
+#endif
+
+#if defined _WIN32
+# include <io.h>
+# include <windows.h>
+# define close _close
+#endif
+
+#include <unistd.h>
#include "iemmatrix.h"
@@ -520,3 +536,29 @@ t_matrixfloat*mtx_doMultiply(int rowA, t_matrixfloat*A, int colArowB, t_matrixfl
}
return result;
}
+
+
+static void*get_function(const char*name) {
+#ifdef DL_OPEN
+ return (void*)dlsym(RTLD_DEFAULT, name);
+#elif defined _WIN32
+ return (void*)GetProcAddress( GetModuleHandle("pd.dll"), name);
+#else
+ // no loader for older Pd's....
+#endif
+ return NULL;
+}
+typedef int (*fdclose_fun_t)(int fd);
+static fdclose_fun_t get_sysclose() {
+ fdclose_fun_t my_close=(fdclose_fun_t)get_function("sys_close");
+ if(!my_close)
+ my_close=close;
+ return my_close;
+}
+
+
+int iemmatrix_fdclose(int fd) {
+ static fdclose_fun_t my_close=0;
+ if(!my_close)my_close=get_sysclose();
+ return my_close(fd);
+}