Changeset: d81dfed8b1b2 for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=d81dfed8b1b2
Modified Files:
        gdk/shared_memory.c
        monetdb5/extras/pyapi/pyapi.c
Branch: pyapi
Log Message:

GDKmmap causes bus errors, but this works.


diffs (161 lines):

diff --git a/gdk/shared_memory.c b/gdk/shared_memory.c
--- a/gdk/shared_memory.c
+++ b/gdk/shared_memory.c
@@ -6,6 +6,7 @@
 #include "gdk.h"
 #include "gdk_private.h"
 #include "../monetdb5/mal/mal_exception.h"
+#include "mutils.h"
 
 #include <stdlib.h>
 #include <assert.h>
@@ -106,21 +107,42 @@ int get_unique_shared_memory_id(int offs
        return id;
 }
 
-#define VERBOSE_MESSAGE(...) {              \
-    printf(__VA_ARGS__);                    \
-    fflush(stdout);                        \
-}
-
 str init_mmap_memory(int id, size_t size, void **return_ptr, int flags)
 {   
     char address[100];
     void *ptr;
+    int fd, result;
     snprintf(address, 100, "/tmp/temp_pyapi_mmap_%d", id);
-    (void) flags;
 
-    ptr = GDKmmap(address, MMAP_READ | MMAP_WRITE | MMAP_SEQUENTIAL | 
MMAP_SYNC, size);
-    if (ptr == NULL) {
-        return createException(MAL, "mmap.init", "Failure in 
GDKmmap(\"%s\",mode,%zu).", address, size);
+    fd = open(address, flags | O_RDWR, MONETDB_MODE);
+    if (fd < 0) {
+        char *err = strerror(errno);
+        errno = 0;
+        close(fd);
+        return createException(MAL, "shared_memory.get", "Could not create 
mmap file %s: %s", address, err);
+    }
+    if (flags != 0) {
+        result = lseek(fd, size - 1, SEEK_SET);
+        if (result == -1) {
+            char *err = strerror(errno);
+            errno = 0;
+            close(fd);
+            return createException(MAL, "shared_memory.get", "Failed to extend 
mmap file: %s", err);
+        }
+        result = write(fd, "", 1);
+        if (result != 1) {
+            char *err = strerror(errno);
+            errno = 0;
+            close(fd);
+            return createException(MAL, "shared_memory.get", "Failed to write 
to mmap file: %s", err);
+        }
+    }
+    ptr = mmap(NULL, size, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
+    close(fd);
+    if (ptr == (void*) -1) {
+        char *err = strerror(errno);
+        errno = 0;
+        return createException(MAL, "shared_memory.get", "Failure in 
mmap(NULL, %zu, PROT_WRITE, MAP_SHARED, %d, 0): %s", size, fd, err);
     }
     store_shared_memory(size, ptr);
     if (return_ptr != NULL) *return_ptr = ptr;
@@ -129,8 +151,12 @@ str init_mmap_memory(int id, size_t size
 
 str release_mmap_memory(void *ptr, size_t size)
 {
-    if (GDKmunmap(ptr, size) != GDK_SUCCEED) {
-        return createException(MAL, "mmap.release", "Failure in 
GDKmunmap(%p,%zu)", ptr, size);
+    int ret;
+    ret = munmap(ptr, size);
+    if (ret != 0) {
+        char *err = strerror(errno);
+        errno = 0;
+        return createException(MAL, "shared_memory.release_mmap_memory", 
"Failure in munmap(%p,%zu): %s", ptr, size, err);
     }
     return MAL_SUCCEED;
 }
@@ -138,7 +164,7 @@ str release_mmap_memory(void *ptr, size_
 str create_shared_memory(int id, size_t size, void **return_ptr)
 {
     char *shared, *mmap;
-       if ((shared = init_shared_memory(id, size, return_ptr, IPC_CREAT)) == 
MAL_SUCCEED) return MAL_SUCCEED;
+    if ((shared = init_shared_memory(id, size, return_ptr, IPC_CREAT)) == 
MAL_SUCCEED) return MAL_SUCCEED;
     if ((mmap = init_mmap_memory(id, size, return_ptr, O_CREAT)) == 
MAL_SUCCEED) return MAL_SUCCEED;
     return createException(MAL, "shared_memory.release_mmap_memory", "Failed 
to create shared memory or mmap space.\nshared memory error: %s\nmmap error: 
%s", shared, mmap);
 }
diff --git a/monetdb5/extras/pyapi/pyapi.c b/monetdb5/extras/pyapi/pyapi.c
--- a/monetdb5/extras/pyapi/pyapi.c
+++ b/monetdb5/extras/pyapi/pyapi.c
@@ -413,7 +413,7 @@ str PyAPIeval(Client cntxt, MalBlkPtr mb
     int shm_id = -1;
     int sem_id = -1;
     int process_id = 0;
-    int memory_size = 0;
+    size_t memory_size = 0;
     int process_count = 0;
 #endif
 #ifdef _PYAPI_TESTING_
@@ -669,7 +669,7 @@ str PyAPIeval(Client cntxt, MalBlkPtr mb
             for(i = 0; i < pci->retc; i++)
             {
                 PyReturn *ret = &pyreturn_values[i];
-                int total_size = 0;
+                size_t total_size = 0;
                 bool has_mask = false;
                 ret->count = 0;
                 ret->memory_size = 0;
@@ -699,7 +699,7 @@ str PyAPIeval(Client cntxt, MalBlkPtr mb
                 }
 
                 //get the shared memory address for this return value
-                VERBOSE_MESSAGE("Parent requesting memory at id %d of size 
%d\n", shm_id + (i + 1), total_size);
+                VERBOSE_MESSAGE("Parent requesting memory at id %d of size 
%zu\n", shm_id + (i + 1), total_size);
 
                 assert(total_size > 0);
                 MT_lock_set(&pyapiLock, "pyapi.evaluate");
@@ -719,7 +719,7 @@ str PyAPIeval(Client cntxt, MalBlkPtr mb
                 ret->multidimensional = FALSE;
                 if (has_mask)
                 {
-                    int mask_size = ret->count * sizeof(bool);
+                    lng mask_size = ret->count * sizeof(bool);
 
                     assert(mask_size > 0);
                     MT_lock_set(&pyapiLock, "pyapi.evaluate");
@@ -1022,8 +1022,8 @@ str PyAPIeval(Client cntxt, MalBlkPtr mb
             // Since we are the last process, it is our job to create the 
shared memory for each of the return values
             for (i = 0; i < pci->retc; i++)
             {
-                int return_size = 0;
-                int mask_size = 0;
+                size_t return_size = 0;
+                size_t mask_size = 0;
                 bool has_mask = false;
                 // Now we will count the size of the return values for each of 
the processes
                 for(j = 0; j < process_count; j++)
@@ -1035,7 +1035,7 @@ str PyAPIeval(Client cntxt, MalBlkPtr mb
                 }
                 assert(return_size > 0);
                 // Then we allocate the shared memory for this return value
-                VERBOSE_MESSAGE("Child creating shared memory at id %d of size 
%d\n", shm_id + (i + 1), return_size);
+                VERBOSE_MESSAGE("Child creating shared memory at id %d of size 
%zu\n", shm_id + (i + 1), return_size);
                 if (create_shared_memory(shm_id + (i + 1), return_size, NULL) 
!= MAL_SUCCEED)
                 {
                     msg = createException(MAL, "pyapi.eval", "Failed to 
allocate shared memory for returning data.\n");
@@ -1088,10 +1088,10 @@ str PyAPIeval(Client cntxt, MalBlkPtr mb
             char *mem_ptr;
             PyReturn *ret = &pyreturn_values[i];
             // First we compute the position where we will start writing in 
shared memory by looking at the processes before us
-            int start_size = 0;
-            int return_size = 0;
-            int mask_size = 0;
-            int mask_start = 0;
+            size_t start_size = 0;
+            size_t return_size = 0;
+            size_t mask_size = 0;
+            size_t mask_start = 0;
             bool has_mask = false;
             for(j = 0; j < process_count; j++)
             {
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to