Changeset: fee07304d5b2 for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=fee07304d5b2
Modified Files:
        clients/Tests/exports.stable.out
        gdk/gdk.h
        gdk/gdk_bat.c
        gdk/gdk_batop.c
        gdk/gdk_private.h
        gdk/gdk_search.h
        gdk/gdk_utils.c
        gdk/gdk_utils.h
        monetdb5/extras/jaql/json_jaql.c
        monetdb5/modules/atoms/str.c
Branch: default
Log Message:

Make sure GDKexit and GDKfatal never return, and tell compiler about it.


diffs (258 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
@@ -252,9 +252,9 @@ int GDKatomcnt;
 int GDKcreatedir(const char *nme);
 int GDKdebug;
 int GDKerror(_In_z_ _Printf_format_string_ const char *format, ...) 
__attribute__((__format__(__printf__, 1, 2)));
-void GDKexit(int status);
+void GDKexit(int status) __attribute__((__noreturn__));
 int GDKexiting(void);
-int GDKfatal(_In_z_ _Printf_format_string_ const char *format, ...) 
__attribute__((__format__(__printf__, 1, 2)));
+void GDKfatal(_In_z_ _Printf_format_string_ const char *format, ...) 
__attribute__((__format__(__printf__, 1, 2))) __attribute__((__noreturn__));
 void GDKfilepath(str path, const char *nme, const char *mode, const char *ext);
 void GDKfree(void *blk);
 char *GDKgetenv(const char *name);
diff --git a/gdk/gdk.h b/gdk/gdk.h
--- a/gdk/gdk.h
+++ b/gdk/gdk.h
@@ -2548,8 +2548,9 @@ gdk_export int GDKerror(_In_z_ _Printf_f
        __attribute__((__format__(__printf__, 1, 2)));
 gdk_export int GDKsyserror(_In_z_ _Printf_format_string_ const char *format, 
...)
        __attribute__((__format__(__printf__, 1, 2)));
-gdk_export int GDKfatal(_In_z_ _Printf_format_string_ const char *format, ...)
-       __attribute__((__format__(__printf__, 1, 2)));
+gdk_export void GDKfatal(_In_z_ _Printf_format_string_ const char *format, ...)
+       __attribute__((__format__(__printf__, 1, 2)))
+       __attribute__((__noreturn__));
 
 /*
  * @
diff --git a/gdk/gdk_bat.c b/gdk/gdk_bat.c
--- a/gdk/gdk_bat.c
+++ b/gdk/gdk_bat.c
@@ -1735,6 +1735,20 @@ void_replace_bat(BAT *b, BAT *u, bit for
  * known and a hash index is available, one should use the inline
  * functions to speed-up processing.
  */
+static BUN
+slowfnd(BAT *b, const void *v)
+{
+       BATiter bi = bat_iterator(b);
+       BUN p, q;
+       int (*cmp)(const void *, const void *) = BATatoms[b->htype].atomCmp;
+
+       BATloop(b, p, q) {
+               if ((*cmp)(v, BUNhead(bi, p)) == 0)
+                       return p;
+       }
+       return BUN_NONE;
+}
+
 BUN
 BUNfnd(BAT *b, const void *v)
 {
@@ -1774,6 +1788,9 @@ BUNfnd(BAT *b, const void *v)
                HASHfnd(r, bi, v);
        }
        return r;
+  hashfnd_failed:
+       /* can't build hash table, search the slow way */
+       return slowfnd(b, v);
 }
 
 #define usemirror()                                            \
diff --git a/gdk/gdk_batop.c b/gdk/gdk_batop.c
--- a/gdk/gdk_batop.c
+++ b/gdk/gdk_batop.c
@@ -1686,7 +1686,8 @@ BATmark_grp(BAT *b, BAT *g, oid *s)
        if (gc)
                BBPreclaim(gc);
        return bn;
-      bunins_failed:
+  bunins_failed:
+  hashfnd_failed:
        if (gc)
                BBPreclaim(gc);
        if (bn)
diff --git a/gdk/gdk_private.h b/gdk/gdk_private.h
--- a/gdk/gdk_private.h
+++ b/gdk/gdk_private.h
@@ -94,8 +94,6 @@ int HEAPsave(Heap *h, const char *nme, c
 int HEAPshrink(Heap *h, size_t size);
 int HEAPwarm(Heap *h);
 oid MAXoid(BAT *i);
-void MT_global_exit(int status)
-       __attribute__((__noreturn__));
 void MT_init_posix(void);
 void *MT_mremap(const char *path, int mode, void *old_address, size_t 
old_size, size_t *new_size);
 int MT_msync(void *p, size_t len, int mode);
diff --git a/gdk/gdk_search.h b/gdk/gdk_search.h
--- a/gdk/gdk_search.h
+++ b/gdk/gdk_search.h
@@ -207,49 +207,49 @@ gdk_export BUN HASHlist(Hash *h, BUN i);
        do {                                                            \
                BUN _i;                                                 \
                (x) = BUN_NONE;                                         \
-               if ((y).b->H->hash || BAThash((y).b, 0) ||              \
-                   GDKfatal("HASHfnd_str: hash build failed on %s.\n", \
-                            BATgetId((y).b)))                          \
+               if ((y).b->H->hash || BAThash((y).b, 0)) {              \
                        HASHloop_str((y), (y).b->H->hash, _i, (z)) {    \
                                (x) = _i;                               \
                                break;                                  \
                        }                                               \
+               } else                                                  \
+                       goto hashfnd_failed;                            \
        } while (0)
 #define HASHfnd_str_hv(x,y,z)                                          \
        do {                                                            \
                BUN _i;                                                 \
                (x) = BUN_NONE;                                         \
-               if ((y).b->H->hash || BAThash((y).b, 0) ||              \
-                   GDKfatal("HASHfnd_str_hv: hash build failed on %s.\n", \
-                            BATgetId((y).b)))                          \
+               if ((y).b->H->hash || BAThash((y).b, 0)) {              \
                        HASHloop_str_hv((y), (y).b->H->hash, _i, (z)) { \
                                (x) = _i;                               \
                                break;                                  \
                        }                                               \
+               } else                                                  \
+                       goto hashfnd_failed;                            \
        } while (0)
 #define HASHfnd(x,y,z)                                                 \
        do {                                                            \
                BUN _i;                                                 \
-               (x) = BUN_NONE;                                 \
-               if ((y).b->H->hash || BAThash((y).b, 0) ||              \
-                   GDKfatal("HASHfnd: hash build failed on %s.\n",     \
-                            BATgetId((y).b)))                          \
+               (x) = BUN_NONE;                                         \
+               if ((y).b->H->hash || BAThash((y).b, 0)) {              \
                        HASHloop((y), (y).b->H->hash, _i, (z)) {        \
                                (x) = _i;                               \
                                break;                                  \
                        }                                               \
+               } else                                                  \
+                       goto hashfnd_failed;                            \
        } while (0)
 #define HASHfnd_TYPE(x,y,z,TYPE)                                       \
        do {                                                            \
                BUN _i;                                                 \
-               (x) = BUN_NONE;                                 \
-               if ((y).b->H->hash || BAThash((y).b, 0) ||              \
-                   GDKfatal("HASHfnd_" #TYPE ": hash build failed on %s.\n", \
-                            BATgetId((y).b)))                          \
+               (x) = BUN_NONE;                                         \
+               if ((y).b->H->hash || BAThash((y).b, 0)) {              \
                        HASHloop_##TYPE((y), (y).b->H->hash, _i, (z)) { \
                                (x) = _i;                               \
                                break;                                  \
                        }                                               \
+               } else                                                  \
+                       goto hashfnd_failed;                            \
        } while (0)
 #define HASHfnd_bte(x,y,z)     HASHfnd_TYPE(x,y,z,bte)
 #define HASHfnd_sht(x,y,z)     HASHfnd_TYPE(x,y,z,sht)
diff --git a/gdk/gdk_utils.c b/gdk/gdk_utils.c
--- a/gdk/gdk_utils.c
+++ b/gdk/gdk_utils.c
@@ -1185,6 +1185,7 @@ GDKexit(int status)
 #endif
                MT_global_exit(status);
        }
