+/**************************************************************** \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