/[cvs]/joko/Uni/BSArch/04/bmp_fractal.c
ViewVC logotype

Diff of /joko/Uni/BSArch/04/bmp_fractal.c

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 1.11 by joko, Sun Jul 2 02:12:27 2006 UTC revision 1.12 by joko, Sun Jul 2 09:27:14 2006 UTC
# Line 15  Line 15 
15  #define YSIZE 500  #define YSIZE 500
16  #include "algorithm.h"  #include "algorithm.h"
17    
 #define VERBOSE_HANDLE "stderr";  
   
18  BOOL VERBOSE = FALSE;  BOOL VERBOSE = FALSE;
19    
20    
# Line 175  int main(int argc, char *argv[]) { Line 173  int main(int argc, char *argv[]) {
173    
174    // threads or processes?    // threads or processes?
175    BOOL use_processes = TRUE;    BOOL use_processes = TRUE;
176    BOOL is_worker = FALSE;    BOOL is_worker_process = FALSE;
177        
178    // information for creating processes    // information for creating processes
179    STARTUPINFO si;    STARTUPINFO si;
# Line 188  int main(int argc, char *argv[]) { Line 186  int main(int argc, char *argv[]) {
186    // "parse" command line arguments    // "parse" command line arguments
187    if (argc >= 2) {    if (argc >= 2) {
188      if (strcmp(argv[1], "--worker") == 0) {      if (strcmp(argv[1], "--worker") == 0) {
189        is_worker = TRUE;        is_worker_process = TRUE;
190      }      }
191    }    }
192        
193    if (VERBOSE && use_processes) {    if (VERBOSE && use_processes) {
194      fprintf(stdout, "===================================================== ");      fprintf(stdout, "===================================================== ");
195      if (is_worker)      if (is_worker_process)
196        fprintf(stdout, "WORKER-PROCESS\n");        fprintf(stdout, "WORKER-PROCESS\n");
197      else      else
198        fprintf(stdout, "MASTER-PROCESS\n");        fprintf(stdout, "MASTER-PROCESS\n");
199    }    }
200        
201    // create empty bmp-file (black background)    // create empty bmp-file (black background)
202    if (!is_worker)    if (!is_worker_process)
203      write_blank_file("test.bmp");      write_blank_file("test.bmp");
204    
205    if (!is_worker) {    // master creates memory mapped file
206      if (!is_worker_process) {
207            
208      /* open file for reading and writing */      // open file for reading and writing
209      hFile = CreateFile("test.bmp", GENERIC_WRITE|GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);      hFile = CreateFile("test.bmp", GENERIC_WRITE|GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
210      if (INVALID_HANDLE_VALUE == hFile) {      if (INVALID_HANDLE_VALUE == hFile) {
211        err = GetLastError();        err = GetLastError();
212        printErrorAndExit("Error at CreateFile",err);        printErrorAndExit("Error at CreateFile",err);
213      }      }
214    
215      /* create the file mapping object */      // create the file mapping object
216      hMap = CreateFileMapping(hFile, NULL, PAGE_READWRITE, 0, 0, "bmp_fractal");      hMap = CreateFileMapping(hFile, NULL, PAGE_READWRITE, 0, 0, "bmp_fractal");
217      if (NULL == hMap) {      if (NULL == hMap) {
218        printErrorAndExit("Error at CreateFileMapping", GetLastError());        printErrorAndExit("Error at CreateFileMapping", GetLastError());
219      }      }
220          
221      // worker uses existing memory mapped file
222    } else {    } else {
223            
224      // open existing mapping object      // open existing mapping object
# Line 227  int main(int argc, char *argv[]) { Line 227  int main(int argc, char *argv[]) {
227        printErrorAndExit("Error at OpenFileMapping", GetLastError());        printErrorAndExit("Error at OpenFileMapping", GetLastError());
228    }    }
229        
230    /* map the whole file into the process context */    // map the whole file into the process context
231    pData = MapViewOfFile(hMap, FILE_MAP_WRITE, 0, 0, 0);    pData = MapViewOfFile(hMap, FILE_MAP_WRITE, 0, 0, 0);
232    if (NULL == pData) {    if (NULL == pData) {
233      printErrorAndExit("Error at MapViewOfFile", GetLastError());      printErrorAndExit("Error at MapViewOfFile", GetLastError());
# Line 244  int main(int argc, char *argv[]) { Line 244  int main(int argc, char *argv[]) {
244    }    }
245    
246        
247    if (use_processes && is_worker) {      if (use_processes && is_worker_process) {
248        
249      if (VERBOSE)      if (VERBOSE)
250        fprintf(stdout, "inside worker-process\n");        fprintf(stdout, "inside worker-process\n");
# Line 263  int main(int argc, char *argv[]) { Line 263  int main(int argc, char *argv[]) {
263      worker_args[0].pBitmap = pDataBitmap;      worker_args[0].pBitmap = pDataBitmap;
264    
265      fractal_create_segment(&worker_args[0]);      fractal_create_segment(&worker_args[0]);
266    
267        // cleanup mmap-handle
268        if (!CloseHandle(hMap))
269          printErrorAndExit("Error at CloseHandle", GetLastError());
270            
271      return 0;      return 0;
272    }    }
# Line 375  int main(int argc, char *argv[]) { Line 379  int main(int argc, char *argv[]) {
379    for (worker_index = 0; worker_index < workers; worker_index++)    for (worker_index = 0; worker_index < workers; worker_index++)
380      CloseHandle(worker_handles[worker_index]);      CloseHandle(worker_handles[worker_index]);
381            
382    /* write the result into the file */    // write the result into the file
383    if (!FlushViewOfFile(pData, 0)) {    if (!FlushViewOfFile(pData, 0)) {
384      err = GetLastError();      err = GetLastError();
385      printErrorAndExit("Error at UnmapViewOfFile", err);      printErrorAndExit("Error at UnmapViewOfFile", err);
386    }    }
387    
388    /* remove the mapped file */    // remove the mapped file
389    if (!UnmapViewOfFile(pData)) {    if (!UnmapViewOfFile(pData)) {
390      err = GetLastError();      err = GetLastError();
391      printErrorAndExit("Error at UnmapViewOfFile", err);      printErrorAndExit("Error at UnmapViewOfFile", err);
392      exit(err);      exit(err);
393    }    }
394        
395    /* cleanup handles */    // cleanup handles
396    if (!CloseHandle(hMap) || !CloseHandle(hFile) ) {    if (!CloseHandle(hMap) || !CloseHandle(hFile) ) {
397      err = GetLastError();      err = GetLastError();
398      printErrorAndExit("Error at CloseHandle", err);      printErrorAndExit("Error at CloseHandle", err);

Legend:
Removed from v.1.11  
changed lines
  Added in v.1.12

MailToCvsAdmin">MailToCvsAdmin
ViewVC Help
Powered by ViewVC 1.1.26 RSS 2.0 feed