Module: xenomai-3
Branch: wip/fix-obstack
Commit: 9f657b34cee57f8820e28ce66f59c3d33e72374e
URL:    
http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=9f657b34cee57f8820e28ce66f59c3d33e72374e

Author: Philippe Gerum <r...@xenomai.org>
Date:   Fri Apr 14 18:28:36 2017 +0200

boilerplate: provide for conditional obstack support

If the underlying *libc does not support obstacks, build a private
implementation.

This fixes a long-standing detection issue of the native obstack
support, which ended up breaking builds over uClibc 1.21 and beyond.
See https://patchwork.ozlabs.org/patch/745792/.

---

 configure.ac                  |    4 ++
 include/boilerplate/obstack.h |    6 +++
 lib/boilerplate/Makefile.am   |    5 +-
 lib/boilerplate/obstack.c     |  111 +++++++----------------------------------
 4 files changed, 31 insertions(+), 95 deletions(-)

diff --git a/configure.ac b/configure.ac
index 8222e1d..fbfb60f 100644
--- a/configure.ac
+++ b/configure.ac
@@ -495,6 +495,10 @@ fi
 
 test x$CONFIG_XENO_VALGRIND_API = xy && 
AC_DEFINE(CONFIG_XENO_VALGRIND_API,1,[config])
 
+dnl Check for obstack support in *libc
+AC_CHECK_HEADERS(obstack.h,libc_has_obstack=y)
+AM_CONDITIONAL(XENO_PRIVATE_OBSTACK,[test x$libc_has_obstack = x])
+
 dnl Check for presence of some headers
 AC_CHECK_HEADERS(mqueue.h)
 
diff --git a/include/boilerplate/obstack.h b/include/boilerplate/obstack.h
index 206fe55..7543a0c 100644
--- a/include/boilerplate/obstack.h
+++ b/include/boilerplate/obstack.h
@@ -106,6 +106,10 @@ Summary:
 #ifndef _OBSTACK_H
 #define _OBSTACK_H 1
 
+#ifdef HAVE_OBSTACK_H
+#include_next <obstack.h>
+#else
+
 #ifdef __cplusplus
 extern "C" {
 #endif
@@ -506,4 +510,6 @@ __extension__                                               
                \
 }      /* C++ */
 #endif
 
+#endif /* !HAVE_OBSTACK_H */
+
 #endif /* obstack.h */
diff --git a/lib/boilerplate/Makefile.am b/lib/boilerplate/Makefile.am
index 9b8612d..d7e6324 100644
--- a/lib/boilerplate/Makefile.am
+++ b/lib/boilerplate/Makefile.am
@@ -6,10 +6,13 @@ libboilerplate_la_LIBADD = libversion.la libiniparser.la
 libboilerplate_la_SOURCES =    \
        ancillaries.c           \
        hash.c                  \
-       obstack.c               \
        setup.c                 \
        time.c
 
+if XENO_PRIVATE_OBSTACK
+libboilerplate_la_SOURCES += obstack.c
+endif
+
 if XENO_DEBUG
 libboilerplate_la_SOURCES += debug.c
 endif
diff --git a/lib/boilerplate/obstack.c b/lib/boilerplate/obstack.c
index 4c645b2..fab62ce 100644
--- a/lib/boilerplate/obstack.c
+++ b/lib/boilerplate/obstack.c
@@ -22,39 +22,11 @@
 #include <xeno_config.h>
 #include <boilerplate/obstack.h>
 
-/* NOTE BEFORE MODIFYING THIS FILE: This version number must be
-   incremented whenever callers compiled using an old obstack.h can no
-   longer properly call the functions in this obstack.c.  */
-#define OBSTACK_INTERFACE_VERSION 1
-
-/* Comment out all this code if we are using the GNU C Library, and are not
-   actually compiling the library itself, and the installed library
-   supports the same library interface we do.  This code is part of the GNU
-   C Library, but also included in many other GNU distributions.  Compiling
-   and linking in this code is a waste when using the GNU C library
-   (especially if it is a shared library).  Rather than having every GNU
-   program understand `configure --with-gnu-libc' and omit the object
-   files, it is simpler to just do this in the source for each such file.  */
-
-#include <stdio.h>             /* Random thing to get __GNU_LIBRARY__.  */
-#if !defined _LIBC && defined __GNU_LIBRARY__ && __GNU_LIBRARY__ > 1
-# include <gnu-versions.h>
-# if _GNU_OBSTACK_INTERFACE_VERSION == OBSTACK_INTERFACE_VERSION
-#  define ELIDE_CODE
-# endif
-#endif
+/* Use this obstack implementation unconditionally.  */
 
+#include <stdio.h>
 #include <stddef.h>
-
-#ifndef ELIDE_CODE
-
-
-# if HAVE_INTTYPES_H
-#  include <inttypes.h>
-# endif
-# if HAVE_STDINT_H || defined _LIBC
-#  include <stdint.h>
-# endif
+#include <stdint.h>
 
 /* Determine default alignment.  */
 union fooround
@@ -97,22 +69,7 @@ void (*obstack_alloc_failed_handler) (void) = 
print_and_abort;
 
 /* Exit value used when `print_and_abort' is used.  */
 # include <stdlib.h>
-# ifdef _LIBC
 int obstack_exit_failure = EXIT_FAILURE;
