1 /****************************************************************
\r
2 * Process Wrapper Functions
\r
3 * Creator: lschor, 2008-10-30
\r
4 * Description: General process wrapper file, includes DOL_read and DOL_write as main functions
\r
7 * - 2008-10-30: Created
\r
8 * - 2008-11-08: Update to Double Buffering
\r
9 * - 2008-11-15: Added Performance Estimation methods
\r
12 #ifndef __PROCESS_WRAPPER_PPE_H__
\r
13 #define __PROCESS_WRAPPER_PPE_H__
\r
15 #include <pthread.h>
\r
24 #include "common_ppu.h"
\r
26 #include "ProcessWrapperHelp.h"
\r
30 * Read from the FIFO
\r
32 void DOL_read(void *port, void *buf, int len, DOLProcess *process)
\r
34 ProcessWrapper* process_wrapper = (ProcessWrapper*)process->wptr;
\r
37 for (i = 0; i < process_wrapper->number_of_ports; i++)
\r
39 if (process_wrapper->port_id[i] == (uint64_t)port)
\r
41 int queue = process_wrapper->port_queue_id[i];
\r
48 while (process_wrapper->locBufCount[queue] < len)
\r
50 nanosleep(&t, NULL);
\r
53 char *buffer = (char *)buf;
\r
55 pthread_mutex_lock( &(process_wrapper->mutex[queue]) );
\r
57 // Can directly read all elements from the end of the buffer
\r
58 if (process_wrapper->locBufStart[queue] + len < process_wrapper->MAXELEMENT)
\r
60 memcpy(buffer, &(process_wrapper->locBuf[queue][process_wrapper->locBufStart[queue]]), len);
\r
63 // Has to write from the end and from the beginning of the buffer
\r
66 memcpy(&(buffer[0]), &(process_wrapper->locBuf[queue][process_wrapper->locBufStart[queue]]), process_wrapper->MAXELEMENT - process_wrapper->locBufStart[queue]);
\r
67 memcpy(&(buffer[process_wrapper->MAXELEMENT - process_wrapper->locBufStart[queue]]), process_wrapper->locBuf[queue], len - process_wrapper->MAXELEMENT + process_wrapper->locBufStart[queue]);
\r
70 process_wrapper->locBufCount[queue] -= len;
\r
71 process_wrapper->locBufStart[queue] = (process_wrapper->locBufStart[queue] + len) % process_wrapper->MAXELEMENT;
\r
73 pthread_mutex_unlock( & (process_wrapper->mutex[queue]) );
\r
83 * Write data into the FIFO
\r
85 void DOL_write(void *port, void *buf, int len, DOLProcess *process)
\r
87 ProcessWrapper* process_wrapper = (ProcessWrapper*)process->wptr;
\r
90 for (i = 0; i < process_wrapper->number_of_ports; i++)
\r
92 if (process_wrapper->port_id[i] == (uint64_t)port)
\r
94 // This is our queue
\r
95 int queue = process_wrapper->port_queue_id[i];
\r
101 // Wait if there is not enough space in the fifo
\r
102 while (process_wrapper->MAXELEMENT - process_wrapper->locBufCount[queue] < len)
\r
104 nanosleep(&t, NULL);
\r
107 char *buffer = (char *)buf;
\r
109 pthread_mutex_lock( &(process_wrapper->mutex[queue]) );
\r
111 // Has to write all elements at the beginning or write all elements at the end of the buffer
\r
112 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
114 memcpy(&(process_wrapper->locBuf[queue][(process_wrapper->locBufStart[queue] + process_wrapper->locBufCount[queue]) % process_wrapper->MAXELEMENT]), buffer, len);
\r
117 // Otherwise something at the end and something at the beginning
\r
120 // At the end of the buffer
\r
121 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
123 // At the beginning
\r
124 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
127 process_wrapper->locBufCount[queue]+=len;
\r
129 pthread_mutex_unlock( & (process_wrapper->mutex[queue]) );
\r
137 * Detach the DOL Process
\r
139 void DOL_detach(DOLProcess *process) {
\r
140 ProcessWrapper* process_wrapper = (ProcessWrapper*)process->wptr;
\r
141 printf("[%s] DOL_detach.\n", (char*)(((ProcessWrapper*)process->wptr)->name));
\r
143 pthread_mutex_lock( (process_wrapper->mutexProcessNr) );
\r
144 (* process_wrapper->processFinished)++;
\r
145 pthread_mutex_unlock( (process_wrapper->mutexProcessNr) );
\r
147 ((ProcessWrapper*)process->wptr)->is_detached = 1;
\r