diff options
| author | Eleni Maria Stea <elene.mst@gmail.com> | 2013-03-12 02:32:27 +0200 |
|---|---|---|
| committer | Eleni Maria Stea <elene.mst@gmail.com> | 2013-03-12 02:32:27 +0200 |
| commit | 4c593fbf3f382ffca0c20b9d406e10228cc75da4 (patch) | |
| tree | 4e362aae583a87a2259aa797a3f5c027dcb9f184 | |
| parent | 32869d8ffb64be82541f48166c5e73a6c4336135 (diff) | |
added shared memory
| -rw-r--r-- | Makefile | 2 | ||||
| -rw-r--r-- | src/shalloc.cc | 30 |
2 files changed, 29 insertions, 3 deletions
@@ -18,7 +18,7 @@ endif CXX = g++ CXXFLAGS = -pedantic -Wall $(dbg) $(opt) $(inc) $(def) `freetype-config --cflags` -LDFLAGS = $(libs) `freetype-config --libs` +LDFLAGS = $(libs) `freetype-config --libs` -lrt $(bin): $(obj) $(CXX) -o $@ $(obj) $(LDFLAGS) diff --git a/src/shalloc.cc b/src/shalloc.cc index b5c155f..fd5809e 100644 --- a/src/shalloc.cc +++ b/src/shalloc.cc @@ -4,10 +4,18 @@ #include <stdint.h> #include <string.h> +#include <errno.h> +#include <fcntl.h> +#include <sys/mman.h> +#include <sys/stat.h> +#include <unistd.h> + #include <map> #include "shalloc.h" +#define SHMNAME "/winnie.shm" + #define POOL_SIZE 16777216 #define BLOCK_SIZE 512 @@ -21,6 +29,7 @@ static void alloc_blocks(int block_pos, int num_blocks); static void free_blocks(int block_pos, int num_blocks); static void print_stats(); +static int fd; static unsigned char *pool; static std::map<int, int> alloc_sizes; //starting block -> number of blocks @@ -39,9 +48,23 @@ static Statistics stats; bool init_shared_memory() { - if(!(pool = (unsigned char *)malloc(POOL_SIZE))) { + if(((fd = shm_open(SHMNAME, O_RDWR | O_CREAT, S_IRWXU)) == -1)) { + fprintf(stderr, "Failed to open shared memory: %s\n", strerror(errno)); return false; } + ftruncate(fd, POOL_SIZE); + + if((pool = (unsigned char*)mmap(0, POOL_SIZE, PROT_READ | PROT_WRITE, + MAP_SHARED, fd, 0)) == (void*)-1) { + fprintf(stderr, "Failed to map shared memory: %s\n", strerror(errno)); + } + + shm_unlink(SHMNAME); + + //TODO delete it + /*if(!(pool = (unsigned char *)malloc(POOL_SIZE))) { + return false; + }*/ for(int i=0; i<BITMAP_SIZE; i++) { bitmap[i] = 0; @@ -56,7 +79,10 @@ bool init_shared_memory() void destroy_shared_memory() { print_stats(); - free(pool); + //free(pool); //TODO DELETE it + if(munmap(pool, POOL_SIZE) == -1) { + fprintf(stderr, "Failed to unmap shared memory: %s\n", strerror(errno)); + } } void *sh_malloc(size_t bytes) |