-# else
-#  include "exitfail.h"
-#  define obstack_exit_failure exit_failure
-# endif
-
-# ifdef _LIBC
-#  if SHLIB_COMPAT (libc, GLIBC_2_0, GLIBC_2_3_4)
-/* A looong time ago (before 1994, anyway; we're not sure) this global variable
-   was used by non-GNU-C macros to avoid multiple evaluation.  The GNU C
-   library still exports it because somebody might use it.  */
-struct obstack *_obstack_compat;
-compat_symbol (libc, _obstack_compat, _obstack, GLIBC_2_0);
-#  endif
-# endif
 
 /* Define a macro that either calls functions with the traditional malloc/free
    calling interface, or calls functions with the mmalloc/mfree interface
@@ -148,7 +105,7 @@ _obstack_begin (struct obstack *h,
                void *(*chunkfun) (long),
                void (*freefun) (void *))
 {
-  register struct _obstack_chunk *chunk; /* points to new chunk */
+  struct _obstack_chunk *chunk; /* points to new chunk */
 
   if (alignment == 0)
     alignment = DEFAULT_ALIGNMENT;
@@ -195,7 +152,7 @@ _obstack_begin_1 (struct obstack *h, int size, int 
alignment,
                  void (*freefun) (void *, void *),
                  void *arg)
 {
-  register struct _obstack_chunk *chunk; /* points to new chunk */
+  struct _obstack_chunk *chunk; /* points to new chunk */
 
   if (alignment == 0)
     alignment = DEFAULT_ALIGNMENT;
@@ -246,11 +203,11 @@ _obstack_begin_1 (struct obstack *h, int size, int 
alignment,
 void
 _obstack_newchunk (struct obstack *h, int length)
 {
-  register struct _obstack_chunk *old_chunk = h->chunk;
-  register struct _obstack_chunk *new_chunk;
-  register long        new_size;
-  register long obj_size = h->next_free - h->object_base;
-  register long i;
+  struct _obstack_chunk *old_chunk = h->chunk;
+  struct _obstack_chunk *new_chunk;
+  long new_size;
+  long obj_size = h->next_free - h->object_base;
+  long i;
   long already;
   char *object_base;
 
@@ -308,9 +265,6 @@ _obstack_newchunk (struct obstack *h, int length)
   /* The new chunk certainly contains no empty object yet.  */
   h->maybe_empty_object = 0;
 }
-# ifdef _LIBC
-libc_hidden_def (_obstack_newchunk)
-# endif
 
 /* Return nonzero if object OBJ has been allocated from obstack H.
    This is here for debugging.
@@ -323,8 +277,8 @@ int _obstack_allocated_p (struct obstack *h, void *obj);
 int
 _obstack_allocated_p (struct obstack *h, void *obj)
 {
-  register struct _obstack_chunk *lp;  /* below addr of any objects in this 
chunk */
-  register struct _obstack_chunk *plp; /* point to previous chunk if any */
+  struct _obstack_chunk *lp;   /* below addr of any objects in this chunk */
+  struct _obstack_chunk *plp;  /* point to previous chunk if any */
 
   lp = (h)->chunk;
   /* We use >= rather than > since the object cannot be exactly at
@@ -346,8 +300,8 @@ _obstack_allocated_p (struct obstack *h, void *obj)
 void
 obstack_free (struct obstack *h, void *obj)
 {
-  register struct _obstack_chunk *lp;  /* below addr of any objects in this 
chunk */
-  register struct _obstack_chunk *plp; /* point to previous chunk if any */
+  struct _obstack_chunk *lp;   /* below addr of any objects in this chunk */
+  struct _obstack_chunk *plp;  /* point to previous chunk if any */
 
   lp = h->chunk;
   /* We use >= because there cannot be an object at the beginning of a chunk.
@@ -373,17 +327,12 @@ obstack_free (struct obstack *h, void *obj)
     abort ();
 }
 
-# ifdef _LIBC
-/* Older versions of libc used a function _obstack_free intended to be
-   called by non-GCC compilers.  */
-strong_alias (obstack_free, _obstack_free)
-# endif
 
 int
 _obstack_memory_used (struct obstack *h)
 {
-  register struct _obstack_chunk* lp;
-  register int nbytes = 0;
+  struct _obstack_chunk* lp;
+  int nbytes = 0;
 
   for (lp = h->chunk; lp != 0; lp = lp->prev)
     {
@@ -393,26 +342,6 @@ _obstack_memory_used (struct obstack *h)
 }
 
 /* Define the error handler.  */
-# ifdef _LIBC
-#  include <libintl.h>
-# else
-#  include "gettext.h"
-# endif
-# ifndef _
-#  define _(msgid) gettext (msgid)
-# endif
-
-# ifdef _LIBC
-#  include <libio/iolibio.h>
-# endif
-
-# ifndef __attribute__
-/* This feature is available in gcc versions 2.5 and later.  */
-#  if __GNUC__ < 2 || (__GNUC__ == 2 && __GNUC_MINOR__ < 5)
-#   define __attribute__(Spec) /* empty */
-#  endif
-# endif
-
 static void
 __attribute__ ((noreturn))
 print_and_abort (void)
@@ -422,12 +351,6 @@ print_and_abort (void)
      happen because the "memory exhausted" message appears in other places
      like this and the translation should be reused instead of creating
      a very similar string which requires a separate translation.  */
-# ifdef _LIBC
-  (void) __fxprintf (NULL, "%s\n", _("memory exhausted"));
-# else
-  fprintf (stderr, "%s\n", _("memory exhausted"));
-# endif
+  fprintf (stderr, "memory exhausted\n");
   exit (obstack_exit_failure);
 }
-
-#endif /* !ELIDE_CODE */


_______________________________________________
Xenomai-git mailing list
Xenomai-git@xenomai.org
https://xenomai.org/mailman/listinfo/xenomai-git

Reply via email to