Changeset: a50eba6a7e24 for MonetDB URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=a50eba6a7e24 Modified Files: gdk/shared_memory.c sql/backends/monet5/Tests/All Branch: pyapi Log Message:
Use mmap to communicate between processes when shared memory fails. diffs (165 lines): diff --git a/gdk/shared_memory.c b/gdk/shared_memory.c --- a/gdk/shared_memory.c +++ b/gdk/shared_memory.c @@ -3,6 +3,8 @@ #ifndef _WIN32 +#include "gdk.h" +#include "gdk_private.h" #include "../monetdb5/mal/mal_exception.h" #include <stdlib.h> @@ -21,7 +23,7 @@ #include <errno.h> #include <sys/sem.h> -static int *shm_memory_ids; +static lng *shm_memory_ids; static void **shm_ptrs; static int shm_unique_id = 1; static int shm_current_id = 0; @@ -33,9 +35,12 @@ static key_t base_key = 800000000; str init_shared_memory(int id, size_t size, void **ptr, int flags); -void store_shared_memory(int memory_id, void *ptr); +void store_shared_memory(lng memory_id, void *ptr); str release_shared_memory_id(int memory_id, void *ptr); +str init_mmap_memory(int id, size_t size, void **ptr, int flags); +str release_mmap_memory(void *ptr, size_t size); + int init_process_semaphore(int id, int count, int flags); str initialize_shared_memory(void) @@ -45,7 +50,7 @@ str initialize_shared_memory(void) //initialize the pointer to memory ID structure shm_ptrs = malloc(shm_max_id * sizeof(void*)); - shm_memory_ids = malloc(shm_max_id * sizeof(int)); + shm_memory_ids = malloc(shm_max_id * sizeof(lng)); shm_current_id = 0; shm_max_id = 32; shm_unique_id = 2; @@ -56,7 +61,7 @@ str initialize_shared_memory(void) return MAL_SUCCEED; } -void store_shared_memory(int memory_id, void *ptr) +void store_shared_memory(lng memory_id, void *ptr) { int i; @@ -76,10 +81,10 @@ void store_shared_memory(int memory_id, if (shm_current_id >= shm_max_id) { void **new_ptrs = malloc(shm_max_id * 2 * sizeof(void*)); - int *new_memory_ids = malloc(shm_max_id * 2 * sizeof(int)); + lng *new_memory_ids = malloc(shm_max_id * 2 * sizeof(lng)); memcpy(new_ptrs, shm_ptrs, sizeof(void*) * shm_max_id); - memcpy(new_memory_ids, shm_memory_ids, sizeof(int) * shm_max_id); + memcpy(new_memory_ids, shm_memory_ids, sizeof(lng) * shm_max_id); free(shm_ptrs); free(shm_memory_ids); shm_ptrs = new_ptrs; shm_memory_ids = new_memory_ids; @@ -101,14 +106,49 @@ 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; + 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); + } + store_shared_memory(size, ptr); + if (return_ptr != NULL) *return_ptr = ptr; + return MAL_SUCCEED; +} + +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); + } + return MAL_SUCCEED; +} + str create_shared_memory(int id, size_t size, void **return_ptr) { - return init_shared_memory(id, size, return_ptr, IPC_CREAT); + char *shared, *mmap; + 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); } str get_shared_memory(int id, size_t size, void **return_ptr) { - return init_shared_memory(id, size, return_ptr, 0); + char *shared, *mmap; + if ((shared = init_shared_memory(id, size, return_ptr, 0)) == MAL_SUCCEED) return MAL_SUCCEED; + if ((mmap = init_mmap_memory(id, size, return_ptr, 0)) == MAL_SUCCEED) return MAL_SUCCEED; + return createException(MAL, "shared_memory.release_mmap_memory", "Failed to get shared memory or mmap space.\nshared memory error: %s\nmmap error: %s", shared, mmap); } str ftok_enhanced(int id, key_t *return_key); @@ -120,12 +160,13 @@ str ftok_enhanced(int id, key_t *return_ str init_shared_memory(int id, size_t size, void **return_ptr, int flags) { - int shmid; + lng shmid; void *ptr; int i; key_t key; + str msg; - str msg = ftok_enhanced(id, &key); + msg = ftok_enhanced(id, &key); if (msg != MAL_SUCCEED) { return msg; @@ -156,7 +197,7 @@ str init_shared_memory(int id, size_t si { char *err = strerror(errno); errno = 0; - return createException(MAL, "shared_memory.get", "Error calling shmat(id:%d,NULL,0): %s", shmid, err); + return createException(MAL, "shared_memory.get", "Error calling shmat(id:%lld,NULL,0): %s", shmid, err); } store_shared_memory(shmid, ptr); @@ -187,7 +228,9 @@ str release_shared_memory(void *ptr) assert(memory_id); //actually release the memory at the given ID - return release_shared_memory_id(memory_id, ptr); + if (release_shared_memory_id(memory_id, ptr) == MAL_SUCCEED) return MAL_SUCCEED; + if (release_mmap_memory(ptr, memory_id) == MAL_SUCCEED) return MAL_SUCCEED; + return createException(MAL, "shared_memory.release", "Failed to release shared memory."); } str release_shared_memory_id(int memory_id, void *ptr) diff --git a/sql/backends/monet5/Tests/All b/sql/backends/monet5/Tests/All --- a/sql/backends/monet5/Tests/All +++ b/sql/backends/monet5/Tests/All @@ -17,6 +17,7 @@ HAVE_LIBPY?pyapi14 HAVE_LIBPY?pyapi16 HAVE_LIBPY?pyapi17 HAVE_LIBPY?pyapi18 +HAVE_LIBPY?pyapi19 #HAVE_LIBR?rapi00 #HAVE_LIBR?rapi01 _______________________________________________ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list