aboutsummaryrefslogtreecommitdiff
path: root/pdoctave_dataframe.c
diff options
context:
space:
mode:
Diffstat (limited to 'pdoctave_dataframe.c')
-rw-r--r--pdoctave_dataframe.c249
1 files changed, 249 insertions, 0 deletions
diff --git a/pdoctave_dataframe.c b/pdoctave_dataframe.c
new file mode 100644
index 0000000..7193c62
--- /dev/null
+++ b/pdoctave_dataframe.c
@@ -0,0 +1,249 @@
+#include "pdoctave_dataframe.h"
+
+SharedDataFrame *newSharedDataFrame ()
+{
+ int id;
+ SharedDataFrame *sdf;
+
+ id = shmget (IPC_PRIVATE, sizeof(SharedDataFrame),
+ SHM_R | SHM_W);
+
+ if (id == -1) return 0;
+
+ sdf = shmat (id, 0, 0);
+
+ if (sdf == (SharedDataFrame *) -1) {
+ shmctl (id, IPC_RMID, 0);
+ return 0;
+ }
+
+ sdf->frame_attached = 1;
+ sdf->data_attached = 0;
+ sdf->data_frame_id = id;
+ sdf->data_vec_id = -1;
+ sdf->block_for_write = 0;
+ sdf->block_for_read = 0;
+
+ return sdf;
+}
+
+
+SharedDataFrame *getSharedDataFrame (int id)
+{
+ SharedDataFrame *sdf;
+
+ sdf = shmat (id, 0, 0);
+
+ if (sdf == (SharedDataFrame *) -1)
+ return 0;
+
+ sdf->frame_attached++;
+
+ return sdf;
+}
+
+
+
+
+void freeSharedDataFrame (SharedDataFrame **sdf)
+{
+ SharedDataFrame *sdfp = *sdf;
+ if (sdfp) {
+ if (sdfp->frame_attached > 0)
+ sdfp->frame_attached--;
+ shmdt(sdfp);
+ *sdf = 0;
+ }
+}
+
+
+void removeSharedDataFrame (SharedDataFrame **sdf)
+{
+ int id;
+ SharedDataFrame *sdfp = *sdf;
+ if (sdfp) {
+ id = sdfp->data_frame_id;
+ if (sdfp->frame_attached > 0)
+ shmdt (sdfp);
+ if (id != -1)
+ shmctl(id, IPC_RMID, 0);
+ *sdf = 0;
+ }
+}
+
+
+int getSharedDataFrameId (SharedDataFrame *sdf)
+{
+ if (sdf)
+ return sdf->data_frame_id;
+ else
+ return -1;
+}
+
+
+
+DatTyp getSharedDataType (SharedDataFrame *sdf)
+{
+ if (sdf)
+ return sdf->data_typ;
+ else
+ return UNKNOWN;
+}
+
+
+int getSharedDataVecLength (SharedDataFrame *sdf)
+{
+ if (sdf)
+ return sdf->data_vec_len;
+ else
+ return 0;
+}
+
+
+void *newSharedData (SharedDataFrame *sdf, int n, int size_bytes, DatTyp dtyp)
+{
+ void *data;
+ int id;
+
+ if (sdf) {
+
+ id = sdf->data_vec_id;
+ if (id == -1)
+ id = shmget(IPC_PRIVATE, n*size_bytes, SHM_R | SHM_W);
+
+ if (id == -1) return 0;
+
+ data = shmat(id,0,0);
+
+ if (data == (void *) -1) {
+ shmctl (id, IPC_RMID, 0);
+ return 0;
+ }
+
+ sdf->data_attached = 1;
+ sdf->data_size_bytes = size_bytes;
+ sdf->data_vec_len = n;
+ sdf->data_vec_id = id;
+ sdf->data_typ = dtyp;
+
+ return data;
+ }
+ else return 0;
+}
+
+
+void *getSharedData (SharedDataFrame *sdf)
+{
+ void *data;
+
+ if ((sdf)&&(sdf->data_vec_id != -1)) {
+
+ data = shmat(sdf->data_vec_id,0,0);
+
+ if (data == (void *) -1) {
+ return 0;
+ }
+
+ sdf->data_attached++;
+
+ return data;
+ }
+ else
+ return 0;
+}
+
+
+void freeSharedData (SharedDataFrame *sdf, void **data)
+{
+ void *datap = *data;
+ if (datap) {
+ shmdt(datap);
+ *data = 0;
+ if ((sdf)&&(sdf->data_attached > 0))
+ sdf->data_attached--;
+ }
+}
+
+
+void removeSharedData (SharedDataFrame *sdf, void **data)
+{
+ int id;
+ void *datap = *data;
+ if (datap) {
+ shmdt (datap);
+ *data = 0;
+ if (sdf) {
+ if (sdf->data_attached > 0)
+ sdf->data_attached--;
+ if (sdf->data_vec_id != -1) {
+ shmctl (sdf->data_vec_id, IPC_RMID, 0);
+ sdf->data_vec_id = -1;
+ }
+ }
+ }
+}
+
+void unBlockForReading (SharedDataFrame *sdf)
+{
+ if (sdf)
+ sdf->block_for_read = 0;
+}
+void unBlockForWriting (SharedDataFrame *sdf)
+{
+ if (sdf)
+ sdf->block_for_write = 0;
+}
+void blockForReading (SharedDataFrame *sdf)
+{
+ if (sdf)
+ sdf->block_for_read = 1;
+}
+void blockForWriting (SharedDataFrame *sdf)
+{
+ if (sdf)
+ sdf->block_for_write = 1;
+}
+void sleepUntilReadUnBlocked (SharedDataFrame *sdf, int usleep_time)
+{
+ int timer = 0;
+ if (sdf) {
+ while ((sdf->block_for_read!=0)&&(timer < MAX_SLEEP_TIME)) {
+ timer += usleep_time;
+ usleep (usleep_time);
+ }
+ }
+}
+void sleepUntilReadBlocked (SharedDataFrame *sdf, int usleep_time)
+{
+ int timer = 0;
+ if (sdf) {
+ while ((sdf->block_for_read==0)&&(timer < MAX_SLEEP_TIME)) {
+ timer +=usleep_time;
+ usleep (usleep_time);
+ }
+
+ }
+}
+void sleepUntilWriteUnBlocked (SharedDataFrame *sdf, int usleep_time)
+{
+ int timer = 0;
+ if (sdf) {
+ while ((sdf->block_for_write!=0)&&(timer < MAX_SLEEP_TIME)) {
+ timer +=usleep_time;
+ usleep (usleep_time);
+ }
+
+ }
+}
+void sleepUntilWriteBlocked (SharedDataFrame *sdf, int usleep_time)
+{
+ int timer = 0;
+ if (sdf) {
+ while ((sdf->block_for_write==0)&&(timer < MAX_SLEEP_TIME)) {
+ timer +=usleep_time;
+ usleep (usleep_time);
+ }
+
+ }
+}
+