Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <unistd.h>
- #include <sys/sysinfo.h>
- #include <stdlib.h>
- #include <limits.h>
- #include <sys/mman.h>
- #include <fcntl.h>
- #include <semaphore.h>
- #include <sys/stat.h>
- typedef double (*function_t)(double);
- double* pmap_process(function_t func, const double *in, size_t count);
- void pmap_free(double *ptr, size_t count);
- double* pmap_process(function_t func, const double *in, size_t count) {
- int processes_num = get_nprocs();
- double* values = (double*) mmap(NULL, sizeof(double)*count, PROT_WRITE|PROT_READ, MAP_SHARED|MAP_ANONYMOUS, -1, 0);
- sem_t* sem = (sem_t*) mmap(NULL, sizeof(sem_t), PROT_WRITE|PROT_READ, MAP_SHARED|MAP_ANONYMOUS, -1, 0);
- for (size_t i = 0; i < count; i++) {
- values[i] = in[i];
- }
- sem_init(sem, 1, processes_num);
- pid_t pids[processes_num];
- for (size_t i = 0; i < processes_num; ++i) {
- pids[i] = fork();
- if (pids[i] == 0) {
- sem_wait(sem);
- size_t from = i*count/processes_num;
- size_t to = (i+1)*count/processes_num - 1;
- if (i == processes_num) {
- to = count - 1;
- }
- for (from; from < to; from++) {
- values[from] = func(values[from]);
- }
- sem_post(sem);
- exit(0);
- }
- }
- int sem_value = 0;
- sem_getvalue(sem, &sem_value);
- while(sem_value != processes_num) {
- sem_getvalue(sem, &sem_value);
- }
- sem_destroy(sem);
- return values;
- }
- void pmap_free(double *ptr, size_t count) {
- munmap(ptr, sizeof(double)*count);
- }
Advertisement
Add Comment
Please, Sign In to add comment