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