dol: initial dol commit
[jump.git] / dol / src / dol / visitor / cbe / lib / ProcessWrapperPPE.c
diff --git a/dol/src/dol/visitor/cbe/lib/ProcessWrapperPPE.c b/dol/src/dol/visitor/cbe/lib/ProcessWrapperPPE.c
new file mode 100644 (file)
index 0000000..f94c7ea
--- /dev/null
@@ -0,0 +1,150 @@
+/**************************************************************** \r
+ *     Process Wrapper Functions\r
+ *     Creator: lschor, 2008-10-30\r
+ *     Description: General process wrapper file, includes DOL_read and DOL_write as main functions\r
+ *     \r
+ *     Revision: \r
+ *     - 2008-10-30: Created\r
+ *     - 2008-11-08: Update to Double Buffering\r
+ *     - 2008-11-15: Added Performance Estimation methods\r
+ */\r
+\r
+#ifndef __PROCESS_WRAPPER_PPE_H__\r
+#define __PROCESS_WRAPPER_PPE_H__\r
+\r
+#include <pthread.h>\r
+#include <stdio.h>\r
+#include <stddef.h>\r
+#include <stdint.h>\r
+#include <string.h>\r
+#include <ctype.h>\r
+#include <stdlib.h>\r
+#include <time.h>\r
+\r
+#include "common_ppu.h"\r
+#include "dol.h"\r
+#include "ProcessWrapperHelp.h"\r
+\r
+\r
+/**\r
+ * Read from the FIFO\r
+ */\r
+void DOL_read(void *port, void *buf, int len, DOLProcess *process)\r
+{\r
+       ProcessWrapper* process_wrapper = (ProcessWrapper*)process->wptr;\r
+       int i; \r
+\r
+       for (i = 0; i < process_wrapper->number_of_ports; i++) \r
+       {\r
+               if (process_wrapper->port_id[i] == (uint64_t)port) \r
+               {\r
+                       int queue = process_wrapper->port_queue_id[i];\r
+                       int i = 0;      \r
+                       struct timespec t;\r
+                       t.tv_sec = 0;\r
+                       t.tv_nsec = 5;\r
+               \r
+\r
+                       while (process_wrapper->locBufCount[queue] < len)\r
+                       {\r
+                               nanosleep(&t, NULL);\r
+                       };\r
+\r
+                       char *buffer = (char *)buf;\r
+\r
+                       pthread_mutex_lock( &(process_wrapper->mutex[queue]) );\r
+\r
+                       // Can directly read all elements from the end of the buffer\r
+                       if (process_wrapper->locBufStart[queue] + len < process_wrapper->MAXELEMENT)\r
+                       {\r
+                               memcpy(buffer, &(process_wrapper->locBuf[queue][process_wrapper->locBufStart[queue]]), len);\r
+                       }\r
+\r
+                       // Has to write from the end and from the beginning of the buffer\r
+                       else\r
+                       {\r
+                               memcpy(&(buffer[0]), &(process_wrapper->locBuf[queue][process_wrapper->locBufStart[queue]]), process_wrapper->MAXELEMENT - process_wrapper->locBufStart[queue]);\r
+                               memcpy(&(buffer[process_wrapper->MAXELEMENT - process_wrapper->locBufStart[queue]]), process_wrapper->locBuf[queue], len - process_wrapper->MAXELEMENT + process_wrapper->locBufStart[queue]);\r
+                       }\r
+\r
+                       process_wrapper->locBufCount[queue] -= len;\r
+                       process_wrapper->locBufStart[queue] = (process_wrapper->locBufStart[queue] + len) % process_wrapper->MAXELEMENT;\r
+\r
+                       pthread_mutex_unlock( & (process_wrapper->mutex[queue]) );\r
+\r
+\r
+                       break; \r
+               }\r
+       }\r
+}\r
+\r
+\r
+/**\r
+ * Write data into the FIFO\r
+ */\r
+void DOL_write(void *port, void *buf, int len, DOLProcess *process)\r
+{\r
+       ProcessWrapper* process_wrapper = (ProcessWrapper*)process->wptr;\r
+       int i; \r
+       \r
+       for (i = 0; i < process_wrapper->number_of_ports; i++) \r
+       {\r
+               if (process_wrapper->port_id[i] == (uint64_t)port) \r
+               {\r
+                       // This is our queue\r
+                       int queue = process_wrapper->port_queue_id[i];\r
+\r
+                       struct timespec t;\r
+                       t.tv_sec = 0;\r
+                       t.tv_nsec = 5;\r
+\r
+                       // Wait if there is not enough space in the fifo                        \r
+                       while (process_wrapper->MAXELEMENT - process_wrapper->locBufCount[queue] < len)\r
+                       {\r
+                               nanosleep(&t, NULL);\r
+                       };\r
+\r
+                       char *buffer = (char *)buf;\r
+\r
+                       pthread_mutex_lock( &(process_wrapper->mutex[queue]) );\r
+\r
+                       // Has to write all elements at the beginning or write all elements at the end of the buffer\r
+                       if (process_wrapper->locBufStart[queue] + process_wrapper->locBufCount[queue] > process_wrapper->MAXELEMENT || process_wrapper->locBufStart[queue] + process_wrapper->locBufCount[queue] + len < process_wrapper->MAXELEMENT)\r
+                       {\r
+                               memcpy(&(process_wrapper->locBuf[queue][(process_wrapper->locBufStart[queue] + process_wrapper->locBufCount[queue]) % process_wrapper->MAXELEMENT]), buffer, len);\r
+                       }\r
+\r
+                       // Otherwise something at the end and something at the beginning\r
+                       else\r
+                       {\r
+                               // At the end of the buffer\r
+                               memcpy(&(process_wrapper->locBuf[queue][(process_wrapper->locBufStart[queue] + process_wrapper->locBufCount[queue])]), buffer, process_wrapper->MAXELEMENT - process_wrapper->locBufStart[queue] - process_wrapper->locBufCount[queue]);\r
+\r
+                               // At the beginning\r
+                               memcpy(process_wrapper->locBuf[queue], &(buffer[process_wrapper->MAXELEMENT - process_wrapper->locBufStart[queue] - process_wrapper->locBufCount[queue]]), len - (process_wrapper->MAXELEMENT - process_wrapper->locBufStart[queue] - process_wrapper->locBufCount[queue]));\r
+                       }\r
+\r
+                       process_wrapper->locBufCount[queue]+=len;\r
+\r
+                       pthread_mutex_unlock( & (process_wrapper->mutex[queue]) );\r
+\r
+                       break;\r
+               }\r
+       }\r
+}\r
+\r
+/**\r
+ * Detach the DOL Process\r
+ */\r
+void DOL_detach(DOLProcess *process) {\r
+       ProcessWrapper* process_wrapper = (ProcessWrapper*)process->wptr;\r
+       printf("[%s] DOL_detach.\n", (char*)(((ProcessWrapper*)process->wptr)->name));\r
+       \r
+       pthread_mutex_lock( (process_wrapper->mutexProcessNr) );\r
+       (* process_wrapper->processFinished)++;\r
+       pthread_mutex_unlock( (process_wrapper->mutexProcessNr) );\r
+\r
+       ((ProcessWrapper*)process->wptr)->is_detached = 1;\r
+}\r
+\r
+#endif\r