Changeset: e8f69defcfb2 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=e8f69defcfb2
Modified Files:
        clients/Tests/exports.stable.out
        gdk/gdk_interprocess.c
        gdk/gdk_interprocess.h
        sql/backends/monet5/UDF/pyapi/pyapi.c
Branch: Apr2019
Log Message:

Fixing interfaces of GDK interprocess functions.
GDK functions *return* success or failure and specify what's wrong
using GDKerror() and GDKsyserror() functions (which write in a
thread-local buffer).


diffs (truncated from 555 to 300 lines):

diff --git a/clients/Tests/exports.stable.out b/clients/Tests/exports.stable.out
--- a/clients/Tests/exports.stable.out
+++ b/clients/Tests/exports.stable.out
@@ -230,11 +230,11 @@ int GDKatomcnt;
 size_t GDKbatcopy(char *dest, BAT *bat, str colname);
 size_t GDKbatcopysize(BAT *bat, str colname);
 size_t GDKbatread(char *src, BAT **bat, str *colname);
-gdk_return GDKchangesemval(int sem_id, int number, int change, str *msg);
-gdk_return GDKchangesemval_timeout(int sem_id, int number, int change, int 
timeout_mseconds, bool *succeed, str *msg);
+gdk_return GDKchangesemval(int sem_id, int number, int change);
+gdk_return GDKchangesemval_timeout(int sem_id, int number, int change, int 
timeout_mseconds, bool *succeed);
 void GDKclrerr(void);
 gdk_return GDKcreatedir(const char *nme);
-gdk_return GDKcreatesem(int id, int count, int *semid, str *msg);
+gdk_return GDKcreatesem(int id, int count, int *semid);
 int GDKdebug;
 void GDKerror(_In_z_ _Printf_format_string_ const char *format, ...) 
__attribute__((__format__(__printf__, 1, 2)));
 void GDKexit(int status) __attribute__((__noreturn__));
@@ -253,10 +253,10 @@ int GDKgetenv_int(const char *name, int 
 bool GDKgetenv_istext(const char *name, const char *text);
 bool GDKgetenv_istrue(const char *name);
 bool GDKgetenv_isyes(const char *name);
-gdk_return GDKgetsem(int sem_id, int count, int *semid, str *msg);
-gdk_return GDKgetsemval(int sem_id, int number, int *semval, str *msg);
+gdk_return GDKgetsem(int sem_id, int count, int *semid);
+gdk_return GDKgetsemval(int sem_id, int number, int *semval);
 bool GDKinit(opt *set, int setlen);
-gdk_return GDKinitmmap(size_t id, size_t size, void **return_ptr, size_t 
*return_size, str *msg);
+void *GDKinitmmap(size_t id, size_t size, size_t *return_size);
 BAT *GDKkey;
 ATOMIC_TYPE volatile GDKlockcnt;
 ATOMIC_TYPE volatile GDKlockcontentioncnt;
@@ -275,8 +275,8 @@ void GDKprepareExit(void);
 void GDKqsort(void *restrict h, void *restrict t, const void *restrict base, 
size_t n, int hs, int ts, int tpe, bool reverse, bool nilslast);
 void *GDKrealloc(void *pold, size_t size) __attribute__((__alloc_size__(2))) 
__attribute__((__warn_unused_result__));
 void GDKregister(MT_Id pid);
-gdk_return GDKreleasemmap(void *ptr, size_t size, size_t id, str *msg);
-gdk_return GDKreleasesem(int sem_id, str *msg);
+gdk_return GDKreleasemmap(void *ptr, size_t size, size_t id);
+gdk_return GDKreleasesem(int sem_id);
 void GDKreset(int status, int exit);
 gdk_return GDKsetenv(const char *name, const char *value);
 void GDKsetmallocsuccesscount(lng count);
diff --git a/gdk/gdk_interprocess.c b/gdk/gdk_interprocess.c
--- a/gdk/gdk_interprocess.c
+++ b/gdk/gdk_interprocess.c
@@ -31,20 +31,11 @@
 static size_t interprocess_unique_id = 1;
 static key_t base_key = 800000000;
 
-gdk_return interprocess_init_semaphore(int id, int count, int flags, int 
*semid, str *msg);
-
 // Regular ftok produces too many collisions
-static gdk_return
+static inline void
 ftok_enhanced(int id, key_t * return_key)
 {
        *return_key = base_key + id;
-       return GDK_SUCCEED;
-}
-
-#define interprocess_create_error(...) {               \
-    *msg = (char*) GDKzalloc(500 * sizeof(char));      \
-    snprintf(*msg, 500, __VA_ARGS__);                  \
-    errno = 0;                                         \
 }
 
 //! Obtain a set of unique identifiers that can be used to create memory 
