On Mon, Oct 20, 2008 at 11:47:10AM +0100, Mel Gorman wrote:
> On (17/10/08 17:14), Andy Whitcroft didst pronounce:
> > 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]>
> > ---
> >  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
> 
> Ok, so distribution SPEC files and the like will need to be aware there
> is another library being installed. This is not a problem as such, but
> it's worth noting.

Yes, that is a concern.  It is only used actually for the tests, and I
don't know if we package those or not.  For the utilities we deliberatly
link against the libhugetlbfs_privutils.a to ensure we have no
dependancies for those utilities.

> >  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
> 
> Ok, this is clear as well as we now have two lds files and we need to
> distinguish between them.
> 
> >  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) $@ $^
> > +
> 
> What's this comment stuff in the Makefile about?
> 
> (suspect it's an oversight that it still exists)

Its something I would generally deliberatly do.  It records how one
would make the dynamic version of the library though we never need it so
currently it is not built.

> > +$(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 {
> 
> As far as I can see, this makes no change to libhugetlbfs itself and
> applications continue to use it as normal. This is good and baring the
> strange commented out stuff in the Makefile
> 
> Acked-by: Mel Gorman <[EMAIL PROTECTED]>

-apw

-------------------------------------------------------------------------
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