dol: initial dol commit
[jump.git] / dol / src / dol / visitor / cbe / lib / ProcessWrapperPPE.c
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
5  *      \r
6  *      Revision: \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
10  */\r
11 \r
12 #ifndef __PROCESS_WRAPPER_PPE_H__\r
13 #define __PROCESS_WRAPPER_PPE_H__\r
14 \r
15 #include <pthread.h>\r
16 #include <stdio.h>\r
17 #include <stddef.h>\r
18 #include <stdint.h>\r
19 #include <string.h>\r
20 #include <ctype.h>\r
21 #include <stdlib.h>\r
22 #include <time.h>\r
23 \r
24 #include "common_ppu.h"\r
25 #include "dol.h"\r
26 #include "ProcessWrapperHelp.h"\r
27 \r
28 \r
29 /**\r
30  * Read from the FIFO\r
31  */\r
32 void DOL_read(void *port, void *buf, int len, DOLProcess *process)\r
33 {\r
34         ProcessWrapper* process_wrapper = (ProcessWrapper*)process->wptr;\r
35         int i; \r
36 \r
37         for (i = 0; i < process_wrapper->number_of_ports; i++) \r
38         {\r
39                 if (process_wrapper->port_id[i] == (uint64_t)port) \r
40                 {\r
41                         int queue = process_wrapper->port_queue_id[i];\r
42                         int i = 0;      \r
43                         struct timespec t;\r
44                         t.tv_sec = 0;\r
45                         t.tv_nsec = 5;\r
46                 \r
47 \r
48                         while (process_wrapper->locBufCount[queue] < len)\r
49                         {\r
50                                 nanosleep(&t, NULL);\r
51                         };\r
52 \r
53                         char *buffer = (char *)buf;\r
54 \r
55                         pthread_mutex_lock( &(process_wrapper->mutex[queue]) );\r
56 \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
59                         {\r
60                                 memcpy(buffer, &(process_wrapper->locBuf[queue][process_wrapper->locBufStart[queue]]), len);\r
61                         }\r
62 \r
63                         // Has to write from the end and from the beginning of the buffer\r
64                         else\r
65                         {\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
68                         }\r
69 \r
70                         process_wrapper->locBufCount[queue] -= len;\r
71                         process_wrapper->locBufStart[queue] = (process_wrapper->locBufStart[queue] + len) % process_wrapper->MAXELEMENT;\r
72 \r
73                         pthread_mutex_unlock( & (process_wrapper->mutex[queue]) );\r
74 \r
75 \r
76                         break; \r
77                 }\r
78         }\r
79 }\r
80 \r
81 \r
82 /**\r
83  * Write data into the FIFO\r
84  */\r
85 void DOL_write(void *port, void *buf, int len, DOLProcess *process)\r
86 {\r
87         ProcessWrapper* process_wrapper = (ProcessWrapper*)process->wptr;\r
88         int i; \r
89         \r
90         for (i = 0; i < process_wrapper->number_of_ports; i++) \r
91         {\r
92                 if (process_wrapper->port_id[i] == (uint64_t)port) \r
93                 {\r
94                         // This is our queue\r
95                         int queue = process_wrapper->port_queue_id[i];\r
96 \r
97                         struct timespec t;\r
98                         t.tv_sec = 0;\r
99                         t.tv_nsec = 5;\r
100 \r
101                         // Wait if there is not enough space in the fifo                        \r
102                         while (process_wrapper->MAXELEMENT - process_wrapper->locBufCount[queue] < len)\r
103                         {\r
104                                 nanosleep(&t, NULL);\r
105                         };\r
106 \r
107                         char *buffer = (char *)buf;\r
108 \r
109                         pthread_mutex_lock( &(process_wrapper->mutex[queue]) );\r
110 \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
113                         {\r
114                                 memcpy(&(process_wrapper->locBuf[queue][(process_wrapper->locBufStart[queue] + process_wrapper->locBufCount[queue]) % process_wrapper->MAXELEMENT]), buffer, len);\r
115                         }\r
116 \r
117                         // Otherwise something at the end and something at the beginning\r
118                         else\r
119                         {\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
122 \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
125                         }\r
126 \r
127                         process_wrapper->locBufCount[queue]+=len;\r
128 \r
129                         pthread_mutex_unlock( & (process_wrapper->mutex[queue]) );\r
130 \r
131                         break;\r
132                 }\r
133         }\r
134 }\r
135 \r
136 /**\r
137  * Detach the DOL Process\r
138  */\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
142         \r
143         pthread_mutex_lock( (process_wrapper->mutexProcessNr) );\r
144         (* process_wrapper->processFinished)++;\r
145         pthread_mutex_unlock( (process_wrapper->mutexProcessNr) );\r
146 \r
147         ((ProcessWrapper*)process->wptr)->is_detached = 1;\r
148 }\r
149 \r
150 #endif\r