diff --git a/Makefile.am b/Makefile.am index d1ef6e38..26b18aa7 100644 --- a/Makefile.am +++ b/Makefile.am @@ -1,4 +1,6 @@ +SUBDIRS = plpa-1.1 + bin_PROGRAMS = htop dist_man_MANS = htop.1 EXTRA_DIST = $(dist_man_MANS) htop.desktop htop.png scripts/MakeHeader.py \ @@ -8,7 +10,7 @@ applications_DATA = htop.desktop pixmapdir = $(datadir)/pixmaps pixmap_DATA = htop.png -AM_CFLAGS = -pedantic -Wall -std=c99 +htop_CFLAGS = -pedantic -Wall -std=c99 AM_CPPFLAGS = -DSYSCONFDIR=\"$(sysconfdir)\" myhtopsources = AvailableMetersPanel.c CategoriesPanel.c CheckItem.c \ @@ -32,6 +34,7 @@ SUFFIXES = .h BUILT_SOURCES = $(myhtopheaders) htop_SOURCES = $(myhtopheaders) $(myhtopsources) config.h debug.h +htop_LDADD = $(top_builddir)/plpa-1.1/src/libplpa_included.la profile: $(MAKE) all CFLAGS="-pg -O2" diff --git a/Process.c b/Process.c index ef97451a..8721b73d 100644 --- a/Process.c +++ b/Process.c @@ -27,6 +27,8 @@ in the source distribution for its full text. #include #include +#include + // This works only with glibc 2.1+. On earlier versions // the behavior is similar to have a hardcoded page size. #ifndef PAGE_SIZE @@ -198,12 +200,12 @@ bool Process_setPriority(Process* this, int priority) { unsigned long Process_getAffinity(Process* this) { unsigned long mask = 0; - sched_getaffinity(this->pid, sizeof(unsigned long), (cpu_set_t*) &mask); + plpa_sched_getaffinity(this->pid, sizeof(unsigned long), (plpa_cpu_set_t*) &mask); return mask; } bool Process_setAffinity(Process* this, unsigned long mask) { - return (sched_setaffinity(this->pid, sizeof(unsigned long), (cpu_set_t*) &mask) == 0); + return (plpa_sched_setaffinity(this->pid, sizeof(unsigned long), (plpa_cpu_set_t*) &mask) == 0); } void Process_sendSignal(Process* this, int signal) { diff --git a/Process.h b/Process.h index a1783305..ac1c1af7 100644 --- a/Process.h +++ b/Process.h @@ -30,6 +30,8 @@ in the source distribution for its full text. #include #include +#include + // This works only with glibc 2.1+. On earlier versions // the behavior is similar to have a hardcoded page size. #ifndef PAGE_SIZE diff --git a/configure.ac b/configure.ac index 2e3a581c..f54310fc 100644 --- a/configure.ac +++ b/configure.ac @@ -9,6 +9,11 @@ AC_CONFIG_HEADER([config.h]) # Checks for programs. AC_PROG_CC +AM_PROG_CC_C_O + +AM_DISABLE_SHARED +AM_ENABLE_STATIC +AC_PROG_LIBTOOL # Checks for libraries. AC_CHECK_LIB([ncurses], [refresh], [], [missing_libraries="$missing_libraries libncurses"]) @@ -43,11 +48,13 @@ AC_TYPE_SIGNAL AC_FUNC_STAT AC_CHECK_FUNCS([memmove strncasecmp strstr strdup]) +save_cflags="${CFLAGS}" CFLAGS="${CFLAGS} -std=c99" AC_MSG_CHECKING([whether gcc -std=c99 option works]) AC_TRY_COMPILE(AC_INCLUDES_DEFAULT, [char *a; a = strdup("foo"); int i = 0; i++; // C99], AC_MSG_RESULT([yes]), AC_MSG_ERROR([htop is written in C99. A newer version of gcc is required.])) +CFLAGS="$save_cflags" PROCDIR=/proc AC_ARG_WITH(proc, [ --with-proc=DIR Location of a Linux-compatible proc filesystem (default=/proc).], @@ -66,5 +73,11 @@ fi AC_CHECK_FILE($PROCDIR/stat,,AC_MSG_ERROR(Cannot find /proc/stat. Make sure you have a Linux-compatible /proc filesystem mounted. See the file README for help.)) AC_CHECK_FILE($PROCDIR/meminfo,,AC_MSG_ERROR(Cannot find /proc/meminfo. Make sure you have a Linux-compatible /proc filesystem mounted. See the file README for help.)) +PLPA_INCLUDED(plpa-1.1) +PLPA_INIT(plpa_happy=yes, plpa_happy=no) +if test "x$plpa_happy" = xno; then + AC_MSG_ERROR([Failed to initialize PLPA.]) +fi + AC_CONFIG_FILES([Makefile]) AC_OUTPUT diff --git a/plpa-1.1/AUTHORS b/plpa-1.1/AUTHORS new file mode 100644 index 00000000..4be028b6 --- /dev/null +++ b/plpa-1.1/AUTHORS @@ -0,0 +1,13 @@ +PLPA Authors +============ + +The IDs in parenthesis are those used in Subversion commit notices. + +Current Authors +--------------- + +Indiana University: +- Jeff Squyres (jsquyres) + +Lawrence Berkeley National Lab: +- Paul Hargrove (phargrov) diff --git a/plpa-1.1/LICENSE b/plpa-1.1/LICENSE new file mode 100644 index 00000000..9fbff8df --- /dev/null +++ b/plpa-1.1/LICENSE @@ -0,0 +1,57 @@ +Copyright (c) 2004-2006 The Trustees of Indiana University and Indiana + University Research and Technology + Corporation. All rights reserved. +Copyright (c) 2004-2005 The Regents of the University of California. + All rights reserved. +Copyright (c) 2007 Cisco Systems, Inc. All rights reserved. + +Portions copyright: + +Copyright (c) 2004-2005 The University of Tennessee and The University + of Tennessee Research Foundation. All rights + reserved. +Copyright (c) 2004-2005 High Performance Computing Center Stuttgart, + University of Stuttgart. All rights reserved. +Copyright (c) 2006, 2007 Advanced Micro Devices, Inc. + All rights reserved. + +$COPYRIGHT$ + +Additional copyrights may follow + +$HEADER$ + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + +- Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + +- Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer listed + in this license in the documentation and/or other materials + provided with the distribution. + +- Neither the name of the copyright holders nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +The copyright holders provide no reassurances that the source code +provided does not infringe any patent, copyright, or any other +intellectual property rights of third parties. The copyright holders +disclaim any liability to any recipient for claims brought against +recipient by any third party for infringement of that parties +intellectual property rights. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/plpa-1.1/Makefile.am b/plpa-1.1/Makefile.am new file mode 100644 index 00000000..43f69a02 --- /dev/null +++ b/plpa-1.1/Makefile.am @@ -0,0 +1,17 @@ +# +# Copyright (c) 2004-2005 The Trustees of Indiana University and Indiana +# University Research and Technology +# Corporation. All rights reserved. +# Copyright (c) 2004-2005 The Regents of the University of California. +# All rights reserved. +# Copyright (c) 2008 Cisco Systems, Inc. All rights reserved. +# $COPYRIGHT$ +# +# Additional copyrights may follow +# +# $HEADER$ +# + +SUBDIRS = src +DIST_SUBDIRS = $(SUBDIRS) +EXTRA_DIST = README VERSION LICENSE AUTHORS plpa.m4 diff --git a/plpa-1.1/Makefile.in b/plpa-1.1/Makefile.in new file mode 100644 index 00000000..31dae872 --- /dev/null +++ b/plpa-1.1/Makefile.in @@ -0,0 +1,499 @@ +# Makefile.in generated by automake 1.10 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006 Free Software Foundation, Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +# +# Copyright (c) 2004-2005 The Trustees of Indiana University and Indiana +# University Research and Technology +# Corporation. All rights reserved. +# Copyright (c) 2004-2005 The Regents of the University of California. +# All rights reserved. +# Copyright (c) 2008 Cisco Systems, Inc. All rights reserved. +# $COPYRIGHT$ +# +# Additional copyrights may follow +# +# $HEADER$ +# +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +subdir = plpa-1.1 +DIST_COMMON = README $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ + AUTHORS +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/acinclude.m4 \ + $(top_srcdir)/plpa-1.1/plpa.m4 $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h \ + $(top_builddir)/plpa-1.1/src/plpa_config.h \ + $(top_builddir)/plpa-1.1/src/plpa.h +CONFIG_CLEAN_FILES = +SOURCES = +DIST_SOURCES = +RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \ + html-recursive info-recursive install-data-recursive \ + install-dvi-recursive install-exec-recursive \ + install-html-recursive install-info-recursive \ + install-pdf-recursive install-ps-recursive install-recursive \ + installcheck-recursive installdirs-recursive pdf-recursive \ + ps-recursive uninstall-recursive +RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ + distclean-recursive maintainer-clean-recursive +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +AMTAR = @AMTAR@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +ECHO = @ECHO@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +F77 = @F77@ +FFLAGS = @FFLAGS@ +GREP = @GREP@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +LDFLAGS = @LDFLAGS@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ +MAKEINFO = @MAKEINFO@ +MKDIR_P = @MKDIR_P@ +OBJEXT = @OBJEXT@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +RANLIB = @RANLIB@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +STRIP = @STRIP@ +VERSION = @VERSION@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_F77 = @ac_ct_F77@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +SUBDIRS = src +DIST_SUBDIRS = $(SUBDIRS) +EXTRA_DIST = README VERSION LICENSE AUTHORS plpa.m4 +all: all-recursive + +.SUFFIXES: +$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ + && exit 0; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu plpa-1.1/Makefile'; \ + cd $(top_srcdir) && \ + $(AUTOMAKE) --gnu plpa-1.1/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +# This directory's subdirectories are mostly independent; you can cd +# into them and run `make' without going through this Makefile. +# To change the values of `make' variables: instead of editing Makefiles, +# (1) if the variable is set in `config.status', edit `config.status' +# (which will cause the Makefiles to be regenerated when you run `make'); +# (2) otherwise, pass the desired values on the `make' command line. +$(RECURSIVE_TARGETS): + @failcom='exit 1'; \ + for f in x $$MAKEFLAGS; do \ + case $$f in \ + *=* | --[!k]*);; \ + *k*) failcom='fail=yes';; \ + esac; \ + done; \ + dot_seen=no; \ + target=`echo $@ | sed s/-recursive//`; \ + list='$(SUBDIRS)'; for subdir in $$list; do \ + echo "Making $$target in $$subdir"; \ + if test "$$subdir" = "."; then \ + dot_seen=yes; \ + local_target="$$target-am"; \ + else \ + local_target="$$target"; \ + fi; \ + (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ + || eval $$failcom; \ + done; \ + if test "$$dot_seen" = "no"; then \ + $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ + fi; test -z "$$fail" + +$(RECURSIVE_CLEAN_TARGETS): + @failcom='exit 1'; \ + for f in x $$MAKEFLAGS; do \ + case $$f in \ + *=* | --[!k]*);; \ + *k*) failcom='fail=yes';; \ + esac; \ + done; \ + dot_seen=no; \ + case "$@" in \ + distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ + *) list='$(SUBDIRS)' ;; \ + esac; \ + rev=''; for subdir in $$list; do \ + if test "$$subdir" = "."; then :; else \ + rev="$$subdir $$rev"; \ + fi; \ + done; \ + rev="$$rev ."; \ + target=`echo $@ | sed s/-recursive//`; \ + for subdir in $$rev; do \ + echo "Making $$target in $$subdir"; \ + if test "$$subdir" = "."; then \ + local_target="$$target-am"; \ + else \ + local_target="$$target"; \ + fi; \ + (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ + || eval $$failcom; \ + done && test -z "$$fail" +tags-recursive: + list='$(SUBDIRS)'; for subdir in $$list; do \ + test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \ + done +ctags-recursive: + list='$(SUBDIRS)'; for subdir in $$list; do \ + test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \ + done + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + tags=; \ + here=`pwd`; \ + if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ + include_option=--etags-include; \ + empty_fix=.; \ + else \ + include_option=--include; \ + empty_fix=; \ + fi; \ + list='$(SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" = .; then :; else \ + test ! -f $$subdir/TAGS || \ + tags="$$tags $$include_option=$$here/$$subdir/TAGS"; \ + fi; \ + done; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$tags $$unique; \ + fi +ctags: CTAGS +CTAGS: ctags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + tags=; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + test -z "$(CTAGS_ARGS)$$tags$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$tags $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && cd $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) $$here + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ + fi; \ + cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ + else \ + test -f $(distdir)/$$file \ + || cp -p $$d/$$file $(distdir)/$$file \ + || exit 1; \ + fi; \ + done + list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" = .; then :; else \ + test -d "$(distdir)/$$subdir" \ + || $(MKDIR_P) "$(distdir)/$$subdir" \ + || exit 1; \ + distdir=`$(am__cd) $(distdir) && pwd`; \ + top_distdir=`$(am__cd) $(top_distdir) && pwd`; \ + (cd $$subdir && \ + $(MAKE) $(AM_MAKEFLAGS) \ + top_distdir="$$top_distdir" \ + distdir="$$distdir/$$subdir" \ + am__remove_distdir=: \ + am__skip_length_check=: \ + distdir) \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-recursive +all-am: Makefile +installdirs: installdirs-recursive +installdirs-am: +install: install-recursive +install-exec: install-exec-recursive +install-data: install-data-recursive +uninstall: uninstall-recursive + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-recursive +install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-recursive + +clean-am: clean-generic clean-libtool mostlyclean-am + +distclean: distclean-recursive + -rm -f Makefile +distclean-am: clean-am distclean-generic distclean-tags + +dvi: dvi-recursive + +dvi-am: + +html: html-recursive + +info: info-recursive + +info-am: + +install-data-am: + +install-dvi: install-dvi-recursive + +install-exec-am: + +install-html: install-html-recursive + +install-info: install-info-recursive + +install-man: + +install-pdf: install-pdf-recursive + +install-ps: install-ps-recursive + +installcheck-am: + +maintainer-clean: maintainer-clean-recursive + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-recursive + +mostlyclean-am: mostlyclean-generic mostlyclean-libtool + +pdf: pdf-recursive + +pdf-am: + +ps: ps-recursive + +ps-am: + +uninstall-am: + +.MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) install-am \ + install-strip + +.PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \ + all all-am check check-am clean clean-generic clean-libtool \ + ctags ctags-recursive distclean distclean-generic \ + distclean-libtool distclean-tags distdir dvi dvi-am html \ + html-am info info-am install install-am install-data \ + install-data-am install-dvi install-dvi-am install-exec \ + install-exec-am install-html install-html-am install-info \ + install-info-am install-man install-pdf install-pdf-am \ + install-ps install-ps-am install-strip installcheck \ + installcheck-am installdirs installdirs-am maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-generic \ + mostlyclean-libtool pdf pdf-am ps ps-am tags tags-recursive \ + uninstall uninstall-am + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/plpa-1.1/README b/plpa-1.1/README new file mode 100644 index 00000000..4659e248 --- /dev/null +++ b/plpa-1.1/README @@ -0,0 +1,29 @@ +This is a stripped-down version of the PLPA 1.1 package, adapted to +be embedded in the htop code base. For the full PLPA package, go to +http://www.open-mpi.org/projects/plpa/. Copyright notice for PLPA +follows below. + + -- Hisham Muhammad, htop author. March 2008. + +=========================================================================== + +This is the Portable Linux Processor Affinity (PLPA) package +(pronounced "pli-pa"). It is intended for developers who wish to use +Linux processor affinity via the sched_setaffinity() and +sched_getaffinity() library calls, but don't want to wade through the +morass of 3 different APIs that have been offered through the life of +these calls in various Linux distributions and glibc versions. + +Copyright (c) 2004-2006 The Trustees of Indiana University and Indiana + University Research and Technology + Corporation. All rights reserved. +Copyright (c) 2004-2005 The Regents of the University of California. + All rights reserved. +Copyright (c) 2006-2008 Cisco Systems, Inc. All rights reserved. +$COPYRIGHT$ + +See LICENSE file for a rollup of all copyright notices. + +$HEADER$ + +=========================================================================== diff --git a/plpa-1.1/VERSION b/plpa-1.1/VERSION new file mode 100644 index 00000000..4b49c930 --- /dev/null +++ b/plpa-1.1/VERSION @@ -0,0 +1,36 @@ +# This is the VERSION file for PLPA, describing the precise version of +# PLPA in this distribution. The various components of the version +# number below are combined to form a single version number string. + +# major, minor, and release are generally combined in the form +# ... If release is zero, then it is omitted. + +major=1 +minor=1 +release=0 + +# greek is used for alpha or beta release tags. If it is non-empty, +# it will be appended to the version number. It does not have to be +# numeric. Common examples include a1 (alpha release 1), b1 (beta +# release 1), sc2005 (Super Computing 2005 release). The only +# requirement is that it must be entirely printable ASCII characters +# and have no white space. + +greek= + +# If want_svn=1, then the SVN r number will be included in the overall +# PLPA version number in some form. + +want_svn=0 + +# If svn_r=-1, then the SVN r numbere will be obtained dynamically at +# run time, either 1) via the "svnversion" command (if this is a +# Subversion checkout) in the form "r", or b) with the date (if +# this is not a Subversion checkout, and the svnversion command cannot +# be used) in the form of "svn". Alternatively, if svn_r is not +# -1, the value of svn_r will be directly appended to the version +# string. This happens during "make dist", for example: if the +# distribution tarball is being made from an SVN checkout, the value +# of svn_r in this file is replaced with the output of "svnversion". + +svn_r=r147:149 diff --git a/plpa-1.1/plpa.m4 b/plpa-1.1/plpa.m4 new file mode 100644 index 00000000..68e173e8 --- /dev/null +++ b/plpa-1.1/plpa.m4 @@ -0,0 +1,267 @@ +# -*- shell-script -*- +# +# Copyright (c) 2004-2005 The Trustees of Indiana University and Indiana +# University Research and Technology +# Corporation. All rights reserved. +# Copyright (c) 2004-2005 The Regents of the University of California. +# All rights reserved. +# Copyright (c) 2006-2008 Cisco Systems, Inc. All rights reserved. +# $COPYRIGHT$ +# +# Additional copyrights may follow +# +# $HEADER$ +# + +# Main PLPA m4 macro, to be invoked by the user +# +# Expects two paramters: +# 1. What to do upon success +# 2. What to do upon failure +# +AC_DEFUN([PLPA_INIT],[ + AC_REQUIRE([_PLPA_INTERNAL_SETUP]) + AC_REQUIRE([AC_PROG_CC]) + + # Check for syscall() + AC_CHECK_FUNC([syscall], [happy=1], [happy=0]) + + # Look for syscall.h + if test "$happy" = 1; then + AC_CHECK_HEADER([sys/syscall.h], [happy=1], [happy=0]) + fi + + # Look for unistd.h + if test "$happy" = 1; then + AC_CHECK_HEADER([unistd.h], [happy=1], [happy=0]) + fi + + # Check for __NR_sched_setaffinity + if test "$happy" = 1; then + AC_MSG_CHECKING([for __NR_sched_setaffinity]) + if test "$plpa_emulate" = "yes"; then + AC_MSG_RESULT([emulated]) + AC_DEFINE([__NR_sched_setaffinity], [0], [Emulated value]) + else + AC_TRY_COMPILE([#include +#include ], [#ifndef __NR_sched_setaffinity +#error __NR_sched_setaffinity_not found! +#endif +int i = 1;], + [AC_MSG_RESULT([yes]) + happy=1], + [AC_MSG_RESULT([no]) + happy=0]) + fi + fi + + # Check for __NR_sched_getaffinity (probably overkill, but what + # the heck?) + if test "$happy" = 1; then + AC_MSG_CHECKING([for __NR_sched_getaffinity]) + if test "$plpa_emulate" = "yes"; then + AC_MSG_RESULT([emulated]) + AC_DEFINE([__NR_sched_getaffinity], [0], [Emulated value]) + else + AC_TRY_COMPILE([#include +#include ], [#ifndef __NR_sched_getaffinity +#error __NR_sched_getaffinity_not found! +#endif +int i = 1;], + [AC_MSG_RESULT([yes]) + happy=1], + [AC_MSG_RESULT([no]) + happy=0]) + fi + fi + + # If all was good, do the real init + AS_IF([test "$happy" = "1"], + [_PLPA_INIT($1, $2)], + [$2]) + PLPA_DO_AM_CONDITIONALS + + AC_CONFIG_FILES( + plpa_config_prefix[/Makefile] + plpa_config_prefix[/src/Makefile] + ) + + # Cleanup + unset happy +])dnl + +#----------------------------------------------------------------------- + +# Build PLPA as a standalone package +AC_DEFUN([PLPA_STANDALONE],[ + m4_define([plpa_config_prefix],[.]) + AC_REQUIRE([_PLPA_INTERNAL_SETUP]) + plpa_mode=standalone +])dnl + +#----------------------------------------------------------------------- + +# Build PLPA as an included package +AC_DEFUN([PLPA_INCLUDED],[ + m4_define([plpa_config_prefix],[$1]) + AC_REQUIRE([_PLPA_INTERNAL_SETUP]) + plpa_mode=included + PLPA_DISABLE_EXECUTABLES +])dnl + +#----------------------------------------------------------------------- + +dnl JMS: No fortran bindings yet +dnl # Set whether the fortran bindings will be built or not +dnl AC_DEFUN([PLPA_FORTRAN],[ +dnl AC_REQUIRE([_PLPA_INTERNAL_SETUP]) +dnl +dnl # Need [] around entire following line to escape m4 properly +dnl [plpa_tmp=`echo $1 | tr '[:upper:]' '[:lower:]'`] +dnl if test "$1" = "0" -o "$1" = "n"; then +dnl plpa_fortran=no +dnl elif test "$1" = "1" -o "$1" = "y"; then +dnl plpa_fortran=yes +dnl else +dnl AC_MSG_WARN([Did not understand PLPA_FORTRAN argument ($1) -- ignored]) +dnl fi +dnl ])dnl + +#----------------------------------------------------------------------- + +# Disable building the executables +AC_DEFUN([PLPA_DISABLE_EXECUTABLES],[ + AC_REQUIRE([_PLPA_INTERNAL_SETUP]) + plpa_executables=no +])dnl + +#----------------------------------------------------------------------- + +# Specify the symbol prefix +AC_DEFUN([PLPA_SET_SYMBOL_PREFIX],[ + AC_REQUIRE([_PLPA_INTERNAL_SETUP]) + plpa_symbol_prefix_value=$1 +])dnl + +#----------------------------------------------------------------------- + +# Internals +AC_DEFUN([_PLPA_INTERNAL_SETUP],[ + + AC_ARG_ENABLE([emulate], + AC_HELP_STRING([--enable-emulate], + [Emulate __NR_sched_setaffinity and __NR_sched_getaffinity, to allow building on non-Linux systems (for testing)])) + if test "$enable_emulate" = "yes"; then + plpa_emulate=yes + else + plpa_emulate=no + fi + + # Included mode, or standalone? + AC_ARG_ENABLE([included-mode], + AC_HELP_STRING([--enable-included-mode], + [Using --enable-included-mode puts the PLPA into "included" mode. The default is --disable-included-mode, meaning that the PLPA is in "standalone" mode.])) + if test "$enable_included_mode" = "yes"; then + plpa_mode=included + else + plpa_mode=standalone + fi + +dnl JMS: No fortran bindings yet +dnl # Fortran bindings, or no? +dnl AC_ARG_ENABLE([fortran], +dnl AC_HELP_STRING([--disable-fortran], +dnl [Using --disable-fortran disables building the Fortran PLPA API bindings])) +dnl if test "$enable_fortran" = "yes" -o "$enable_fortran" = ""; then +dnl plpa_fortran=yes +dnl else +dnl plpa_fortran=no +dnl fi + + # Build and install the executables or no? + AC_ARG_ENABLE([executables], + AC_HELP_STRING([--disable-executables], + [Using --disable-executables disables building and installing the PLPA executables])) + if test "$enable_executables" = "yes" -o "$enable_executables" = ""; then + plpa_executables=yes + else + plpa_executables=no + fi + + # Change the symbol prefix? + AC_ARG_WITH([plpa-symbol-prefix], + AC_HELP_STRING([--with-plpa-symbol-prefix=STRING], + [STRING can be any valid C symbol name. It will be prefixed to all public PLPA symbols. Default: "plpa_"])) + if test "$with_plpa_symbol_prefix" = ""; then + plpa_symbol_prefix_value=plpa_ + else + plpa_symbol_prefix_value=$with_plpa_symbol_prefix + fi +])dnl + +#----------------------------------------------------------------------- + +# Internals for PLPA_INIT +AC_DEFUN([_PLPA_INIT],[ + AC_REQUIRE([_PLPA_INTERNAL_SETUP]) + + # Are we building as standalone or included? + AC_MSG_CHECKING([for PLPA building mode]) + AC_MSG_RESULT([$plpa_mode]) + + # We need to set a path for header, etc files depending on whether + # we're standalone or included. this is taken care of by PLPA_INCLUDED. + + AC_MSG_CHECKING([for PLPA config prefix]) + AC_MSG_RESULT(plpa_config_prefix) + + # Note that plpa_config.h *MUST* be listed first so that it + # becomes the "main" config header file. Any AM_CONFIG_HEADERs + # after that (plpa.h) will only have selective #defines replaced, + # not the entire file. + AM_CONFIG_HEADER(plpa_config_prefix[/src/plpa_config.h]) + AM_CONFIG_HEADER(plpa_config_prefix[/src/plpa.h]) + + # What prefix are we using? + AC_MSG_CHECKING([for PLPA symbol prefix]) + AC_DEFINE_UNQUOTED(PLPA_SYM_PREFIX, [$plpa_symbol_prefix_value], + [The PLPA symbol prefix]) + # Ensure to [] escape the whole next line so that we can get the + # proper tr tokens + [plpa_symbol_prefix_value_caps="`echo $plpa_symbol_prefix_value | tr '[:lower:]' '[:upper:]'`"] + AC_DEFINE_UNQUOTED(PLPA_SYM_PREFIX_CAPS, [$plpa_symbol_prefix_value_caps], + [The PLPA symbol prefix in all caps]) + AC_MSG_RESULT([$plpa_symbol_prefix_value]) + +dnl JMS: No fortran bindings yet +dnl # Check for fortran +dnl AC_MSG_CHECKING([whether to build PLPA Fortran API]) +dnl AC_MSG_RESULT([$plpa_fortran]) + + # Check whether to build the exectuables or not + AC_MSG_CHECKING([whether to build PLPA executables]) + AC_MSG_RESULT([$plpa_executables]) + + # If we're building executables, we need some things for plpa-taskset + if test "$plpa_executables" = "yes"; then + AC_C_INLINE + fi + + # Success + $1 +])dnl + + +#----------------------------------------------------------------------- + +# This must be a standalone routine so that it can be called both by +# PLPA_INIT and an external caller (if PLPA_INIT is not invoked). +AC_DEFUN([PLPA_DO_AM_CONDITIONALS],[ + if test "$plpa_did_am_conditionals" != "yes"; then + AM_CONDITIONAL([PLPA_BUILD_STANDALONE], [test "$plpa_mode" = "standalone"]) +dnl JMS: No fortran bindings yet +dnl AM_CONDITIONAL(PLPA_BUILD_FORTRAN, [test "$plpa_fortran" = "yes"]) + AM_CONDITIONAL(PLPA_BUILD_EXECUTABLES, [test "$plpa_executables" = "yes"]) + fi + plpa_did_am_conditionals=yes +])dnl diff --git a/plpa-1.1/src/Makefile.am b/plpa-1.1/src/Makefile.am new file mode 100644 index 00000000..8819d880 --- /dev/null +++ b/plpa-1.1/src/Makefile.am @@ -0,0 +1,49 @@ +# +# Copyright (c) 2004-2005 The Trustees of Indiana University and Indiana +# University Research and Technology +# Corporation. All rights reserved. +# Copyright (c) 2004-2005 The University of Tennessee and The University +# of Tennessee Research Foundation. All rights +# reserved. +# Copyright (c) 2004-2005 High Performance Computing Center Stuttgart, +# University of Stuttgart. All rights reserved. +# Copyright (c) 2004-2005 The Regents of the University of California. +# All rights reserved. +# Copyright (c) 2006-2007 Cisco Systems, Inc. All rights reserved. +# $COPYRIGHT$ +# +# Additional copyrights may follow +# +# $HEADER$ +# + +# Defaults +lib_LTLIBRARIES = +noinst_LTLIBRARIES = +nodist_include_HEADERS = +nodist_noinst_HEADERS = + +# Note that this file is generated by configure, so we don't want to +# ship it in the tarball. Hence the "nodist_" prefixes to the HEADERS +# macros, below. +public_headers = plpa.h + +# See which mode we're building in +if PLPA_BUILD_STANDALONE +lib_LTLIBRARIES += libplpa.la +nodist_include_HEADERS += $(public_headers) +else +noinst_LTLIBRARIES += libplpa_included.la +nodist_noinst_HEADERS += $(public_headers) +endif + +# The sources +plpa_sources = \ + plpa_internal.h \ + plpa_api_probe.c \ + plpa_dispatch.c \ + plpa_runtime.c \ + plpa_map.c + +libplpa_la_SOURCES = $(plpa_sources) +libplpa_included_la_SOURCES = $(plpa_sources) diff --git a/plpa-1.1/src/Makefile.in b/plpa-1.1/src/Makefile.in new file mode 100644 index 00000000..8d420b0a --- /dev/null +++ b/plpa-1.1/src/Makefile.in @@ -0,0 +1,579 @@ +# Makefile.in generated by automake 1.10 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006 Free Software Foundation, Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +# +# Copyright (c) 2004-2005 The Trustees of Indiana University and Indiana +# University Research and Technology +# Corporation. All rights reserved. +# Copyright (c) 2004-2005 The University of Tennessee and The University +# of Tennessee Research Foundation. All rights +# reserved. +# Copyright (c) 2004-2005 High Performance Computing Center Stuttgart, +# University of Stuttgart. All rights reserved. +# Copyright (c) 2004-2005 The Regents of the University of California. +# All rights reserved. +# Copyright (c) 2006-2007 Cisco Systems, Inc. All rights reserved. +# $COPYRIGHT$ +# +# Additional copyrights may follow +# +# $HEADER$ +# + + +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ + +# See which mode we're building in +@PLPA_BUILD_STANDALONE_TRUE@am__append_1 = libplpa.la +@PLPA_BUILD_STANDALONE_TRUE@am__append_2 = $(public_headers) +@PLPA_BUILD_STANDALONE_FALSE@am__append_3 = libplpa_included.la +@PLPA_BUILD_STANDALONE_FALSE@am__append_4 = $(public_headers) +subdir = plpa-1.1/src +DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ + $(srcdir)/plpa.h.in $(srcdir)/plpa_config.h.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/acinclude.m4 \ + $(top_srcdir)/plpa-1.1/plpa.m4 $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h plpa_config.h plpa.h +CONFIG_CLEAN_FILES = +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; +am__strip_dir = `echo $$p | sed -e 's|^.*/||'`; +am__installdirs = "$(DESTDIR)$(libdir)" "$(DESTDIR)$(includedir)" +libLTLIBRARIES_INSTALL = $(INSTALL) +LTLIBRARIES = $(lib_LTLIBRARIES) $(noinst_LTLIBRARIES) +libplpa_la_LIBADD = +am__objects_1 = plpa_api_probe.lo plpa_dispatch.lo plpa_runtime.lo \ + plpa_map.lo +am_libplpa_la_OBJECTS = $(am__objects_1) +libplpa_la_OBJECTS = $(am_libplpa_la_OBJECTS) +@PLPA_BUILD_STANDALONE_TRUE@am_libplpa_la_rpath = -rpath $(libdir) +libplpa_included_la_LIBADD = +am_libplpa_included_la_OBJECTS = $(am__objects_1) +libplpa_included_la_OBJECTS = $(am_libplpa_included_la_OBJECTS) +@PLPA_BUILD_STANDALONE_FALSE@am_libplpa_included_la_rpath = +DEFAULT_INCLUDES = -I. -I$(top_builddir)@am__isrc@ +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +CCLD = $(CC) +LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ + $(LDFLAGS) -o $@ +SOURCES = $(libplpa_la_SOURCES) $(libplpa_included_la_SOURCES) +DIST_SOURCES = $(libplpa_la_SOURCES) $(libplpa_included_la_SOURCES) +nodist_includeHEADERS_INSTALL = $(INSTALL_HEADER) +HEADERS = $(nodist_include_HEADERS) $(nodist_noinst_HEADERS) +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +AMTAR = @AMTAR@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +ECHO = @ECHO@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +F77 = @F77@ +FFLAGS = @FFLAGS@ +GREP = @GREP@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +LDFLAGS = @LDFLAGS@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ +MAKEINFO = @MAKEINFO@ +MKDIR_P = @MKDIR_P@ +OBJEXT = @OBJEXT@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +RANLIB = @RANLIB@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +STRIP = @STRIP@ +VERSION = @VERSION@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_F77 = @ac_ct_F77@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ + +# Defaults +lib_LTLIBRARIES = $(am__append_1) +noinst_LTLIBRARIES = $(am__append_3) +nodist_include_HEADERS = $(am__append_2) +nodist_noinst_HEADERS = $(am__append_4) + +# Note that this file is generated by configure, so we don't want to +# ship it in the tarball. Hence the "nodist_" prefixes to the HEADERS +# macros, below. +public_headers = plpa.h + +# The sources +plpa_sources = \ + plpa_internal.h \ + plpa_api_probe.c \ + plpa_dispatch.c \ + plpa_runtime.c \ + plpa_map.c + +libplpa_la_SOURCES = $(plpa_sources) +libplpa_included_la_SOURCES = $(plpa_sources) +all: plpa_config.h plpa.h + $(MAKE) $(AM_MAKEFLAGS) all-am + +.SUFFIXES: +.SUFFIXES: .c .lo .o .obj +$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ + && exit 0; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu plpa-1.1/src/Makefile'; \ + cd $(top_srcdir) && \ + $(AUTOMAKE) --gnu plpa-1.1/src/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +plpa_config.h: stamp-h2 + @if test ! -f $@; then \ + rm -f stamp-h2; \ + $(MAKE) $(AM_MAKEFLAGS) stamp-h2; \ + else :; fi + +stamp-h2: $(srcdir)/plpa_config.h.in $(top_builddir)/config.status + @rm -f stamp-h2 + cd $(top_builddir) && $(SHELL) ./config.status plpa-1.1/src/plpa_config.h +$(srcdir)/plpa_config.h.in: $(am__configure_deps) + cd $(top_srcdir) && $(AUTOHEADER) + rm -f stamp-h2 + touch $@ + +plpa.h: stamp-h3 + @if test ! -f $@; then \ + rm -f stamp-h3; \ + $(MAKE) $(AM_MAKEFLAGS) stamp-h3; \ + else :; fi + +stamp-h3: $(srcdir)/plpa.h.in $(top_builddir)/config.status + @rm -f stamp-h3 + cd $(top_builddir) && $(SHELL) ./config.status plpa-1.1/src/plpa.h + +distclean-hdr: + -rm -f plpa_config.h stamp-h2 plpa.h stamp-h3 +install-libLTLIBRARIES: $(lib_LTLIBRARIES) + @$(NORMAL_INSTALL) + test -z "$(libdir)" || $(MKDIR_P) "$(DESTDIR)$(libdir)" + @list='$(lib_LTLIBRARIES)'; for p in $$list; do \ + if test -f $$p; then \ + f=$(am__strip_dir) \ + echo " $(LIBTOOL) --mode=install $(libLTLIBRARIES_INSTALL) $(INSTALL_STRIP_FLAG) '$$p' '$(DESTDIR)$(libdir)/$$f'"; \ + $(LIBTOOL) --mode=install $(libLTLIBRARIES_INSTALL) $(INSTALL_STRIP_FLAG) "$$p" "$(DESTDIR)$(libdir)/$$f"; \ + else :; fi; \ + done + +uninstall-libLTLIBRARIES: + @$(NORMAL_UNINSTALL) + @list='$(lib_LTLIBRARIES)'; for p in $$list; do \ + p=$(am__strip_dir) \ + echo " $(LIBTOOL) --mode=uninstall rm -f '$(DESTDIR)$(libdir)/$$p'"; \ + $(LIBTOOL) --mode=uninstall rm -f "$(DESTDIR)$(libdir)/$$p"; \ + done + +clean-libLTLIBRARIES: + -test -z "$(lib_LTLIBRARIES)" || rm -f $(lib_LTLIBRARIES) + @list='$(lib_LTLIBRARIES)'; for p in $$list; do \ + dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ + test "$$dir" != "$$p" || dir=.; \ + echo "rm -f \"$${dir}/so_locations\""; \ + rm -f "$${dir}/so_locations"; \ + done + +clean-noinstLTLIBRARIES: + -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) + @list='$(noinst_LTLIBRARIES)'; for p in $$list; do \ + dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ + test "$$dir" != "$$p" || dir=.; \ + echo "rm -f \"$${dir}/so_locations\""; \ + rm -f "$${dir}/so_locations"; \ + done +libplpa.la: $(libplpa_la_OBJECTS) $(libplpa_la_DEPENDENCIES) + $(LINK) $(am_libplpa_la_rpath) $(libplpa_la_OBJECTS) $(libplpa_la_LIBADD) $(LIBS) +libplpa_included.la: $(libplpa_included_la_OBJECTS) $(libplpa_included_la_DEPENDENCIES) + $(LINK) $(am_libplpa_included_la_rpath) $(libplpa_included_la_OBJECTS) $(libplpa_included_la_LIBADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/plpa_api_probe.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/plpa_dispatch.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/plpa_map.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/plpa_runtime.Plo@am__quote@ + +.c.o: +@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(COMPILE) -c $< + +.c.obj: +@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCC_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` + +.c.lo: +@am__fastdepCC_TRUE@ $(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $< + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs +install-nodist_includeHEADERS: $(nodist_include_HEADERS) + @$(NORMAL_INSTALL) + test -z "$(includedir)" || $(MKDIR_P) "$(DESTDIR)$(includedir)" + @list='$(nodist_include_HEADERS)'; for p in $$list; do \ + if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ + f=$(am__strip_dir) \ + echo " $(nodist_includeHEADERS_INSTALL) '$$d$$p' '$(DESTDIR)$(includedir)/$$f'"; \ + $(nodist_includeHEADERS_INSTALL) "$$d$$p" "$(DESTDIR)$(includedir)/$$f"; \ + done + +uninstall-nodist_includeHEADERS: + @$(NORMAL_UNINSTALL) + @list='$(nodist_include_HEADERS)'; for p in $$list; do \ + f=$(am__strip_dir) \ + echo " rm -f '$(DESTDIR)$(includedir)/$$f'"; \ + rm -f "$(DESTDIR)$(includedir)/$$f"; \ + done + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) plpa_config.h.in plpa.h.in $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + tags=; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) plpa_config.h.in plpa.h.in $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$tags $$unique; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) plpa_config.h.in plpa.h.in $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + tags=; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) plpa_config.h.in plpa.h.in $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + test -z "$(CTAGS_ARGS)$$tags$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$tags $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && cd $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) $$here + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ + fi; \ + cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ + else \ + test -f $(distdir)/$$file \ + || cp -p $$d/$$file $(distdir)/$$file \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(LTLIBRARIES) $(HEADERS) plpa_config.h plpa.h +installdirs: + for dir in "$(DESTDIR)$(libdir)" "$(DESTDIR)$(includedir)"; do \ + test -z "$$dir" || $(MKDIR_P) "$$dir"; \ + done +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libLTLIBRARIES clean-libtool \ + clean-noinstLTLIBRARIES mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-hdr distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +info: info-am + +info-am: + +install-data-am: install-nodist_includeHEADERS + +install-dvi: install-dvi-am + +install-exec-am: install-libLTLIBRARIES + +install-html: install-html-am + +install-info: install-info-am + +install-man: + +install-pdf: install-pdf-am + +install-ps: install-ps-am + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: uninstall-libLTLIBRARIES uninstall-nodist_includeHEADERS + +.MAKE: install-am install-strip + +.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ + clean-libLTLIBRARIES clean-libtool clean-noinstLTLIBRARIES \ + ctags distclean distclean-compile distclean-generic \ + distclean-hdr distclean-libtool distclean-tags distdir dvi \ + dvi-am html html-am info info-am install install-am \ + install-data install-data-am install-dvi install-dvi-am \ + install-exec install-exec-am install-html install-html-am \ + install-info install-info-am install-libLTLIBRARIES \ + install-man install-nodist_includeHEADERS install-pdf \ + install-pdf-am install-ps install-ps-am install-strip \ + installcheck installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-compile \ + mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ + tags uninstall uninstall-am uninstall-libLTLIBRARIES \ + uninstall-nodist_includeHEADERS + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/plpa-1.1/src/plpa.h.in b/plpa-1.1/src/plpa.h.in new file mode 100644 index 00000000..c69e4ed7 --- /dev/null +++ b/plpa-1.1/src/plpa.h.in @@ -0,0 +1,214 @@ +/* -*- c -*- + * + * Copyright (c) 2004-2005 The Trustees of Indiana University. + * All rights reserved. + * Copyright (c) 2004-2005 The Regents of the University of California. + * All rights reserved. + * Copyright (c) 2006-2008 Cisco, Inc. All rights reserved. + * $COPYRIGHT$ + * + * Additional copyrights may follow + * + * $HEADER$ + */ + +/* + * Some notes about the declarations and definitions in this file: + * + * This file is a mix of internal and public declarations. + * Applications are warned against using the internal types; they are + * subject to change with no warning. + * + * The PLPA_NAME() and PLPA_NAME_CAPS() macros are used for prefixing + * the PLPA type names, enum names, and symbol names when embedding + * PLPA. When not embedding, the default prefix is "plpa_" (or + * "PLPA_" when using PLPA_NAME_CAPS()). Hence, if you see a + * declaration like this: + * + * int PLPA_NAME(foo)(void); + * + * It's a function named plpa_foo() that returns an int and takes no + * arguments when building PLPA as a standalone library. It's a + * function with a different prefix than "plpa_" when the + * --enable-included-mode and --with-plpa-symbol-prefix options are + * supplied to PLPA's configure script. + */ + +#ifndef PLPA_H +#define PLPA_H + +/* Absolutely must not include here or it will generate + conflicts. */ + +/* For memset() */ +#include +/* For pid_t and size_t */ +#include + +/*************************************************************************** + * Internal types + ***************************************************************************/ + +/* If we're building PLPA itself, will have already + been included. But is a private header file; it is + not installed into $includedir. Hence, applications including + will not have included (this is by + design). So include just enough information here to allow us to + continue. */ +#ifndef PLPA_CONFIG_H +/* The PLPA symbol prefix */ +#define PLPA_SYM_PREFIX plpa_ + +/* The PLPA symbol prefix in all caps */ +#define PLPA_SYM_PREFIX_CAPS PLPA_ +#endif + +/* Preprocessors are fun -- the double inderection is unfortunately + necessary. */ +#define PLPA_MUNGE_NAME(a, b) PLPA_MUNGE_NAME2(a, b) +#define PLPA_MUNGE_NAME2(a, b) a ## b +#define PLPA_NAME(name) PLPA_MUNGE_NAME(PLPA_SYM_PREFIX, name) +#define PLPA_NAME_CAPS(name) PLPA_MUNGE_NAME(PLPA_SYM_PREFIX_CAPS, name) + +/*************************************************************************** + * Public type + ***************************************************************************/ + +/* Values that can be returned from plpa_api_probe() */ +typedef enum { + /* Sentinel value */ + PLPA_NAME_CAPS(PROBE_UNSET), + /* sched_setaffinity syscall available */ + PLPA_NAME_CAPS(PROBE_OK), + /* syscall unavailable/unimplemented */ + PLPA_NAME_CAPS(PROBE_NOT_SUPPORTED), + /* we experienced some strange failure that the user should report */ + PLPA_NAME_CAPS(PROBE_UNKNOWN) +} PLPA_NAME(api_type_t); + +/*************************************************************************** + * Internal types + ***************************************************************************/ + +/* Internal PLPA bitmask type. This type should not be used by + external applications! */ +typedef unsigned long int PLPA_NAME(bitmask_t); +#define PLPA_BITMASK_T_NUM_BITS (sizeof(PLPA_NAME(bitmask_t)) * 8) +#define PLPA_BITMASK_CPU_MAX 1024 +#define PLPA_BITMASK_NUM_ELEMENTS (PLPA_BITMASK_CPU_MAX / PLPA_BITMASK_T_NUM_BITS) + +/*************************************************************************** + * Public type + ***************************************************************************/ + +/* Public type for the PLPA cpu set. */ +typedef struct { PLPA_NAME(bitmask_t) bitmask[PLPA_BITMASK_NUM_ELEMENTS]; } PLPA_NAME(cpu_set_t); + +/*************************************************************************** + * Internal macros + ***************************************************************************/ + +/* Internal macro for identifying the byte in a bitmask array. This + macro should not be used by external applications! */ +#define PLPA_CPU_BYTE(num) ((num) / PLPA_BITMASK_T_NUM_BITS) + +/* Internal macro for identifying the bit in a bitmask array. This + macro should not be used by external applications! */ +#define PLPA_CPU_BIT(num) ((num) % PLPA_BITMASK_T_NUM_BITS) + +/*************************************************************************** + * Public macros + ***************************************************************************/ + +/* Public macro to zero out a PLPA cpu set (analogous to the FD_ZERO() + macro; see select(2)). */ +#define PLPA_CPU_ZERO(cpuset) \ + memset((cpuset), 0, sizeof(PLPA_NAME(cpu_set_t))) + +/* Public macro to set a bit in a PLPA cpu set (analogous to the + FD_SET() macro; see select(2)). */ +#define PLPA_CPU_SET(num, cpuset) \ + (cpuset)->bitmask[PLPA_CPU_BYTE(num)] |= ((PLPA_NAME(bitmask_t))1 << PLPA_CPU_BIT(num)) + +/* Public macro to clear a bit in a PLPA cpu set (analogous to the + FD_CLR() macro; see select(2)). */ +#define PLPA_CPU_CLR(num, cpuset) \ + (cpuset)->bitmask[PLPA_CPU_BYTE(num)] &= ~((PLPA_NAME(bitmask_t))1 << PLPA_CPU_BIT(num)) + +/* Public macro to test if a bit is set in a PLPA cpu set (analogous + to the FD_ISSET() macro; see select(2)). */ +#define PLPA_CPU_ISSET(num, cpuset) \ + (0 != (((cpuset)->bitmask[PLPA_CPU_BYTE(num)]) & ((PLPA_NAME(bitmask_t))1 << PLPA_CPU_BIT(num)))) + +/*************************************************************************** + * Public functions + ***************************************************************************/ + +/* Setup PLPA internals. This function is optional; it will be + automatically invoked by all the other API functions if you do not + invoke it explicitly. Returns 0 upon success. */ +int PLPA_NAME(init)(void); + +/* Check what API is on this machine. If api_type returns + PLPA_PROBE_OK, then PLPA can function properly on this machine. + Returns 0 upon success. */ +int PLPA_NAME(api_probe)(PLPA_NAME(api_type_t) *api_type); + +/* Set processor affinity. Use the PLPA_CPU_* macros to set the + cpuset value. The same rules and restrictions about pid apply as + they do for the sched_setaffinity(2) system call. Returns 0 upon + success. */ +int PLPA_NAME(sched_setaffinity)(pid_t pid, size_t cpusetsize, + const PLPA_NAME(cpu_set_t) *cpuset); + +/* Get processor affinity. Use the PLPA_CPU_* macros to analyze the + returned value of cpuset. The same rules and restrictions about + pid apply as they do for the sched_getaffinity(2) system call. + Returns 0 upon success. */ +int PLPA_NAME(sched_getaffinity)(pid_t pid, size_t cpusetsize, + PLPA_NAME(cpu_set_t) *cpuset); + +/* Return whether topology information is available (i.e., + plpa_map_to_*, plpa_max_*). The topology functions will be + available if supported == 1 and the function returns 0. */ +int PLPA_NAME(have_topology_information)(int *supported); + +/* Map (socket,core) tuple to virtual processor ID. processor_id is + then suitable for use with the PLPA_CPU_* macros, probably leading + to a call to plpa_sched_setaffinity(). Returns 0 upon success. */ +int PLPA_NAME(map_to_processor_id)(int socket, int core, int *processor_id); + +/* Map processor_id to (socket,core) tuple. The processor_id input is + usually obtained from the return from the plpa_sched_getaffinity() + call, using PLPA_CPU_ISSET to find individual bits in the map that + were set/unset. plpa_map_to_socket_core() can map the bit indexes + to a socket/core tuple. Returns 0 upon success. */ +int PLPA_NAME(map_to_socket_core)(int processor_id, int *socket, int *core); + +/* Return the max processor ID. Returns both the number of processors + (cores) in a system and the maximum Linux virtual processor ID + (because it may be higher than the number of processors if there + are "holes" in the available Linux virtual processor IDs). Returns + 0 upon success. */ +int PLPA_NAME(get_processor_info)(int *num_processors, int *max_processor_id); + +/* Returns both the number of sockets in the system and the maximum + socket ID number (in case there are "holes" in the list of available + socket IDs). Returns 0 upon sucess. */ +int PLPA_NAME(get_socket_info)(int *num_sockets, int *max_socket_id); + +/* Return both the number of cores and the max code ID for a given + socket (in case there are "holes" in the list of available core + IDs). Returns 0 upon success. */ +int PLPA_NAME(get_core_info)(int socket, int *num_cores, int *max_core_id); + +/* Shut down PLPA. This function releases resources used by the PLPA. + It should be the last PLPA function invoked, or can be used to + forcibly cause PLPA to dump its topology cache and re-analyze the + underlying system the next time another PLPA function is called. + Specifically: it is safe to call plpa_init() (or any other PLPA + function) again after plpa_finalized(). Returns 0 upon success. */ +int PLPA_NAME(finalize)(void); + +#endif /* PLPA_H */ + diff --git a/plpa-1.1/src/plpa_api_probe.c b/plpa-1.1/src/plpa_api_probe.c new file mode 100644 index 00000000..5dc0c383 --- /dev/null +++ b/plpa-1.1/src/plpa_api_probe.c @@ -0,0 +1,90 @@ +/* -*- c -*- + * + * Copyright (c) 2004-2005 The Trustees of Indiana University. + * All rights reserved. + * Copyright (c) 2004-2005 The Regents of the University of California. + * All rights reserved. + * Copyright (c) 2007-2008 Cisco, Inc. All rights reserved. + * $COPYRIGHT$ + * + * Additional copyrights may follow + * + * $HEADER$ + */ + +#include "plpa_config.h" +#include "plpa.h" +#include "plpa_internal.h" + +#include +#include +#include + +/* Cache, just to make things a little more efficient */ +static PLPA_NAME(api_type_t) cache = PLPA_NAME_CAPS(PROBE_UNSET); + +/* The len value we find - not in public header, but used by the lib */ +size_t PLPA_NAME(len) = 0; + +int PLPA_NAME(api_probe_init)(void) +{ + PLPA_NAME(cpu_set_t) mask; + int rc; + size_t len; + + for (len = sizeof(mask); len != 0; len >>= 1) { + rc = syscall(__NR_sched_getaffinity, 0, len, &mask); + if (rc >= 0) { + /* OK, kernel is happy with a get(). Validate w/ a set(). */ + /* Note that kernel may have told us the "proper" size */ + size_t tmp = (0 != rc) ? ((size_t) rc) : len; + /* Pass mask=NULL, expect errno==EFAULT if tmp was OK + as a length */ + rc = syscall(__NR_sched_setaffinity, 0, tmp, NULL); + if ((rc < 0) && (errno == EFAULT)) { + cache = PLPA_NAME_CAPS(PROBE_OK); + PLPA_NAME(len) = tmp; + rc = 0; + break; + } + } + if (errno == ENOSYS) { + break; /* No point in looping */ + } + } + + if (rc >= 0) { + /* OK */ + } else if (errno == ENOSYS) { + /* Kernel returns ENOSYS because there is no support for + processor affinity */ + cache = PLPA_NAME_CAPS(PROBE_NOT_SUPPORTED); + } else { + /* Unknown! */ + cache = PLPA_NAME_CAPS(PROBE_UNKNOWN); + } + + return 0; +} + + +int PLPA_NAME(api_probe)(PLPA_NAME(api_type_t) *api_type) +{ + int ret; + + /* Check to see that we're initialized */ + if (!PLPA_NAME(initialized)) { + if (0 != (ret = PLPA_NAME(init)())) { + return ret; + } + } + + /* Check for bozo arguments */ + if (NULL == api_type) { + return EINVAL; + } + + /* All done */ + *api_type = cache; + return 0; +} diff --git a/plpa-1.1/src/plpa_config.h.in b/plpa-1.1/src/plpa_config.h.in new file mode 100644 index 00000000..5efd5936 --- /dev/null +++ b/plpa-1.1/src/plpa_config.h.in @@ -0,0 +1,112 @@ +/* ./src/libplpa/plpa_config.h.in. Generated from configure.ac by autoheader. */ + +/* -*- c -*- + * + * Copyright (c) 2004-2005 The Trustees of Indiana University. + * All rights reserved. + * Copyright (c) 2004-2005 The Regents of the University of California. + * All rights reserved. + * Copyright (c) 2006-2008 Cisco Systems, Inc. All rights reserved. + * $COPYRIGHT$ + * + * Additional copyrights may follow + * + * $HEADER$ + */ + +#ifndef PLPA_CONFIG_H +#define PLPA_CONFIG_H + + +/* Define to 1 if you have the header file. */ +#undef HAVE_DLFCN_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_INTTYPES_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_MEMORY_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_STDINT_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_STDLIB_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_STRINGS_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_STRING_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_STAT_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_TYPES_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_UNISTD_H + +/* Define to the sub-directory in which libtool stores uninstalled libraries. + */ +#undef LT_OBJDIR + +/* Define to 1 if your C compiler doesn't accept -c and -o together. */ +#undef NO_MINUS_C_MINUS_O + +/* Define to the address where bug reports for this package should be sent. */ +#undef PACKAGE_BUGREPORT + +/* Define to the full name of this package. */ +#undef PACKAGE_NAME + +/* Define to the full name and version of this package. */ +#undef PACKAGE_STRING + +/* Define to the one symbol short name of this package. */ +#undef PACKAGE_TARNAME + +/* Define to the version of this package. */ +#undef PACKAGE_VERSION + +/* Whether we're in debugging mode or not */ +#undef PLPA_DEBUG + +/* Major version of PLPA */ +#undef PLPA_MAJOR_VERSION + +/* Minor version of PLPA */ +#undef PLPA_MINOR_VERSION + +/* Release version of PLPA */ +#undef PLPA_RELEASE_VERSION + +/* The PLPA symbol prefix */ +#undef PLPA_SYM_PREFIX + +/* The PLPA symbol prefix in all caps */ +#undef PLPA_SYM_PREFIX_CAPS + +/* Define to 1 if you have the ANSI C header files. */ +#undef STDC_HEADERS + +/* Define to 1 if `lex' declares `yytext' as a `char *' by default, not a + `char[]'. */ +#undef YYTEXT_POINTER + +/* Emulated value */ +#undef __NR_sched_getaffinity + +/* Emulated value */ +#undef __NR_sched_setaffinity + +/* Define to `__inline__' or `__inline' if that's what the C compiler + calls it, or to nothing if 'inline' is not supported under any name. */ +#ifndef __cplusplus +#undef inline +#endif + + +#endif /* PLPA_CONFIG_H */ + diff --git a/plpa-1.1/src/plpa_dispatch.c b/plpa-1.1/src/plpa_dispatch.c new file mode 100644 index 00000000..45e35add --- /dev/null +++ b/plpa-1.1/src/plpa_dispatch.c @@ -0,0 +1,201 @@ +/* -*- c -*- + * + * Copyright (c) 2004-2006 The Trustees of Indiana University. + * All rights reserved. + * Copyright (c) 2004-2005 The Regents of the University of California. + * All rights reserved. + * Copyright (c) 2007-2008 Cisco Systems, Inc. All rights reserved. + * $COPYRIGHT$ + * + * Additional copyrights may follow + * + * $HEADER$ + */ + +#include "plpa_config.h" +#include "plpa.h" +#include "plpa_internal.h" + +#include +#include +#include + +/** + * Call the kernel's setaffinity, massaging the user's input + * parameters as necessary + */ +int PLPA_NAME(sched_setaffinity)(pid_t pid, size_t cpusetsize, + const PLPA_NAME(cpu_set_t) *cpuset) +{ + int ret; + size_t i; + PLPA_NAME(cpu_set_t) tmp; + PLPA_NAME(api_type_t) api; + + /* Check to see that we're initialized */ + if (!PLPA_NAME(initialized)) { + if (0 != (ret = PLPA_NAME(init)())) { + return ret; + } + } + + /* Check for bozo arguments */ + if (NULL == cpuset) { + return EINVAL; + } + + /* Probe the API type */ + if (0 != (ret = PLPA_NAME(api_probe)(&api))) { + return ret; + } + switch (api) { + case PLPA_NAME_CAPS(PROBE_OK): + /* This shouldn't happen, but check anyway */ + if (cpusetsize > sizeof(*cpuset)) { + return EINVAL; + } + + /* If the user-supplied bitmask is smaller than what the + kernel wants, zero out a temporary buffer of the size that + the kernel wants and copy the user-supplied bitmask to the + lower part of the temporary buffer. This could be done + more efficiently, but we're looking for clarity/simplicity + of code here -- this is not intended to be + performance-critical. */ + if (cpusetsize < PLPA_NAME(len)) { + memset(&tmp, 0, sizeof(tmp)); + for (i = 0; i < cpusetsize * 8; ++i) { + if (PLPA_CPU_ISSET(i, cpuset)) { + PLPA_CPU_SET(i, &tmp); + } + } + } + + /* If the user-supplied bitmask is larger than what the kernel + will accept, scan it and see if there are any set bits in + the part larger than what the kernel will accept. If so, + return EINVAL. Otherwise, copy the part that the kernel + will accept into a temporary and use that. Again, + efficinency is not the issue of this code -- clarity is. */ + else if (cpusetsize > PLPA_NAME(len)) { + for (i = PLPA_NAME(len) * 8; i < cpusetsize * 8; ++i) { + if (PLPA_CPU_ISSET(i, cpuset)) { + return EINVAL; + } + } + /* No upper-level bits are set, so now copy over the bits + that the kernel will look at */ + memset(&tmp, 0, sizeof(tmp)); + for (i = 0; i < PLPA_NAME(len) * 8; ++i) { + if (PLPA_CPU_ISSET(i, cpuset)) { + PLPA_CPU_SET(i, &tmp); + } + } + } + + /* Otherwise, the user supplied a buffer that is exactly the + right size. Just for clarity of code, copy the user's + buffer into the temporary and use that. */ + else { + memcpy(&tmp, cpuset, cpusetsize); + } + + /* Now do the syscall */ + ret = syscall(__NR_sched_setaffinity, pid, PLPA_NAME(len), &tmp); + + /* Return 0 upon success. According to + http://www.open-mpi.org/community/lists/plpa-users/2006/02/0016.php, + all the kernel implementations return >= 0 upon success. */ + if (ret >= 0) { + return 0; + } else { + return ret; + } + break; + + case PLPA_NAME_CAPS(PROBE_NOT_SUPPORTED): + /* Process affinity not supported here */ + return ENOSYS; + break; + + default: + /* Something went wrong */ + /* JMS: would be good to have something other than EINVAL here + -- suggestions? */ + return EINVAL; + break; + } +} + + +/** + * Call the kernel's getaffinity, massaging the user's input + * parameters as necessary + */ +int PLPA_NAME(sched_getaffinity)(pid_t pid, size_t cpusetsize, + PLPA_NAME(cpu_set_t) *cpuset) +{ + int ret; + PLPA_NAME(api_type_t) api; + + /* Check to see that we're initialized */ + if (!PLPA_NAME(initialized)) { + if (0 != (ret = PLPA_NAME(init)())) { + return ret; + } + } + + /* Check for bozo arguments */ + if (NULL == cpuset) { + return EINVAL; + } + /* Probe the API type */ + if (0 != (ret = PLPA_NAME(api_probe)(&api))) { + return ret; + } + switch (api) { + case PLPA_NAME_CAPS(PROBE_OK): + /* This shouldn't happen, but check anyway */ + if (PLPA_NAME(len) > sizeof(*cpuset)) { + return EINVAL; + } + + /* If the user supplied a buffer that is too small, then don't + even bother */ + if (cpusetsize < PLPA_NAME(len)) { + return EINVAL; + } + + /* Now we know that the user's buffer is >= the size required + by the kernel. If it's >, then zero it out so that the + bits at the top are cleared (since they won't be set by the + kernel) */ + if (cpusetsize > PLPA_NAME(len)) { + memset(cpuset, 0, cpusetsize); + } + + /* Now do the syscall */ + ret = syscall(__NR_sched_getaffinity, pid, PLPA_NAME(len), cpuset); + + /* Return 0 upon success. According to + http://www.open-mpi.org/community/lists/plpa-users/2006/02/0016.php, + all the kernel implementations return >= 0 upon success. */ + if (ret >= 0) { + return 0; + } else { + return ret; + } + break; + + case PLPA_NAME_CAPS(PROBE_NOT_SUPPORTED): + /* Process affinity not supported here */ + return ENOSYS; + break; + + default: + /* Something went wrong */ + return EINVAL; + break; + } +} + diff --git a/plpa-1.1/src/plpa_internal.h b/plpa-1.1/src/plpa_internal.h new file mode 100644 index 00000000..14ef2ccb --- /dev/null +++ b/plpa-1.1/src/plpa_internal.h @@ -0,0 +1,36 @@ +/* -*- c -*- + * + * Copyright (c) 2004-2005 The Trustees of Indiana University. + * All rights reserved. + * Copyright (c) 2004-2005 The Regents of the University of California. + * All rights reserved. + * Copyright (c) 2007 Cisco Systems, Inc. All rights reserved. + * $COPYRIGHT$ + * + * Additional copyrights may follow + * + * $HEADER$ + */ + +#ifndef PLPA_INTERNAL_H +#define PLPA_INTERNAL_H + +#include + +/* Have we initialized yet? */ +extern int PLPA_NAME(initialized); + +/* Cached size of the affinity buffers that the kernel expects */ +extern size_t PLPA_NAME(len); + +/* Setup topology information */ +int PLPA_NAME(map_init)(void); + +/* Setup API type */ +int PLPA_NAME(api_probe_init)(void); + +/* Free all mapping memory */ +void PLPA_NAME(map_finalize)(void); + +#endif /* PLPA_INTERNAL_H */ + diff --git a/plpa-1.1/src/plpa_map.c b/plpa-1.1/src/plpa_map.c new file mode 100644 index 00000000..84b1d0ea --- /dev/null +++ b/plpa-1.1/src/plpa_map.c @@ -0,0 +1,602 @@ +/* + * Copyright (c) 2007 Cisco Systems, Inc. All rights reserved. + * + * Portions of this file originally contributed by Advanced Micro + * Devices, Inc. See notice below. + */ +/* ============================================================ + License Agreement + + Copyright (c) 2006, 2007 Advanced Micro Devices, Inc. + All rights reserved. + + Redistribution and use in any form of this material and any product + thereof including software in source or binary forms, along with any + related documentation, with or without modification ("this material"), + is permitted provided that the following conditions are met: + + + Redistributions of source code of any software must retain the above + copyright notice and all terms of this license as part of the code. + + + Redistributions in binary form of any software must reproduce the + above copyright notice and all terms of this license in any related + documentation and/or other materials. + + + Neither the names nor trademarks of Advanced Micro Devices, Inc. or + any copyright holders or contributors may be used to endorse or + promote products derived from this material without specific prior + written permission. + + + Notice about U.S. Government restricted rights: This material is + provided with "RESTRICTED RIGHTS." Use, duplication or disclosure by + the U.S. Government is subject to the full extent of restrictions set + forth in FAR52.227 and DFARS252.227 et seq., or any successor or + applicable regulations. Use of this material by the U.S. Government + constitutes acknowledgment of the proprietary rights of Advanced Micro + Devices, Inc. + and any copyright holders and contributors. + + + In no event shall anyone redistributing or accessing or using this + material commence or participate in any arbitration or legal action + relating to this material against Advanced Micro Devices, Inc. or any + copyright holders or contributors. The foregoing shall survive any + expiration or termination of this license or any agreement or access + or use related to this material. + + + ANY BREACH OF ANY TERM OF THIS LICENSE SHALL RESULT IN THE IMMEDIATE + REVOCATION OF ALL RIGHTS TO REDISTRIBUTE, ACCESS OR USE THIS MATERIAL. + + THIS MATERIAL IS PROVIDED BY ADVANCED MICRO DEVICES, INC. AND ANY + COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" IN ITS CURRENT CONDITION + AND WITHOUT ANY REPRESENTATIONS, GUARANTEE, OR WARRANTY OF ANY KIND OR + IN ANY WAY RELATED TO SUPPORT, INDEMNITY, ERROR FREE OR UNINTERRUPTED + OPERATION, OR THAT IT IS FREE FROM DEFECTS OR VIRUSES. ALL + OBLIGATIONS ARE HEREBY DISCLAIMED - WHETHER EXPRESS, IMPLIED, OR + STATUTORY - INCLUDING, BUT NOT LIMITED TO, ANY IMPLIED WARRANTIES OF + TITLE, MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, ACCURACY, + COMPLETENESS, OPERABILITY, QUALITY OF SERVICE, OR NON-INFRINGEMENT. IN + NO EVENT SHALL ADVANCED MICRO DEVICES, INC. OR ANY COPYRIGHT HOLDERS + OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + SPECIAL, PUNITIVE, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + USE, REVENUE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + CAUSED OR BASED ON ANY THEORY OF LIABILITY ARISING IN ANY WAY RELATED + TO THIS MATERIAL, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + THE ENTIRE AND AGGREGATE LIABILITY OF ADVANCED MICRO DEVICES, INC. AND + ANY COPYRIGHT HOLDERS AND CONTRIBUTORS SHALL NOT EXCEED TEN DOLLARS + (US $10.00). ANYONE REDISTRIBUTING OR ACCESSING OR USING THIS MATERIAL + ACCEPTS THIS ALLOCATION OF RISK AND AGREES TO RELEASE ADVANCED MICRO + DEVICES, INC. AND ANY COPYRIGHT HOLDERS AND CONTRIBUTORS FROM ANY AND + ALL LIABILITIES, OBLIGATIONS, CLAIMS, OR DEMANDS IN EXCESS OF TEN + DOLLARS (US $10.00). THE FOREGOING ARE ESSENTIAL TERMS OF THIS LICENSE + AND, IF ANY OF THESE TERMS ARE CONSTRUED AS UNENFORCEABLE, FAIL IN + ESSENTIAL PURPOSE, OR BECOME VOID OR DETRIMENTAL TO ADVANCED MICRO + DEVICES, INC. OR ANY COPYRIGHT HOLDERS OR CONTRIBUTORS FOR ANY REASON, + THEN ALL RIGHTS TO REDISTRIBUTE, ACCESS OR USE THIS MATERIAL SHALL + TERMINATE IMMEDIATELY. MOREOVER, THE FOREGOING SHALL SURVIVE ANY + EXPIRATION OR TERMINATION OF THIS LICENSE OR ANY AGREEMENT OR ACCESS + OR USE RELATED TO THIS MATERIAL. + + NOTICE IS HEREBY PROVIDED, AND BY REDISTRIBUTING OR ACCESSING OR USING + THIS MATERIAL SUCH NOTICE IS ACKNOWLEDGED, THAT THIS MATERIAL MAY BE + SUBJECT TO RESTRICTIONS UNDER THE LAWS AND REGULATIONS OF THE UNITED + STATES OR OTHER COUNTRIES, WHICH INCLUDE BUT ARE NOT LIMITED TO, U.S. + EXPORT CONTROL LAWS SUCH AS THE EXPORT ADMINISTRATION REGULATIONS AND + NATIONAL SECURITY CONTROLS AS DEFINED THEREUNDER, AS WELL AS STATE + DEPARTMENT CONTROLS UNDER THE U.S. MUNITIONS LIST. THIS MATERIAL MAY + NOT BE USED, RELEASED, TRANSFERRED, IMPORTED, EXPORTED AND/OR RE- + EXPORTED IN ANY MANNER PROHIBITED UNDER ANY APPLICABLE LAWS, INCLUDING + U.S. EXPORT CONTROL LAWS REGARDING SPECIFICALLY DESIGNATED PERSONS, + COUNTRIES AND NATIONALS OF COUNTRIES SUBJECT TO NATIONAL SECURITY + CONTROLS. + MOREOVER, + THE FOREGOING SHALL SURVIVE ANY EXPIRATION OR TERMINATION OF ANY + LICENSE OR AGREEMENT OR ACCESS OR USE RELATED TO THIS MATERIAL. + + This license forms the entire agreement regarding the subject matter + hereof and supersedes all proposals and prior discussions and writings + between the parties with respect thereto. This license does not affect + any ownership, rights, title, or interest in, or relating to, this + material. No terms of this license can be modified or waived, and no + breach of this license can be excused, unless done so in a writing + signed by all affected parties. Each term of this license is + separately enforceable. If any term of this license is determined to + be or becomes unenforceable or illegal, such term shall be reformed to + the minimum extent necessary in order for this license to remain in + effect in accordance with its terms as modified by such reformation. + This license shall be governed by and construed in accordance with the + laws of the State of Texas without regard to rules on conflicts of law + of any state or jurisdiction or the United Nations Convention on the + International Sale of Goods. All disputes arising out of this license + shall be subject to the jurisdiction of the federal and state courts + in Austin, Texas, and all defenses are hereby waived concerning + personal jurisdiction and venue of these courts. + ============================================================ */ + +#include "plpa_config.h" +#include "plpa.h" +#include "plpa_internal.h" + +#include +#include +#include +#include +#include +#include +#include +#include + +typedef struct tuple_t_ { + int processor_id, socket, core; +} tuple_t; + +static int supported = 0; +static int num_processors = -1; +static int max_processor_num = -1; +static int num_sockets = -1; +static int max_socket_id = -1; +static int *max_core_id = NULL; +static int *num_cores = NULL; +static int max_core_id_overall = -1; +static tuple_t *map_processor_id_to_tuple = NULL; +static tuple_t ***map_tuple_to_processor_id = NULL; + +static void clear_cache(void) +{ + if (NULL != max_core_id) { + free(max_core_id); + max_core_id = NULL; + } + if (NULL != num_cores) { + free(num_cores); + num_cores = NULL; + } + if (NULL != map_processor_id_to_tuple) { + free(map_processor_id_to_tuple); + map_processor_id_to_tuple = NULL; + } + if (NULL != map_tuple_to_processor_id) { + if (NULL != map_tuple_to_processor_id[0]) { + free(map_tuple_to_processor_id[0]); + map_tuple_to_processor_id = NULL; + } + free(map_tuple_to_processor_id); + map_tuple_to_processor_id = NULL; + } + + num_processors = max_processor_num = -1; + num_sockets = max_socket_id = -1; + max_core_id_overall = -1; +} + +static void load_cache(const char *sysfs_mount) +{ + int i, j, k, invalid_entry, fd; + char path[PATH_MAX], buf[8]; + PLPA_NAME(cpu_set_t) *cores_on_sockets; + int found; + + /* Check for the parent directory */ + sprintf(path, "%s/devices/system/cpu", sysfs_mount); + if (access(path, R_OK|X_OK)) { + return; + } + + /* Go through and find the max processor ID */ + for (num_processors = max_processor_num = i = 0; + i < PLPA_BITMASK_CPU_MAX; ++i) { + sprintf(path, "%s/devices/system/cpu/cpu%d", sysfs_mount, i); + if (0 != access(path, (R_OK | X_OK))) { + max_processor_num = i - 1; + break; + } + ++num_processors; + } + + /* If we found no processors, then we have no topology info */ + if (0 == num_processors) { + clear_cache(); + return; + } + + /* Malloc space for the first map (processor ID -> tuple). + Include enough space for one invalid entry. */ + map_processor_id_to_tuple = malloc(sizeof(tuple_t) * + (max_processor_num + 2)); + if (NULL == map_processor_id_to_tuple) { + return; + } + for (i = 0; i <= max_processor_num; ++i) { + map_processor_id_to_tuple[i].processor_id = i; + map_processor_id_to_tuple[i].socket = -1; + map_processor_id_to_tuple[i].core = -1; + } + /* Set the invalid entry */ + invalid_entry = i; + map_processor_id_to_tuple[invalid_entry].processor_id = -1; + map_processor_id_to_tuple[invalid_entry].socket = -1; + map_processor_id_to_tuple[invalid_entry].core = -1; + + /* Build a cached map of (socket,core) tuples */ + for (found = 0, i = 0; i <= max_processor_num; ++i) { + sprintf(path, "%s/devices/system/cpu/cpu%d/topology/core_id", + sysfs_mount, i); + fd = open(path, O_RDONLY); + if ( fd < 0 ) { + continue; + } + if ( read(fd, buf, 7) <= 0 ) { + continue; + } + sscanf(buf, "%d", &(map_processor_id_to_tuple[i].core)); + close(fd); + + sprintf(path, + "%s/devices/system/cpu/cpu%d/topology/physical_package_id", + sysfs_mount, i); + fd = open(path, O_RDONLY); + if ( fd < 0 ) { + continue; + } + if ( read(fd, buf, 7) <= 0 ) { + continue; + } + sscanf(buf, "%d", &(map_processor_id_to_tuple[i].socket)); + close(fd); + found = 1; + + /* Keep a running tab on the max socket number */ + if (map_processor_id_to_tuple[i].socket > max_socket_id) { + max_socket_id = map_processor_id_to_tuple[i].socket; + } + } + + /* Now that we know the max number of sockets, allocate some + arrays */ + max_core_id = malloc(sizeof(int) * (max_socket_id + 1)); + if (NULL == max_core_id) { + clear_cache(); + return; + } + num_cores = malloc(sizeof(int) * (max_socket_id + 1)); + if (NULL == num_cores) { + clear_cache(); + return; + } + for (i = 0; i <= max_socket_id; ++i) { + num_cores[i] = -1; + max_core_id[i] = -1; + } + + /* Find the max core number on each socket */ + for (i = 0; i <= max_processor_num; ++i) { + if (map_processor_id_to_tuple[i].core > + max_core_id[map_processor_id_to_tuple[i].socket]) { + max_core_id[map_processor_id_to_tuple[i].socket] = + map_processor_id_to_tuple[i].core; + } + if (max_core_id[map_processor_id_to_tuple[i].socket] > + max_core_id_overall) { + max_core_id_overall = + max_core_id[map_processor_id_to_tuple[i].socket]; + } + } + + /* If we didn't find any core_id/physical_package_id's, then we + don't have the topology info */ + if (!found) { + clear_cache(); + return; + } + + /* Go through and count the number of unique sockets found. It + may not be the same as max_socket_id because there may be + "holes" -- e.g., sockets 0 and 3 are used, but sockets 1 and 2 + are empty. */ + for (j = i = 0; i <= max_socket_id; ++i) { + if (max_core_id[i] >= 0) { + ++j; + } + } + if (j > 0) { + num_sockets = j; + } + + /* Count how many cores are available on each socket. This may + not be the same as max_core_id[socket_num] if there are + "holes". I don't know if holes can happen (i.e., if specific + cores can be taken offline), but what the heck... */ + cores_on_sockets = malloc(sizeof(PLPA_NAME(cpu_set_t)) * + (max_socket_id + 1)); + if (NULL == cores_on_sockets) { + clear_cache(); + return; + } + for (i = 0; i <= max_socket_id; ++i) { + PLPA_CPU_ZERO(&(cores_on_sockets[i])); + } + for (i = 0; i <= max_processor_num; ++i) { + if (map_processor_id_to_tuple[i].socket >= 0) { + PLPA_CPU_SET(map_processor_id_to_tuple[i].core, + &(cores_on_sockets[map_processor_id_to_tuple[i].socket])); + } + } + for (i = 0; i <= max_socket_id; ++i) { + int count = 0; + for (j = 0; j < PLPA_BITMASK_CPU_MAX; ++j) { + if (PLPA_CPU_ISSET(j, &(cores_on_sockets[i]))) { + ++count; + } + } + if (count > 0) { + num_cores[i] = count; + } + } + + /* Now go through and build the map in the other direction: + (socket,core) => processor_id. This map simply points to + entries in the other map (i.e., it's by reference instead of by + value). */ + map_tuple_to_processor_id = malloc(sizeof(tuple_t **) * + (max_socket_id + 1)); + if (NULL == map_tuple_to_processor_id) { + clear_cache(); + return; + } + map_tuple_to_processor_id[0] = malloc(sizeof(tuple_t *) * + ((max_socket_id + 1) * + (max_core_id_overall + 1))); + if (NULL == map_tuple_to_processor_id[0]) { + clear_cache(); + return; + } + /* Set pointers for 2nd dimension */ + for (i = 1; i <= max_socket_id; ++i) { + map_tuple_to_processor_id[i] = + map_tuple_to_processor_id[i - 1] + max_core_id_overall + 1; + } + /* Compute map */ + for (i = 0; i <= max_socket_id; ++i) { + for (j = 0; j <= max_core_id_overall; ++j) { + /* Default to the invalid entry in the other map, meaning + that this (socket,core) combination doesn't exist + (e.g., the core number does not exist in this socket, + although it does exist in other sockets). */ + map_tuple_to_processor_id[i][j] = + &map_processor_id_to_tuple[invalid_entry]; + + /* See if this (socket,core) tuple exists in the other + map. If so, set this entry to point to it (overriding + the invalid entry default). */ + for (k = 0; k <= max_processor_num; ++k) { + if (map_processor_id_to_tuple[k].socket == i && + map_processor_id_to_tuple[k].core == j) { + map_tuple_to_processor_id[i][j] = + &map_processor_id_to_tuple[k]; +#if defined(PLPA_DEBUG) && PLPA_DEBUG + printf("Creating map: (socket %d, core %d) -> ID %d\n", + i, j, k); +#endif + break; + } + } + } + } + + supported = 1; +} + +/* Internal function to setup the mapping data. Guaranteed to be + calling during PLPA_NAME(init), so we don't have to worry about + thread safety here. */ +int PLPA_NAME(map_init)(void) +{ + const char *sysfs_mount = "/sys"; + char *temp; + + temp = getenv("PLPA_SYSFS_MOUNT"); + if (temp) { + sysfs_mount = temp; + } + + load_cache(sysfs_mount); + return 0; +} + +/* Internal function to cleanup allocated memory. Only called by one + thread (during PLPA_NAME(finalize), so don't need to worry about + thread safety here. */ +void PLPA_NAME(map_finalize)(void) +{ + clear_cache(); +} + +/* Return whether this kernel supports topology information or not */ +int PLPA_NAME(have_topology_information)(int *supported_arg) +{ + int ret; + + /* Initialize if not already done so */ + if (!PLPA_NAME(initialized)) { + if (0 != (ret = PLPA_NAME(init)())) { + return ret; + } + } + + /* Check for bozo arguments */ + if (NULL == supported_arg) { + return EINVAL; + } + + *supported_arg = supported; + return 0; +} + +int PLPA_NAME(map_to_processor_id)(int socket, int core, int *processor_id) +{ + int ret; + + /* Initialize if not already done so */ + if (!PLPA_NAME(initialized)) { + if (0 != (ret = PLPA_NAME(init)())) { + return ret; + } + } + + /* Check for bozo arguments */ + if (NULL == processor_id) { + return EINVAL; + } + + /* If this system doesn't support mapping, sorry Charlie */ + if (!supported) { + return ENOSYS; + } + + /* Check for some invalid entries */ + if (socket < 0 || socket > max_socket_id || + core < 0 || core > max_core_id_overall) { + return ENOENT; + } + /* If the mapping returns -1, then this is a non-existent + socket/core combo (even though they fall within the max socket + / max core overall values) */ + ret = map_tuple_to_processor_id[socket][core]->processor_id; + if (-1 == ret) { + return ENOENT; + } + + /* Ok, all should be good -- return the mapping */ + *processor_id = ret; + return 0; +} + +int PLPA_NAME(map_to_socket_core)(int processor_id, int *socket, int *core) +{ + int ret; + + /* Initialize if not already done so */ + if (!PLPA_NAME(initialized)) { + if (0 != (ret = PLPA_NAME(init)())) { + return ret; + } + } + + /* Check for bozo arguments */ + if (NULL == socket || NULL == core) { + return EINVAL; + } + + /* If this system doesn't support mapping, sorry Charlie */ + if (!supported) { + return ENOSYS; + } + + /* Check for some invalid entries */ + if (processor_id < 0 || processor_id > max_processor_num) { + return ENOENT; + } + ret = map_processor_id_to_tuple[processor_id].socket; + if (-1 == ret) { + return ENOENT; + } + + /* Ok, all should be good -- return the mapping */ + *socket = ret; + *core = map_processor_id_to_tuple[processor_id].core; + return 0; +} + +int PLPA_NAME(get_processor_info)(int *num_processors_arg, + int *max_processor_num_arg) +{ + int ret; + + /* Initialize if not already done so */ + if (!PLPA_NAME(initialized)) { + if (0 != (ret = PLPA_NAME(init)())) { + return ret; + } + } + + /* Check for bozo arguments */ + if (NULL == max_processor_num_arg || NULL == num_processors_arg) { + return EINVAL; + } + + /* If this system doesn't support mapping, sorry Charlie */ + if (!supported) { + return ENOSYS; + } + + /* All done */ + *num_processors_arg = num_processors; + *max_processor_num_arg = max_processor_num; + return 0; +} + +/* Return the max socket number */ +int PLPA_NAME(get_socket_info)(int *num_sockets_arg, int *max_socket_id_arg) +{ + int ret; + + /* Initialize if not already done so */ + if (!PLPA_NAME(initialized)) { + if (0 != (ret = PLPA_NAME(init)())) { + return ret; + } + } + + /* Check for bozo arguments */ + if (NULL == max_socket_id_arg || NULL == num_sockets_arg) { + return EINVAL; + } + + /* If this system doesn't support mapping, sorry Charlie */ + if (!supported) { + return ENOSYS; + } + + /* All done */ + *num_sockets_arg = num_sockets; + *max_socket_id_arg = max_socket_id; + return 0; +} + +/* Return the number of cores in a socket and the max core ID number */ +int PLPA_NAME(get_core_info)(int socket, int *num_cores_arg, + int *max_core_id_arg) +{ + int ret; + + /* Initialize if not already done so */ + if (!PLPA_NAME(initialized)) { + if (0 != (ret = PLPA_NAME(init)())) { + return ret; + } + } + + /* Check for bozo arguments */ + if (NULL == max_core_id_arg || NULL == num_cores_arg) { + return EINVAL; + } + + /* If this system doesn't support mapping, sorry Charlie */ + if (!supported) { + return ENOSYS; + } + + /* Check for some invalid entries */ + if (socket < 0 || socket > max_socket_id || -1 == max_core_id[socket]) { + return ENOENT; + } + ret = num_cores[socket]; + if (-1 == ret) { + return ENOENT; + } + + /* All done */ + *num_cores_arg = ret; + *max_core_id_arg = max_core_id[socket]; + return 0; +} diff --git a/plpa-1.1/src/plpa_runtime.c b/plpa-1.1/src/plpa_runtime.c new file mode 100644 index 00000000..b5a8c05c --- /dev/null +++ b/plpa-1.1/src/plpa_runtime.c @@ -0,0 +1,73 @@ +/* + * Copyright (c) 2007 Cisco Systems, Inc. All rights reserved. + */ + +#include "plpa_config.h" +#include "plpa.h" +#include "plpa_internal.h" + +#include +#include + +/* Global variables */ +int PLPA_NAME(initialized) = 0; + +/* Local variables */ +static int refcount = 0; +static pthread_mutex_t mutex; + + +/* Central clearing point for all parts of PLPA that need to be + initialized. It is erroneous to call this function by more than + one thread simultaneously. */ +int PLPA_NAME(init)(void) +{ + int ret; + + /* If we're already initialized, simply increase the refcount */ + if (PLPA_NAME(initialized)) { + pthread_mutex_lock(&mutex); + ++refcount; + pthread_mutex_unlock(&mutex); + return 0; + } + + /* Otherwise, initialize all the sybsystems */ + if (0 != (ret = pthread_mutex_init(&mutex, NULL)) || + 0 != (ret = PLPA_NAME(api_probe_init)()) || + 0 != (ret = PLPA_NAME(map_init)())) { + return ret; + } + + PLPA_NAME(initialized) = 1; + refcount = 1; + return 0; +} + + +/* Central clearing point for all parts of PLPA that need to be + shutdown. */ +int PLPA_NAME(finalize)(void) +{ + int val; + + /* If we're not initialized, return an error */ + if (!PLPA_NAME(initialized)) { + return ENOENT; + } + + /* Decrement and check the refcount. If it's nonzero, then simply + return success. */ + pthread_mutex_lock(&mutex); + val = --refcount; + pthread_mutex_unlock(&mutex); + if (0 != val) { + return 0; + } + + /* Ok, we're the last one. Cleanup. */ + PLPA_NAME(map_finalize)(); + pthread_mutex_destroy(&mutex); + PLPA_NAME(initialized) = 0; + return 0; +}