On Fri, 2008-10-17 at 17:14 +0100, Andy Whitcroft wrote:
> Add a new private utilities library consisting of various useful helpers
> normally hidden within libhugetlbfs.  Extend the library local marker idiom
> to include a private utilities marker __pu_.  When we build libhugetlbfs
> these are forced local when building libhugetlbfs_privutils these are the
> only routines exported.  This makes it very hard for the two libraries to
> interfere with each other when both are linked to the same binary, which is
> particularly important when testing the library; we must test the real one.
> 
> Signed-off-by: Andy Whitcroft <[EMAIL PROTECTED]>
Acked-by: Adam Litke <[EMAIL PROTECTED]>

> ---
>  Makefile                 |   31 ++++++++++++++++++++++++++-----
>  init_privutils.c         |   25 +++++++++++++++++++++++++
>  libhugetlbfs_internal.h  |    7 ++++++-
>  libhugetlbfs_privutils.h |   22 ++++++++++++++++++++++
>  privutils.lds            |    6 ++++++
>  tests/Makefile           |    2 +-
>  tests/counters.c         |    1 +
>  tests/hugetests.h        |    3 +++
>  tests/libtestutils.c     |    1 +
>  version.lds              |    1 +
>  10 files changed, 92 insertions(+), 7 deletions(-)
>  create mode 100644 init_privutils.c
>  create mode 100644 libhugetlbfs_privutils.h
>  create mode 100644 privutils.lds
> 
> diff --git a/Makefile b/Makefile
> index 2d5a120..1bb4589 100644
> --- a/Makefile
> +++ b/Makefile
> @@ -2,7 +2,8 @@ PREFIX = /usr/local
>  EXEDIR = /bin
> 
>  LIBOBJS = hugeutils.o version.o init.o morecore.o debug.o alloc.o shm.o 
> kernel-features.o
> -INSTALL_OBJ_LIBS = libhugetlbfs.so libhugetlbfs.a
> +LIBPUOBJS = init_privutils.o debug.o
> +INSTALL_OBJ_LIBS = libhugetlbfs.so libhugetlbfs.a libhugetlbfs_privutils.so
>  BIN_OBJ_DIR=obj
>  INSTALL_BIN = hugectl hugeedit hugeadm pagesize
>  INSTALL_HEADERS = hugetlbfs.h
> @@ -20,7 +21,7 @@ NODEPTARGETS=<version.h> <clean>
> 
>  INSTALL = install
> 
> -LDFLAGS += --no-undefined-version -Wl,--version-script=version.lds -ldl
> +LDFLAGS += --no-undefined-version -ldl
>  CFLAGS ?= -O2 -g
>  CFLAGS += -Wall -fPIC
>  CPPFLAGS += -D__LIBHUGETLBFS__
> @@ -154,7 +155,7 @@ all:      libs tests tools
> 
>  .PHONY:      tests libs
> 
> -libs:        $(foreach file,$(INSTALL_OBJ_LIBS),$(OBJDIRS:%=%/$(file)))
> +libs:        $(foreach file,$(INSTALL_OBJ_LIBS),$(OBJDIRS:%=%/$(file))) 
> $(BIN_OBJ_DIR)/libhugetlbfs_privutils.a
> 
>  tests:       libs # Force make to build the library first
>  tests:       tests/all
> @@ -227,11 +228,31 @@ obj64/libhugetlbfs.a: $(LIBOBJS64)
> 
>  obj32/libhugetlbfs.so: $(LIBOBJS32)
>       @$(VECHO) LD32 "(shared)" $@
> -     $(CC32) $(LDFLAGS) -Wl,-soname,$(notdir $@) -shared -o $@ $^ $(LDLIBS)
> +     $(CC32) $(LDFLAGS) -Wl,--version-script=version.lds 
> -Wl,-soname,$(notdir $@) -shared -o $@ $^ $(LDLIBS)
> 
>  obj64/libhugetlbfs.so: $(LIBOBJS64)
>       @$(VECHO) LD64 "(shared)" $@
> -     $(CC64) $(LDFLAGS) -Wl,-soname,$(notdir $@) -shared -o $@ $^ $(LDLIBS)
> +     $(CC64) $(LDFLAGS) -Wl,--version-script=version.lds 
> -Wl,-soname,$(notdir $@) -shared -o $@ $^ $(LDLIBS)
> +
> +#obj32/libhugetlbfs_privutils.a: $(LIBPUOBJS:%=obj32/%)
> +#    @$(VECHO) AR32 $@
> +#    $(AR) $(ARFLAGS) $@ $^
> +#
> +#obj64/libhugetlbfs_privutils.a: $(LIBPUOBJS:%=obj64/%)
> +#    @$(VECHO) AR64 $@
> +#    $(AR) $(ARFLAGS) $@ $^
> +
> +$(BIN_OBJ_DIR)/libhugetlbfs_privutils.a: $(LIBPUOBJS:%=$(BIN_OBJ_DIR)/%)
> +     @$(VECHO) ARHOST $@
> +     $(AR) $(ARFLAGS) $@ $^
> +
> +obj32/libhugetlbfs_privutils.so: $(LIBPUOBJS:%=obj32/%)
> +     @$(VECHO) LD32 "(shared)" $@
> +     $(CC32) $(LDFLAGS) -Wl,--version-script=privutils.lds 
> -Wl,-soname,$(notdir $@) -shared -o $@ $^ $(LDLIBS)
> +
> +obj64/libhugetlbfs_privutils.so: $(LIBPUOBJS:%=obj64/%)
> +     @$(VECHO) LD64 "(shared)" $@
> +     $(CC64) $(LDFLAGS) -Wl,--version-script=privutils.lds 
> -Wl,-soname,$(notdir $@) -shared -o $@ $^ $(LDLIBS)
> 
>  obj32/%.i:   %.c
>       @$(VECHO) CPP $@
> diff --git a/init_privutils.c b/init_privutils.c
> new file mode 100644
> index 0000000..6c9243d
> --- /dev/null
> +++ b/init_privutils.c
> @@ -0,0 +1,25 @@
> +/*
> + * libhugetlbfs - Easy use of Linux hugepages
> + * Copyright (C) 2008 Nishanth Aravamudan, IBM Corporation
> + *
> + * This library is free software; you can redistribute it and/or
> + * modify it under the terms of the GNU Lesser General Public License
> + * as published by the Free Software Foundation; either version 2.1 of
> + * the License, or (at your option) any later version.
> + *
> + * This library is distributed in the hope that it will be useful, but
> + * WITHOUT ANY WARRANTY; without even the implied warranty of
> + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
> + * Lesser General Public License for more details.
> + *
> + * You should have received a copy of the GNU Lesser General Public
> + * License along with this library; if not, write to the Free Software
> + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
> + */
> +
> +#include "libhugetlbfs_internal.h"
> +
> +static void __attribute__ ((constructor)) setup_libhugetlbfs(void)
> +{
> +     hugetlbfs_setup_debug();
> +}
> diff --git a/libhugetlbfs_internal.h b/libhugetlbfs_internal.h
> index 4d7add7..4e20885 100644
> --- a/libhugetlbfs_internal.h
> +++ b/libhugetlbfs_internal.h
> @@ -27,6 +27,8 @@
>  #error This header should not be included by library users.
>  #endif /* __LIBHUGETLBFS__ */
> 
> +#include "libhugetlbfs_privutils.h"
> +
>  #define stringify_1(x)       #x
>  #define stringify(x) stringify_1(x)
> 
> @@ -45,7 +47,10 @@
>   * When adding a library local variable externalise the symbol as
>   * normal, plus add a #define of the form below.  This define effectively
>   * renames the routine into the local namespace __lh_* which is forced
> - * local in the linker script version.lds.
> + * local in the linker script version.lds.  Some routines may need to be
> + * exported in the utilities library these are marked __pu_* which marks
> + * them for export in libhugetlbfs_privutils; their definitions should
> + * appear in libhugetlbfs_privutils.h rather than here.
>   */
>  extern int __hugetlbfs_verbose;
>  extern int __hugetlbfs_debug;
> diff --git a/libhugetlbfs_privutils.h b/libhugetlbfs_privutils.h
> new file mode 100644
> index 0000000..1a45ed0
> --- /dev/null
> +++ b/libhugetlbfs_privutils.h
> @@ -0,0 +1,22 @@
> +/*
> + * libhugetlbfs - Easy use of Linux hugepages
> + * Copyright (C) 2005-2006 David Gibson & Adam Litke, IBM Corporation.
> + *
> + * This library is free software; you can redistribute it and/or
> + * modify it under the terms of the GNU Lesser General Public License
> + * as published by the Free Software Foundation; either version 2.1 of
> + * the License, or (at your option) any later version.
> + *
> + * This library is distributed in the hope that it will be useful, but
> + * WITHOUT ANY WARRANTY; without even the implied warranty of
> + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
> + * Lesser General Public License for more details.
> + *
> + * You should have received a copy of the GNU Lesser General Public
> + * License along with this library; if not, write to the Free Software
> + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
> + */
> +#ifndef _LIBHUGETLBFS_PRIVUTILS_H
> +#define _LIBHUGETLBFS_PRIVUTILS_H
> +
> +#endif /* _LIBHUGETLBFS_PRIVUTILS_H */
> diff --git a/privutils.lds b/privutils.lds
> new file mode 100644
> index 0000000..5d481e2
> --- /dev/null
> +++ b/privutils.lds
> @@ -0,0 +1,6 @@
> +VERS_1.0 {
> +     global:
> +             __pu_*;
> +     local:
> +             *;
> +};
> diff --git a/tests/Makefile b/tests/Makefile
> index e4e1ce2..f03ec68 100644
> --- a/tests/Makefile
> +++ b/tests/Makefile
> @@ -22,7 +22,7 @@ BADTOOLCHAIN = bad-toolchain.sh
> 
>  CFLAGS = -O2 -Wall -g
>  CPPFLAGS = -I..
> -LDLIBS = -ldl -lpthread
> +LDLIBS = -ldl -lpthread -lhugetlbfs_privutils
>  LDFLAGS32 = -L../obj32
>  LDFLAGS64 = -L../obj64
>  INSTALL = install
> diff --git a/tests/counters.c b/tests/counters.c
> index 522a00d..0284809 100644
> --- a/tests/counters.c
> +++ b/tests/counters.c
> @@ -181,6 +181,7 @@ void _set_nr_hugepages(unsigned long count, int line)
>  out:
>       verify_counters(line, et, ef, er, es);
>  }
> +#undef set_nr_hugepages
>  #define set_nr_hugepages(c) _set_nr_hugepages(c, __LINE__)
> 
>  void _map(int s, int hpages, int flags, int line)
> diff --git a/tests/hugetests.h b/tests/hugetests.h
> index bb1146e..270923b 100644
> --- a/tests/hugetests.h
> +++ b/tests/hugetests.h
> @@ -22,6 +22,9 @@
> 
>  #include <errno.h>
>  #include <string.h>
> +
> +#include "libhugetlbfs_privutils.h"
> +
>  #define DEBUG
> 
>  /* Test return codes */
> diff --git a/tests/libtestutils.c b/tests/libtestutils.c
> index 93388a9..4eeb880 100644
> --- a/tests/libtestutils.c
> +++ b/tests/libtestutils.c
> @@ -37,6 +37,7 @@
>  #include <fcntl.h>
> 
>  #include "hugetlbfs.h"
> +#include "libhugetlbfs_privutils.h"
>  #include "hugetests.h"
> 
>  void check_free_huge_pages(int nr_pages_needed)
> diff --git a/version.lds b/version.lds
> index f5c480a..ba06c82 100644
> --- a/version.lds
> +++ b/version.lds
> @@ -6,6 +6,7 @@ VERS_1.0 {
>               hugetlbfs_unlinked_fd;
>       local:
>               __lh_*;
> +             __pu_*;
>  };
> 
>  HTLBFS_2.0 {
-- 
Adam Litke - (agl at us.ibm.com)
IBM Linux Technology Center


-------------------------------------------------------------------------
This SF.Net email is sponsored by the Moblin Your Move Developer's challenge
Build the coolest Linux based applications with Moblin SDK & win great prizes
Grand prize is a trip for two to an Open Source event anywhere in the world
http://moblin-contest.org/redirect.php?banner_id=100&url=/
_______________________________________________
Libhugetlbfs-devel mailing list
Libhugetlbfs-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/libhugetlbfs-devel

Reply via email to