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