mapped files or semaphores
@@ -66,20 +57,16 @@ GDKuniqueid(size_t offset)
 //! Create a memory mapped file if it does not exist and open it
 /* id: The unique identifier of the memory mapped file (use GDKuniquemmapid to 
get a unique identifier)
  * size: Minimum required size of the file
- * return_ptr: Return value pointing into the file
- * msg: Error message (only set if function returns GDK_FAIL)
- * return: GDK_SUCCEED if successful, GDK_FAIL if not successful (with msg set 
to error message)
+ * return: Return value pointing into the file, NULL if not successful
 */
-gdk_return
-GDKinitmmap(size_t id, size_t size, void **return_ptr, size_t *return_size, 
str *msg)
+void *
+GDKinitmmap(size_t id, size_t size, size_t *return_size)
 {
        char address[100];
        void *ptr;
        int fd;
        int mod = MMAP_READ | MMAP_WRITE | MMAP_SEQUENTIAL | MMAP_SYNC | 
MAP_SHARED;
-       char *path = NULL;
-
-       assert(return_ptr != NULL);
+       char *path;
 
        GDKmmapfile(address, sizeof(address), id);
 
@@ -90,66 +77,53 @@ GDKinitmmap(size_t id, size_t size, void
         size = GDK_mmap_pagesize; */
        fd = GDKfdlocate(0, address, "wb", "tmp");
        if (fd < 0) {
-               interprocess_create_error("Failure in GDKfdlocate: %s", 
strerror(errno));
-               goto cleanup;
+               return NULL;
        }
        path = GDKfilepath(0, BATDIR, address, "tmp");
        if (path == NULL) {
-               interprocess_create_error("Failure in GDKfilepath: %s", 
strerror(errno));
-               goto cleanup;
+               return NULL;
        }
        close(fd);
        if (GDKextend(path, size) != GDK_SUCCEED) {
-               interprocess_create_error("Failure in GDKextend: %s", 
strerror(errno));
-               goto cleanup;
+               GDKfree(path);
+               return NULL;
        }
        ptr = GDKmmap(path, mod, size);
+       GDKfree(path);
        if (ptr == NULL) {
-               interprocess_create_error("Failure in GDKmmap: %s", 
strerror(errno));
-               goto cleanup;
+               return NULL;
        }
-       GDKfree(path);
-       *return_ptr = ptr;
        if (return_size != NULL) {
                *return_size = size;
        }
-       return GDK_SUCCEED;
-      cleanup:
-       if (path)
-               GDKfree(path);
-       return GDK_FAIL;
+       return ptr;
 }
 
 //! Release a memory mapped file that was created through GDKinitmmap
 /* ptr: Pointer to the file
  * size: Size of the file
  * id: Identifier of the file
- * msg: Error message (only set if function returns GDK_FAIL)
- * return: GDK_SUCCEED if successful, GDK_FAIL if not successful (with msg set 
to error message)
+ * return: GDK_SUCCEED if successful, GDK_FAIL if not successful
 */
 gdk_return
-GDKreleasemmap(void *ptr, size_t size, size_t id, str *msg)
+GDKreleasemmap(void *ptr, size_t size, size_t id)
 {
        char address[100];
        char *path;
        int ret;
        GDKmmapfile(address, sizeof(address), id);
        if (GDKmunmap(ptr, size) != GDK_SUCCEED) {
-               interprocess_create_error("Failure in GDKmunmap: %s", 
strerror(errno));
                return GDK_FAIL;
        }
        path = GDKfilepath(0, BATDIR, address, "tmp");
        if (path == NULL) {
-               interprocess_create_error("Failure in GDKfilepath: %s", 
strerror(errno));
                return GDK_FAIL;
        }
        ret = remove(path);
+       if (ret < 0)
+               GDKsyserror("cannot remove '%s'", path);
        GDKfree(path);
-       if (ret < 0) {
-               interprocess_create_error("Failure in GDKfree: %s", 
strerror(errno));
-               return GDK_FAIL;
-       }
-       return GDK_SUCCEED;
+       return ret < 0 ? GDK_FAIL : GDK_SUCCEED;
 }
 
 //! snprintf the file name of a memory mapped file (as created by GDKinitmmap)
@@ -164,17 +138,14 @@ GDKmmapfile(str buffer, size_t max, size
        return GDK_SUCCEED;
 }
 
-gdk_return
-interprocess_init_semaphore(int id, int count, int flags, int *semid, str *msg)
+static gdk_return
+interprocess_init_semaphore(int id, int count, int flags, int *semid)
 {
        key_t key;
-       if (ftok_enhanced(id, &key) != GDK_SUCCEED) {
-               interprocess_create_error("Failure in ftok_enhanced: %s", 
strerror(errno));
-               return GDK_FAIL;
-       }
+       ftok_enhanced(id, &key);
        *semid = semget(key, count, flags | 0666);
        if (*semid < 0) {
-               interprocess_create_error("Failure in semget: %s", 
strerror(errno));
+               GDKsyserror("semget failed");
                return GDK_FAIL;
        }
        return GDK_SUCCEED;
@@ -184,38 +155,35 @@ interprocess_init_semaphore(int id, int 
 /* id: identifier (obtain from GDKuniqueid)
  * count: amount of semaphores
  * semid: identifier of the created semaphore (only set if function returns 
GDK_SUCCEED)
- * msg: Error message (only set if function returns GDK_FAIL)
  */
 gdk_return
-GDKcreatesem(int id, int count, int *semid, str *msg)
+GDKcreatesem(int id, int count, int *semid)
 {
-       return interprocess_init_semaphore(id, count, IPC_CREAT, semid, msg);
+       return interprocess_init_semaphore(id, count, IPC_CREAT, semid);
 }
 
 //! Get an interprocess semaphore that was already created using GDKcreatesem
 /* id: identifier (obtain from GDKuniqueid)
  * count: amount of semaphores
  * semid: identifier of the semaphore (only set if function returns 
GDK_SUCCEED)
- * msg: Error message (only set if function returns GDK_FAIL)
  */
 gdk_return
-GDKgetsem(int id, int count, int *semid, str *msg)
+GDKgetsem(int id, int count, int *semid)
 {
-       return interprocess_init_semaphore(id, count, 0, semid, msg);
+       return interprocess_init_semaphore(id, count, 0, semid);
 }
 
 //! Gets the value of an interprocess semaphore
 /* sem_id: semaphore identifier (obtained from GDKcreatesem or GDKgetsem)
  * number: the semaphore number (must be less than 'count' given when creating 
the semaphore)
  * semval: the value of the semaphore (only set if function returns 
GDK_SUCCEED)
- * msg: Error message (only set if function returns GDK_FAIL)
  */
 gdk_return
-GDKgetsemval(int sem_id, int number, int *semval, str *msg)
+GDKgetsemval(int sem_id, int number, int *semval)
 {
        *semval = semctl(sem_id, number, GETVAL, 0);
        if (*semval < 0) {
-               interprocess_create_error("Failure in semctl: %s", 
strerror(errno));
+               GDKsyserror("semctl failed");
                return GDK_FAIL;
        }
        return GDK_SUCCEED;
@@ -225,10 +193,9 @@ GDKgetsemval(int sem_id, int number, int
 /* sem_id: semaphore identifier (obtained from GDKcreatesem or GDKgetsem)
  * number: the semaphore number (must be less than 'count' given when creating 
the semaphore)
  * change: The change to apply to the semaphore value
- * msg: Error message (only set if function returns GDK_FAIL)
  */
 gdk_return
-GDKchangesemval(int sem_id, int number, int change, str *msg)
+GDKchangesemval(int sem_id, int number, int change)
 {
        struct sembuf buffer;
        buffer.sem_num = number;
@@ -236,7 +203,7 @@ GDKchangesemval(int sem_id, int number, 
        buffer.sem_flg = 0;
 
        if (semop(sem_id, &buffer, 1) < 0) {
-               interprocess_create_error("Failure in semop: %s", 
strerror(errno));
+               GDKsyserror("semop failed");
                return GDK_FAIL;
        }
        return GDK_SUCCEED;
@@ -248,10 +215,9 @@ GDKchangesemval(int sem_id, int number, 
  * change: The change to apply to the semaphore value
  * timeout_mseconds: The timeout in milliseconds
  * succeed: Set to true if the value was successfully changed, or false if the 
timeout was reached
- * msg: Error message (only set if function returns GDK_FAIL)
  */
 gdk_return
-GDKchangesemval_timeout(int sem_id, int number, int change, int 
timeout_mseconds, bool *succeed, str *msg)
+GDKchangesemval_timeout(int sem_id, int number, int change, int 
timeout_mseconds, bool *succeed)
 {
 #ifdef HAVE_SEMTIMEDOP
        // Some linux installations don't have semtimedop
@@ -274,7 +240,7 @@ GDKchangesemval_timeout(int sem_id, int 
                        errno = 0;
                        return GDK_SUCCEED;
                } else {
-                       interprocess_create_error("Failure in semtimedop: %s", 
strerror(errno));
+                       GDKsyserror("semtimedop failed");
                        return GDK_FAIL;
                }
        }
@@ -283,20 +249,19 @@ GDKchangesemval_timeout(int sem_id, int 
 #else
        (void) timeout_mseconds;
        *succeed = true;
-       return GDKchangesemval(sem_id, number, change, msg);
+       return GDKchangesemval(sem_id, number, change);
 #endif
 }
 
 //! Destroy an interprocess semaphore
 /* sem_id: semaphore identifier (obtained from GDKcreatesem or GDKgetsem)
- * msg: Error message (only set if function returns GDK_FAIL)
  */
 gdk_return
-GDKreleasesem(int sem_id, str *msg)
+GDKreleasesem(int sem_id)
 {
        if (semctl(sem_id, 0, IPC_RMID) < 0) {
-               interprocess_create_error("Failure in semctl: %s", 
strerror(errno))
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to