aboutsummaryrefslogtreecommitdiff
path: root/write_shared_mem.cc
diff options
context:
space:
mode:
Diffstat (limited to 'write_shared_mem.cc')
-rw-r--r--write_shared_mem.cc105
1 files changed, 105 insertions, 0 deletions
diff --git a/write_shared_mem.cc b/write_shared_mem.cc
new file mode 100644
index 0000000..2149e91
--- /dev/null
+++ b/write_shared_mem.cc
@@ -0,0 +1,105 @@
+#include <octave/oct.h>
+
+#include <unistd.h>
+#include <string.h>
+#include "pdoctave_dataframe.h"
+
+DatTyp classifyOctPDType (octave_value res)
+{
+ DatTyp pdtyp;
+ if (res.is_real_scalar())
+ pdtyp = FLOAT;
+ else if (res.is_real_matrix())
+ pdtyp = MATRIX;
+ else if (res.is_string())
+ pdtyp = SYMBOL;
+ else
+ pdtyp = UNKNOWN;
+}
+
+void writeOctMatrixIntoFloat (Matrix mtx, float *f)
+{
+ int n = mtx.rows();
+ int m = mtx.columns();
+ int i;
+ int j;
+
+ *f++ = n;
+ *f++ = m;
+
+ for (j = 0; j < m; j++)
+ for (i=0; i < n; i++)
+ *f++ = (float) mtx(i,j);
+}
+
+void writeOctScalarIntoFloat (double d, float *f)
+{
+ *f = (float) d;
+}
+void writeOctStringIntoString (char *s, char *c)
+{
+ strcpy (s,c);
+}
+
+
+DEFUN_DLD (write_shared_mem, args, , "returning an octave value to pd-value")
+{
+ SharedDataFrame *sdf;
+ int size;
+ void *data;
+ DatTyp pdtype;
+ int shmem_id = args(1).int_value();
+
+ if (shmem_id == -1) {
+ error("failed to get valid id\n");
+ return octave_value();
+ }
+ sdf = getSharedDataFrame (shmem_id);
+
+ if (!sdf) {
+ error("failed to attach memory!\n");
+ return octave_value();
+ }
+
+ sleepUntilWriteBlocked (sdf,STD_USLEEP_TIME);
+
+ if (args(0).is_string()) {
+ pdtype = SYMBOL;
+ }
+ else if (args(0).is_real_matrix()) {
+ pdtype = MATRIX;
+ size = args(0).columns() * args(0).rows()+2;
+ if (data = newSharedData (sdf, size, sizeof(float),pdtype)) {
+ writeOctMatrixIntoFloat (args(0).matrix_value(), (float *) data);
+ }
+ else {
+ error("failed to get new data memory!");
+ unBlockForWriting (sdf);
+ freeSharedDataFrame (&sdf);
+ return octave_value();
+ }
+ }
+ else if (args(0).is_real_scalar()) {
+ pdtype = FLOAT;
+ if (data = newSharedData (sdf, 1, sizeof(float), pdtype)) {
+ writeOctScalarIntoFloat(args(0).scalar_value(), (float *) data);
+ }
+ else {
+ error("failed to get new data memory!");
+ unBlockForWriting (sdf);
+ freeSharedDataFrame (&sdf);
+ return octave_value();
+ }
+ }
+ else
+ std::cout << " no mehtod for argument conversion" << std::endl;
+
+ unBlockForWriting (sdf);
+
+ freeSharedData (sdf, &data);
+ freeSharedDataFrame (&sdf);
+
+ return octave_value();
+}
+
+