+       MT_exit_thread(-1);
 }
 
 /*
@@ -1518,7 +1519,7 @@ GDKclrerr(void)
 }
 
 /* coverity[+kill] */
-int
+void
 GDKfatal(const char *format, ...)
 {
        char message[GDKERRLEN];
@@ -1558,7 +1559,6 @@ GDKfatal(const char *format, ...)
                GDKexit(1);
 #endif
        }
-       return -1;
 }
 
 
diff --git a/gdk/gdk_utils.h b/gdk/gdk_utils.h
--- a/gdk/gdk_utils.h
+++ b/gdk/gdk_utils.h
@@ -97,7 +97,8 @@ gdk_export int GDKinit(opt *set, int set
  */
 gdk_export int GDKnr_threads;
 
-gdk_export void GDKexit(int status);
+gdk_export void GDKexit(int status)
+       __attribute__((__noreturn__));
 gdk_export int GDKexiting(void);
 
 gdk_export const char *GDKversion(void);
diff --git a/monetdb5/extras/jaql/json_jaql.c b/monetdb5/extras/jaql/json_jaql.c
--- a/monetdb5/extras/jaql/json_jaql.c
+++ b/monetdb5/extras/jaql/json_jaql.c
@@ -685,6 +685,8 @@ strlen_json_value(jsonbat *jb, oid id)
        }
 
        return ret;
+  hashfnd_failed:
+       GDKfatal("HASHfnd: hash build failed on %s.\n", BATgetId(bi.b));
 }
 
 static void
@@ -795,6 +797,9 @@ print_json_value(jsonbat *jb, stream *s,
                        break;
                }
        }
+       return;
+  hashfnd_failed:
+       GDKfatal("HASHfnd: hash build failed on %s.\n", BATgetId(bi.b));
 }
 
 str
@@ -869,6 +874,8 @@ JSONprint(int *ret, stream **s, int *kin
 
        *ret = 0;
        return MAL_SUCCEED;
+  hashfnd_failed:
+       GDKfatal("HASHfnd: hash build failed on %s.\n", BATgetId(bi.b));
 }
 
 str
@@ -1167,6 +1174,8 @@ json_copy_entry(BATiter bik, BATiter bis
        }
 
        return w;
+  hashfnd_failed:
+       GDKfatal("HASHfnd: hash build failed.\n");
 }
 
 str
@@ -1612,6 +1621,8 @@ JSONunwrap(Client cntxt, MalBlkPtr mb, M
        }
 
        return MAL_SUCCEED;
+  hashfnd_failed:
+       GDKfatal("HASHfnd: hash build failed.\n");
 }
 
 str
diff --git a/monetdb5/modules/atoms/str.c b/monetdb5/modules/atoms/str.c
--- a/monetdb5/modules/atoms/str.c
+++ b/monetdb5/modules/atoms/str.c
@@ -1576,6 +1576,8 @@ convertCase(BAT *from, BAT *to, str *res
        }
        *dst = 0;
        return GDK_SUCCEED;
+  hashfnd_failed:
+       GDKfatal("HASHfnd: hash build failed on %s.\n", BATgetId(fromi.b));
 }
 
 int
_______________________________________________
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to