Permalink
Browse files

Add installer, tcmalloc and system_allocator stuff.

  • Loading branch information...
1 parent f382717 commit 7dab23e6621bbbaa39f3973549ff13b022cb9028 @FooBarWidget FooBarWidget committed Sep 2, 2009
Showing with 75,886 additions and 0 deletions.
  1. +1 −0 Rakefile
  2. +13 −0 defines.h
  3. +1 −0 distro/debian/compat
  4. +15 −0 distro/debian/control
  5. +2 −0 distro/debian/postinst
  6. +2 −0 distro/debian/prerm
  7. +218 −0 distro/dependencies.rb
  8. +674 −0 distro/documentation.txt
  9. +2 −0 distro/google-perftools-1.3/AUTHORS
  10. +28 −0 distro/google-perftools-1.3/COPYING
  11. +357 −0 distro/google-perftools-1.3/ChangeLog
  12. +468 −0 distro/google-perftools-1.3/INSTALL
  13. +994 −0 distro/google-perftools-1.3/Makefile.am
  14. +3,975 −0 distro/google-perftools-1.3/Makefile.in
  15. 0 distro/google-perftools-1.3/NEWS
  16. +239 −0 distro/google-perftools-1.3/README
  17. +71 −0 distro/google-perftools-1.3/README.windows
  18. +47 −0 distro/google-perftools-1.3/TODO
  19. +7,550 −0 distro/google-perftools-1.3/aclocal.m4
  20. +142 −0 distro/google-perftools-1.3/compile
  21. +1,516 −0 distro/google-perftools-1.3/config.guess
  22. +1,626 −0 distro/google-perftools-1.3/config.sub
  23. +27,546 −0 distro/google-perftools-1.3/configure
  24. +319 −0 distro/google-perftools-1.3/configure.ac
  25. +530 −0 distro/google-perftools-1.3/depcomp
  26. +264 −0 distro/google-perftools-1.3/doc/cpuprofile-fileformat.html
  27. +503 −0 distro/google-perftools-1.3/doc/cpuprofile.html
  28. +115 −0 distro/google-perftools-1.3/doc/designstyle.css
  29. BIN distro/google-perftools-1.3/doc/heap-example1.png
  30. +631 −0 distro/google-perftools-1.3/doc/heap_checker.html
  31. +370 −0 distro/google-perftools-1.3/doc/heapprofile.html
  32. +21 −0 distro/google-perftools-1.3/doc/index.html
  33. +15 −0 distro/google-perftools-1.3/doc/overview.dot
  34. BIN distro/google-perftools-1.3/doc/overview.gif
  35. +29 −0 distro/google-perftools-1.3/doc/pageheap.dot
  36. BIN distro/google-perftools-1.3/doc/pageheap.gif
  37. BIN distro/google-perftools-1.3/doc/pprof-test-big.gif
  38. BIN distro/google-perftools-1.3/doc/pprof-test.gif
  39. BIN distro/google-perftools-1.3/doc/pprof-vsnprintf-big.gif
  40. BIN distro/google-perftools-1.3/doc/pprof-vsnprintf.gif
  41. +131 −0 distro/google-perftools-1.3/doc/pprof.1
  42. +211 −0 distro/google-perftools-1.3/doc/pprof_remote_servers.html
  43. +22 −0 distro/google-perftools-1.3/doc/spanmap.dot
  44. BIN distro/google-perftools-1.3/doc/spanmap.gif
  45. +480 −0 distro/google-perftools-1.3/doc/t-test1.times.txt
  46. BIN distro/google-perftools-1.3/doc/tcmalloc-opspercpusec.vs.threads.1024.bytes.png
  47. BIN distro/google-perftools-1.3/doc/tcmalloc-opspercpusec.vs.threads.128.bytes.png
  48. BIN distro/google-perftools-1.3/doc/tcmalloc-opspercpusec.vs.threads.131072.bytes.png
  49. BIN distro/google-perftools-1.3/doc/tcmalloc-opspercpusec.vs.threads.16384.bytes.png
  50. BIN distro/google-perftools-1.3/doc/tcmalloc-opspercpusec.vs.threads.2048.bytes.png
  51. BIN distro/google-perftools-1.3/doc/tcmalloc-opspercpusec.vs.threads.256.bytes.png
  52. BIN distro/google-perftools-1.3/doc/tcmalloc-opspercpusec.vs.threads.32768.bytes.png
  53. BIN distro/google-perftools-1.3/doc/tcmalloc-opspercpusec.vs.threads.4096.bytes.png
  54. BIN distro/google-perftools-1.3/doc/tcmalloc-opspercpusec.vs.threads.512.bytes.png
  55. BIN distro/google-perftools-1.3/doc/tcmalloc-opspercpusec.vs.threads.64.bytes.png
  56. BIN distro/google-perftools-1.3/doc/tcmalloc-opspercpusec.vs.threads.65536.bytes.png
  57. BIN distro/google-perftools-1.3/doc/tcmalloc-opspercpusec.vs.threads.8192.bytes.png
  58. BIN distro/google-perftools-1.3/doc/tcmalloc-opspersec.vs.size.1.threads.png
  59. BIN distro/google-perftools-1.3/doc/tcmalloc-opspersec.vs.size.12.threads.png
  60. BIN distro/google-perftools-1.3/doc/tcmalloc-opspersec.vs.size.16.threads.png
  61. BIN distro/google-perftools-1.3/doc/tcmalloc-opspersec.vs.size.2.threads.png
  62. BIN distro/google-perftools-1.3/doc/tcmalloc-opspersec.vs.size.20.threads.png
  63. BIN distro/google-perftools-1.3/doc/tcmalloc-opspersec.vs.size.3.threads.png
  64. BIN distro/google-perftools-1.3/doc/tcmalloc-opspersec.vs.size.4.threads.png
  65. BIN distro/google-perftools-1.3/doc/tcmalloc-opspersec.vs.size.5.threads.png
  66. BIN distro/google-perftools-1.3/doc/tcmalloc-opspersec.vs.size.8.threads.png
  67. +679 −0 distro/google-perftools-1.3/doc/tcmalloc.html
  68. +21 −0 distro/google-perftools-1.3/doc/threadheap.dot
  69. BIN distro/google-perftools-1.3/doc/threadheap.gif
  70. +163 −0 distro/google-perftools-1.3/google-perftools.sln
  71. +323 −0 distro/google-perftools-1.3/install-sh
  72. +7,629 −0 distro/google-perftools-1.3/libtool
  73. +6,964 −0 distro/google-perftools-1.3/ltmain.sh
  74. +16 −0 distro/google-perftools-1.3/m4/ac_have_attribute.m4
  75. +35 −0 distro/google-perftools-1.3/m4/acx_nanosleep.m4
  76. +363 −0 distro/google-perftools-1.3/m4/acx_pthread.m4
  77. +24 −0 distro/google-perftools-1.3/m4/compiler_characteristics.m4
  78. +8 −0 distro/google-perftools-1.3/m4/install_prefix.m4
  79. +15 −0 distro/google-perftools-1.3/m4/namespaces.m4
  80. +19 −0 distro/google-perftools-1.3/m4/program_invocation_name.m4
  81. +25 −0 distro/google-perftools-1.3/m4/stl_namespace.m4
  82. +360 −0 distro/google-perftools-1.3/missing
  83. +158 −0 distro/google-perftools-1.3/mkinstalldirs
  84. +74 −0 distro/google-perftools-1.3/packages/deb.sh
  85. +7 −0 distro/google-perftools-1.3/packages/deb/README
  86. +147 −0 distro/google-perftools-1.3/packages/deb/changelog
  87. +1 −0 distro/google-perftools-1.3/packages/deb/compat
  88. +25 −0 distro/google-perftools-1.3/packages/deb/control
  89. +35 −0 distro/google-perftools-1.3/packages/deb/copyright
  90. +47 −0 distro/google-perftools-1.3/packages/deb/docs
  91. +3 −0 distro/google-perftools-1.3/packages/deb/libgoogle-perftools-dev.dirs
  92. +8 −0 distro/google-perftools-1.3/packages/deb/libgoogle-perftools-dev.install
  93. +2 −0 distro/google-perftools-1.3/packages/deb/libgoogle-perftools0.dirs
  94. +4 −0 distro/google-perftools-1.3/packages/deb/libgoogle-perftools0.install
  95. +1 −0 distro/google-perftools-1.3/packages/deb/libgoogle-perftools0.manpages
  96. +117 −0 distro/google-perftools-1.3/packages/deb/rules
  97. +86 −0 distro/google-perftools-1.3/packages/rpm.sh
  98. +75 −0 distro/google-perftools-1.3/packages/rpm/rpm.spec
  99. +421 −0 distro/google-perftools-1.3/src/addressmap-inl.h
  100. +416 −0 distro/google-perftools-1.3/src/base/atomicops-internals-linuxppc.h
  101. +354 −0 distro/google-perftools-1.3/src/base/atomicops-internals-macosx.h
  102. +414 −0 distro/google-perftools-1.3/src/base/atomicops-internals-x86-msvc.h
  103. +127 −0 distro/google-perftools-1.3/src/base/atomicops-internals-x86.cc
  104. +422 −0 distro/google-perftools-1.3/src/base/atomicops-internals-x86.h
  105. +387 −0 distro/google-perftools-1.3/src/base/atomicops.h
  106. +304 −0 distro/google-perftools-1.3/src/base/basictypes.h
  107. +131 −0 distro/google-perftools-1.3/src/base/commandlineflags.h
  108. +110 −0 distro/google-perftools-1.3/src/base/cycleclock.h
  109. +107 −0 distro/google-perftools-1.3/src/base/dynamic_annotations.cc
  110. +389 −0 distro/google-perftools-1.3/src/base/dynamic_annotations.h
  111. +385 −0 distro/google-perftools-1.3/src/base/elfcore.h
  112. +51 −0 distro/google-perftools-1.3/src/base/googleinit.h
  113. +3,020 −0 distro/google-perftools-1.3/src/base/linux_syscall_support.h
  114. +665 −0 distro/google-perftools-1.3/src/base/linuxthreads.cc
  115. +53 −0 distro/google-perftools-1.3/src/base/linuxthreads.h
  116. +107 −0 distro/google-perftools-1.3/src/base/logging.cc
  117. +224 −0 distro/google-perftools-1.3/src/base/logging.h
  118. +461 −0 distro/google-perftools-1.3/src/base/low_level_alloc.cc
  119. +103 −0 distro/google-perftools-1.3/src/base/low_level_alloc.h
  120. +282 −0 distro/google-perftools-1.3/src/base/simple_mutex.h
  121. +136 −0 distro/google-perftools-1.3/src/base/spinlock.cc
  122. +159 −0 distro/google-perftools-1.3/src/base/spinlock.h
  123. +96 −0 distro/google-perftools-1.3/src/base/stl_allocator.h
Sorry, we could not display the entire diff because it was too big.
View
1 Rakefile
@@ -0,0 +1 @@
+require 'distro/rakefile'
View
13 defines.h
@@ -51,6 +51,19 @@ void *xcalloc _((long,long));
void *xrealloc _((void*,long));
void xfree _((void*));
+#if defined(__APPLE__)
+ #define USING_SYSTEM_ALLOCATOR_LIBRARY
+#endif
+
+/* See system_allocator.c for documentation. */
+#ifdef USING_SYSTEM_ALLOCATOR_LIBRARY
+ void *system_malloc(long size);
+ void system_free(void *ptr);
+#else
+ #define system_malloc(size) malloc(size)
+ #define system_free(ptr) free(ptr)
+#endif
+
#if SIZEOF_LONG_LONG > 0
# define LONG_LONG long long
#elif SIZEOF___INT64 > 0
View
1 distro/debian/compat
@@ -0,0 +1 @@
+5
View
15 distro/debian/control
@@ -0,0 +1,15 @@
+Package: ruby-enterprise
+Version: <%= VENDOR_RUBY_VERSION %>-<%= REE_VERSION %>
+Section: interpreters
+Priority: optional
+Architecture: <%= arch %>
+Essential: no
+Depends: libc6 (>= 2.6.1-1)
+Pre-Depends:
+Suggests:
+Maintainer: Hongli Lai <hongli@phusion.nl>
+Conflicts:
+Replaces:
+Provides:
+Installed-Size: <%= installed_size %>
+Description: Ruby Enterprise Edition.
View
2 distro/debian/postinst
@@ -0,0 +1,2 @@
+#!/bin/sh
+
View
2 distro/debian/prerm
@@ -0,0 +1,2 @@
+#!/bin/sh
+
View
218 distro/dependencies.rb
@@ -0,0 +1,218 @@
+require "#{File.dirname(__FILE__)}/platform_info"
+module RubyEnterpriseEdition
+
+# Represents a dependency software that Ruby Enterprise Edition requires. It's used by the
+# installer to check whether all dependencies are available. A Dependency object
+# contains full information about a dependency, such as its name, code for
+# detecting whether it is installed, and installation instructions for the
+# current platform.
+class Dependency # :nodoc: all
+ [:name, :install_command, :install_instructions, :install_comments,
+ :website, :website_comments, :provides].each do |attr_name|
+ attr_writer attr_name
+
+ define_method(attr_name) do
+ call_init_block
+ return instance_variable_get("@#{attr_name}")
+ end
+ end
+
+ def initialize(&block)
+ @included_by = []
+ @init_block = block
+ end
+
+ def define_checker(&block)
+ @checker = block
+ end
+
+ def check
+ call_init_block
+ result = Result.new
+ @checker.call(result)
+ return result
+ end
+
+private
+ class Result
+ def found(filename_or_boolean = nil)
+ if filename_or_boolean.nil?
+ @found = true
+ else
+ @found = filename_or_boolean
+ end
+ end
+
+ def not_found
+ found(false)
+ end
+
+ def found?
+ return !@found.nil? && @found
+ end
+
+ def found_at
+ if @found.is_a?(TrueClass) || @found.is_a?(FalseClass)
+ return nil
+ else
+ return @found
+ end
+ end
+ end
+
+ def call_init_block
+ if @init_block
+ init_block = @init_block
+ @init_block = nil
+ init_block.call(self)
+ end
+ end
+end
+
+# Namespace which contains the different dependencies that Ruby Enterprise Edition may require.
+# See Dependency for more information.
+module Dependencies # :nodoc: all
+ include PlatformInfo
+
+ CC = Dependency.new do |dep|
+ dep.name = "C compiler"
+ dep.define_checker do |result|
+ if PlatformInfo::CC.nil?
+ result.not_found
+ else
+ result.found(PlatformInfo::CC)
+ end
+ end
+ if RUBY_PLATFORM =~ /linux/
+ case LINUX_DISTRO
+ when :ubuntu, :debian
+ dep.install_command = "apt-get install build-essential"
+ when :rhel, :fedora, :centos
+ dep.install_command = "yum install gcc-c++"
+ when :gentoo
+ dep.install_command = "emerge -av gcc"
+ end
+ elsif RUBY_PLATFORM =~ /darwin/
+ dep.install_instructions = "Please install the Apple Development Tools: http://developer.apple.com/tools/"
+ end
+ dep.website = "http://gcc.gnu.org/"
+ end
+
+ CXX = Dependency.new do |dep|
+ dep.name = "C++ compiler"
+ dep.define_checker do |result|
+ if PlatformInfo::CXX.nil?
+ result.not_found
+ else
+ result.found(PlatformInfo::CXX)
+ end
+ end
+ if RUBY_PLATFORM =~ /linux/
+ case LINUX_DISTRO
+ when :ubuntu, :debian
+ dep.install_command = "apt-get install build-essential"
+ when :rhel, :fedora, :centos
+ dep.install_command = "yum install gcc-c++"
+ when :gentoo
+ dep.install_command = "emerge -av gcc"
+ end
+ elsif RUBY_PLATFORM =~ /darwin/
+ dep.install_instructions = "Please install the Apple Development Tools: http://developer.apple.com/tools/"
+ end
+ dep.website = "http://gcc.gnu.org/"
+ end
+
+ Zlib_Dev = Dependency.new do |dep|
+ dep.name = "Zlib development headers"
+ dep.define_checker do |result|
+ begin
+ File.open('/tmp/r8ee-check.c', 'w') do |f|
+ f.write("#include <zlib.h>")
+ end
+ Dir.chdir('/tmp') do
+ if system("(#{PlatformInfo::CC || 'gcc'} #{ENV['CFLAGS']} -c r8ee-check.c) >/dev/null 2>/dev/null")
+ result.found
+ else
+ result.not_found
+ end
+ end
+ ensure
+ File.unlink('/tmp/r8ee-check.c') rescue nil
+ File.unlink('/tmp/r8ee-check.o') rescue nil
+ end
+ end
+ if RUBY_PLATFORM =~ /linux/
+ case LINUX_DISTRO
+ when :ubuntu, :debian
+ dep.install_command = "apt-get install zlib1g-dev"
+ when :rhel, :fedora, :centos
+ dep.install_command = "yum install zlib-devel"
+ end
+ end
+ dep.website = "http://www.zlib.net/"
+ end
+
+ OpenSSL_Dev = Dependency.new do |dep|
+ dep.name = "OpenSSL development headers"
+ dep.define_checker do |result|
+ begin
+ File.open('/tmp/r8ee-check.c', 'w') do |f|
+ f.write("#include <openssl/ssl.h>")
+ end
+ Dir.chdir('/tmp') do
+ if system("(#{PlatformInfo::CC || 'gcc'} #{ENV['CFLAGS']} -c r8ee-check.c) >/dev/null 2>/dev/null")
+ result.found
+ else
+ result.not_found
+ end
+ end
+ ensure
+ File.unlink('/tmp/r8ee-check.c') rescue nil
+ File.unlink('/tmp/r8ee-check.o') rescue nil
+ end
+ end
+ if RUBY_PLATFORM =~ /linux/
+ case LINUX_DISTRO
+ when :ubuntu, :debian
+ dep.install_command = "apt-get install libssl-dev"
+ when :rhel, :fedora, :centos
+ dep.install_command = "yum install openssl-devel"
+ end
+ end
+ dep.website = "http://www.openssl.org/"
+ end
+
+ Readline_Dev = Dependency.new do |dep|
+ dep.name = "GNU Readline development headers"
+ dep.define_checker do |result|
+ begin
+ File.open('/tmp/r8ee-check.c', 'w') do |f|
+ # readline.h doesn't work on OS X unless we #include stdio.h
+ f.puts("#include <stdio.h>")
+ f.puts("#include <readline/readline.h>")
+ end
+ Dir.chdir('/tmp') do
+ if system("(#{PlatformInfo::CC || 'gcc'} #{ENV['CFLAGS']} -c r8ee-check.c) >/dev/null 2>/dev/null")
+ result.found
+ else
+ result.not_found
+ end
+ end
+ ensure
+ File.unlink('/tmp/r8ee-check.c') rescue nil
+ File.unlink('/tmp/r8ee-check.o') rescue nil
+ end
+ end
+ if RUBY_PLATFORM =~ /linux/
+ case LINUX_DISTRO
+ when :ubuntu, :debian
+ dep.install_command = "apt-get install libreadline5-dev"
+ when :rhel, :fedora, :centos
+ dep.install_command = "yum install readline-devel"
+ end
+ end
+ dep.website = "http://cnswww.cns.cwru.edu/php/chet/readline/rltop.html"
+ end
+end
+
+end # module RubyEnterpriseEdition
View
674 distro/documentation.txt
@@ -0,0 +1,674 @@
+= Ruby Enterprise Edition Features Guide
+
+== Overview of Ruby Enterprise Edition (REE)
+Ruby Enterprise Edition (REE) is a server-oriented distribution of the official Ruby interpreter, and includes various additional enhancements:
+
+- A copy-on-write friendly garbage collector. Phusion Passenger uses this, in combination with a technique called preforking, to reduce Ruby on Rails applications' memory usage by 33% on average.
+- An improved memory allocator called tcmalloc, which improves performance quite a bit.
+- The ability to tweak garbage collector settings for maximum server performance.
+- The ability to inspect the garbage collector's state and the object heap state, for debugging purposes.
+- The ability to obtain backtraces for all running threads, making it easier for one to debug multithreaded applications.
+- Thread scheduler bug fixes and performance improvements. Threading on Ruby Enterprise Edition can be more than 10 times faster than official Ruby 1.8.
+- Various memory management tweaks so that the Ruby interpreter uses less memory on average, even when copy-on-write is not utilized.
+- Performance enhancements for Sparc machines.
+
+Some of these features are gathered from third party Ruby patches:
+link:http://railsbench.rubyforge.org/[RailsBench],
+http://rubyforge.org/tracker/download.php/426/1700/11497/2087/ruby-track-alloc.patch[Sylvain Joyeux's object allocation patch],
+link:http://ph7spot.com/articles/caller_for_all_threads[caller_for_all_threads],
+Darryl Gove's and Miriam Blatt's link:http://blogs.sun.com/d/entry/ruby_performance_gains_on_sparc[Sparc optimization patches],
+Joe Damato's and Aman Gupta's http://timetobleed.com/ruby-threading-bugfix-small-fix-goes-a-long-way/[SIGVTALRM patch] and http://timetobleed.com/fixing-threads-in-ruby-18-a-2-10x-performance-boost/[zero-copy context switching patch],
+Brent Roman's http://sites.google.com/site/brentsrubypatches[MBARI patch set].
+
+
+== Installation and uninstallation
+
+=== Installation via Debian package or source tarball
+To install REE, download either the source tarball or the Debian package
+from the REE website. The source tarball contains a cross-platform installer.
+Installation instructions are available on the download page.
+
+Note that this installer is written in Ruby, and thus requires a Ruby
+interpreter to run. Because not all systems come with a Ruby interpreter by
+default, the source tarball also contains a number of precompiled Ruby
+interpreters for various platforms, with the purpose of running the installer.
+The `installer` script will automatically use a precompiled Ruby binary for the
+current platform, if available. Precompiled Ruby interpreters for the following
+platforms are included:
+
+- x86 Linux
+- x86_64 Linux
+- x86 FreeBSD 6
+- Solaris
+
+MacOS X and most FreeBSD systems already come with a Ruby interpreter by default.
+
+So if you notice that the installer fails to start, please install Ruby first,
+then re-run the installer.
+
+WARNING: It is not recommended to install REE into '/usr' because it can
+overwrite your existing Ruby installation in a way that the system doesn't
+expect. You should install REE into an isolated place such as '/opt'.
+
+==== Installation options
+
+===== Disabling tcmalloc
+If you experience problems with the tcmalloc memory allocator, then you can
+install REE without tcmalloc by passing `--no-tcmalloc` to the installer.
+
+===== Non-interactive installation
+You can installer REE non-interactively either by using the Debian package,
+or by passing `--auto=DIRECTORY` to the REE installer. The latter will
+instruct the installer to non-interactively install REE into the specified
+target directory.
+
+=== Manual installation (for experts)
+If you wish to install REE from source, but do not wish to use the included
+installer, or if the installer doesn't work, then you can install REE manually.
+Please follow the instructions below.
+
+Note that these instructions do not cover installing RubyGems.
+
+==== Prerequisites
+
+You need to have the following dependencies installed:
+
+1. A C and C++ compiler, preferrably gcc.
+2. C development headers for zlib.
+3. C development headers for OpenSSL.
+4. C development headers for GNU Readline.
+5. yacc or bison.
+
+==== Step 1: Download and extract the source tarball
+Type:
+--------------------------
+tar xzvf ruby-enterprise-x.x.x.tar.gz
+--------------------------
+
+A directory called 'ruby-enterprise-x.x.x' will now appear.
+
+==== Step 2: Decide the prefix you want to install REE to
+
+Please decide on a prefix to install REE to, and put this directory name into
+the `PREFIX` environment variable. We'll need this value later in these
+instructions.
+
+For example, if you want to install REE into /opt/ruby-enterprise, then run:
+
+-------------------------------------
+PREFIX=/opt/ruby-enterprise
+-------------------------------------
+
+Please note that the rest of this document assumes that REE is installed into
+'/opt/ruby-enterprise'. If you installed REE into a different directory then just
+replace '/opt/ruby-enterprise' with whatever the real prefix is.
+
+==== Step 3: Install tcmalloc
+Tcmalloc is a memory allocator which is usually more efficient than the
+platform's native memory allocator. REE doesn't require tcmalloc, but it will
+work better if tcmalloc is installed.
+
+Compile tcmalloc as follows:
+
+--------------------------
+cd ruby-enterprise-x.x.x/source/vendor/google-perftools-*
+./configure --prefix=$PREFIX --disable-dependency-tracking
+make libtcmalloc_minimal.la
+--------------------------
+
+If compilation fails, then skip to step 3. REE will work fine without tcmalloc.
+
+After compilation, install tcmalloc as follows:
+
+--------------------------
+sudo mkdir -p $PREFIX/lib
+sudo rm -f $PREFIX/lib/libtcmalloc_minimal*.so*
+sudo cp -Rpf .libs/libtcmalloc_minimal*.so* $PREFIX/lib/
+--------------------------
+
+.MacOS X note
+NOTE: Instead of typing 'libtcmalloc_minimal*.so*', type
+ 'libtcmalloc_minimal*.bundle*'.
+
+NOTE: The reason why we don't instruct you to type 'make' and 'make install'
+ is because compiling tcmalloc with 'make' usually doesn't work on 64-bit
+ platforms. The above instructions are a little bit more complex, but they
+ work on all platforms where tcmalloc is supported.
+
+==== Step 4: Configure REE
+
+Change the current working directory to 'ruby-enterprise-x.x.x/source'. If
+you were previously in the google-perftools directory, then type:
+
+--------------------------
+cd ../..
+--------------------------
+
+Run the configure script:
+
+--------------------------
+./configure --prefix=$PREFIX
+--------------------------
+
+==== Step 5: Compiling and installing the system_allocator library (MacOS X only)
+
+If you are on MacOS X, then compile and install the 'system_allocator' library:
+
+--------------------------
+gcc -dynamiclib system_allocator.c -install_name @rpath/libsystem_allocator.dylib -o libsystem_allocator.dylib
+sudo install libsystem_allocator.dylib $PREFIX/lib/
+--------------------------
+
+==== Step 6: compiling and installing REE
+
+Open 'Makefile'. Search for a line which starts with:
+
+--------------------------
+LIBS =
+--------------------------
+
+Append the string '$(PRELIBS)' to the part after the '=' sign. For example,
+on Ubuntu 8.04, the 'LIBS = ' line becomes:
+
+--------------------------
+LIBS = $(PRELIBS) -ldl -lcrypt -lm $(EXTLIBS)
+--------------------------
+
+Save the file. Now we can proceed with compiling REE:
+
+--------------------------
+make PRELIBS="-Wl,-rpath,$PREFIX/lib -L$PREFIX/lib -ltcmalloc_minimal"
+--------------------------
+
+Notes:
+
+1. If you did not install tcmalloc, then you can omit the '-ltcmalloc_minimal'
+ part.
+2. If you are on MacOS X, then you need to append '-lsystem_allocator' to the
+ 'PRELIBS' option.
+
+Now that REE has been compiled, install it with:
+
+--------------------------
+sudo make install
+--------------------------
+
+
+=== RubyCocoa compatibility and `--enable-shared`
+
+In order to use RubyCocoa, the Ruby interpreter must be compiled with
+`--enable-shared`. By default, Ruby Enterprise Edition's interpreter is not compiled
+with `--enable-shared`. You can compile the Ruby Enterprise Edition interpreter
+with this flag by passing `-c --enable-shared` to its installer, like this:
+
+---------------------------------------------------------
+./ruby-enterprise-X.X.X/installer -c --enable-shared
+---------------------------------------------------------
+
+Please note that enabling `--enable-shared` will make the Ruby interpreter about
+20% slower. It is for this reason that we don't recommend enabling `--enable-shared`
+on server environments, although it's fine for desktop environments.
+
+=== Tcl/Tk compatibility and `--enable-pthread`
+
+In order to use Tcl/Tk with threading support, the Ruby interpreter must be compiled
+with `--enable-pthread`. By default, Ruby Enterprise Edition's interpreter is not
+compiled with `--enable-pthread`. You can compile the Ruby Enterprise Edition
+interpreter with this flag by passing `-c --enable-pthread` to its installer,
+like this:
+
+---------------------------------------------------------
+./ruby-enterprise-X.X.X/installer -c --enable-pthread
+---------------------------------------------------------
+
+Please note that enabling `--enable-pthread` will make the Ruby interpreter about
+50% slower. It is for this reason that we don't recommend enabling `--enable-shared`
+on server environments, although it's fine for desktop environments.
+
+=== Support for continuations and `--enable-continuations`
+
+The zero-threading context switching functionality that's included in REE is incompatible
+with continuations support. Continuations are therefore disabled by default in REE. If
+you really need continuations then you can enable support for continuations by passing
+`--enable-continuations` to the installer, like this:
+
+---------------------------------------------------------
+./ruby-enterprise-X.X.X/installer --enable-continuations
+---------------------------------------------------------
+
+Please note that doing so will result in slower threading.
+
+
+=== How REE installs itself into the system
+By default, REE installs itself into a directory in '/opt'. If you already had a
+Ruby interpreter installed (typically in '/usr'; let's call this 'the system Ruby
+interpreter'), then REE will have no effect on it: REE lives in isolation and in
+parallel to the system Ruby interpreter. This also means that:
+
+- If you have any software which depends on the system Ruby interpreter, then
+ that software will not break. It will continue to work like before.
+- REE has its own set of Ruby libraries, and its own set of gems and its own
+ set of commands. If you install a new gem using the system Ruby interpreter,
+ then that gem will not show up in REE's gem list, and vice versa.
+- When running Ruby programs, the system Ruby interpreter will be used unless
+ you explicitly configures the system to use REE by default.
+
+==== Why doesn't REE use the system Ruby interpreter's gems?
+REE does not use the system Ruby interpreter's gems because it can cause
+problems with native extensions, e.g. RMagick, Mongrel, Hpricot, etc. A native
+extension compiled for one Ruby installation might crash when used in a
+different Ruby installation. This is why you must reinstall your gems in
+REE.
+
+=== Upgrading
+To upgrade REE through the Debian package, just install the Debian package.
+
+To upgrade REE through the source tarball, run the installer in the source
+tarball and specify the same destination prefix directory that REE is currently
+installed in. For example, if REE is currently installed in
+'/opt/ruby-enterprise-20081215', then specify '/opt/ruby-enterprise-20081215'
+in the upgrade source tarball's installer.
+
+=== Uninstallation
+If you installed REE through a Debian package, then uninstall the Debian package
+with 'dpkg' or with 'apt-get'.
+
+If you installed REE through the source tarball, then you can uninstall it by
+deleting the directory in which REE is installed. For example, if REE was
+installed to '/opt/ruby-enterprise-X.X.X' (the default), then just delete that
+directory. It is for this reason why we recommend installing REE into its own
+directory.
+
+
+== Using Ruby Enterprise Edition
+
+=== General usage
+Normally one would run a Ruby program by invoking the Ruby interpreter with a
+source file as its first argument:
+
+--------------------------
+$ ruby some_program.rb
+--------------------------
+
+To run the same program in REE, invoke the equivalent command in REE's
+'bin' folder:
+
+--------------------------------------------------------
+$ /opt/ruby-enterprise-X.X.X/bin/ruby some_program.rb
+--------------------------------------------------------
+
+The same applies to other Ruby commands such as 'gem', 'irb' and
+'rake'. For example, if you want to install Ruby on Rails for REE, invoke:
+
+--------------------------------------------------------
+$ /opt/ruby-enterprise-X.X.X/bin/gem install rails
+--------------------------------------------------------
+
+=== Using REE with Phusion Passenger
+To use REE in combination with Phusion Passenger, you must run the Passenger
+Apache 2 module installer that's associated with REE. The REE installer installs
+the Passenger gem by default, so you just have to run the Passenger Apache 2
+module installer:
+
+-------------------------------------------------
+/opt/ruby-enterprise-X.X.X/bin/passenger-install-apache2-module
+-------------------------------------------------
+
+Then follow the instructions that the installer gives you.
+
+=== Configuring REE as the default Ruby interpreter
+It is possible to configure REE as the default Ruby interpreter, so that when
+you type 'ruby', 'gem', 'irb', 'rake' or other Ruby commands, REE's version is
+invoked instead of the system Ruby's version.
+
+To do this, you must add REE's 'bin' directory to the beginning of the `PATH`
+environment variable. This environment variable specifies the command shell's
+command search path. For example, you can do this on the command-line:
+
+-------------------------------------
+$ ruby some_program.rb # <--- some_program.rb is being run
+ # in the system Ruby interpreter.
+
+$ export PATH=/opt/ruby-enterprise-X.X.X/bin:$PATH
+$ ruby some_program.rb # <--- some_program.rb will now be run in REE!
+-------------------------------------
+
+Invoking `export PATH=...` on the command-line has no permanent effect: its
+effects disappear as soon as you exit the shell. To make the effect permanent,
+add an entry to the file `/etc/environment` instead. On Ubuntu Linux,
+`/etc/environment` looks like this:
+
+-------------------------------------
+PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games"
+LANG="en_US.UTF-8"
+LANGUAGE="en_US:en"
+-------------------------------------
+
+Add REE's 'bin' directory to the PATH environment variable, like this:
+
+-------------------------------------
+PATH="/opt/ruby-enterprise-x.x.x/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games"
+LANG="en_US.UTF-8"
+LANGUAGE="en_US:en"
+-------------------------------------
+
+
+== Garbage collector and object space
+
+=== Copy-on-write friendliness
+By default, REE's garbage collector is not copy-on-write-friendly, just like
+a stock Ruby interpreter. Copy-on-write-friendliness can be turned on during
+runtime by calling:
+
+[source, ruby]
+-----------------------------------------------
+GC.copy_on_write_friendly = true
+-----------------------------------------------
+
+Note that Phusion Passenger automatically turns on the copy-on-write-friendly
+mode whenever it detects that it's running in REE.
+
+With the following method, one can check whether the garbage collector is in
+copy-on-write-friendly mode:
+
+[source, ruby]
+-----------------------------------------------
+GC.copy_on_write_friendly?
+-----------------------------------------------
+
+=== Garbage collector performance tuning
+Ruby's garbage collector tries to adapt memory usage to the amount of memory
+used by the program by dynamically growing or shrinking the allocated heap as
+it sees fit. For long running server applications, this approach isn't always
+the most efficient one. The performance very much depends on the ratio
+`heap_size / program_size`. It behaves somewhat erratic: adding code can
+actually make your program run faster.
+
+With REE, one can tune the garbage collector's behavior for better server
+performance. It is possible to specify the initial heap size to start with.
+The heap size will never drop below the initial size. By carefully selecting
+the initial heap size one can decrease startup time and increase throughput
+of server applications.
+
+Garbage collector behavior is controlled through the following environment
+variables. These environment variables must be set prior to invoking the Ruby
+interpreter.
+
+*`RUBY_HEAP_MIN_SLOTS`*::
+ This specifies the initial number of heap slots. The default is '10000'.
+
+*`RUBY_HEAP_SLOTS_INCREMENT`*::
+ The number of additional heap slots to allocate when Ruby needs to
+ allocate new heap slots for the first time. The default is '10000'.
++
+For example, suppose that the default GC settings are in effect, and 10000 Ruby
+objects exist on the heap (= 10000 used heap slots). When the program creates
+another object, Ruby will allocate a new heap with 10000 heap slots in it.
+There are now 20000 heap slots in total, of which 10001 are used and 9999 are
+unused.
+
+*`RUBY_HEAP_SLOTS_GROWTH_FACTOR`*::
+ Multiplicator used for calculating the number of new heaps slots to
+ allocate next time Ruby needs new heap slots. The default is '1.8'.
++
+Take the program in the last example. Suppose that the program creates 10000
+more objects. Upon creating the 10000th object, Ruby needs to allocate another
+heap. This heap will have `10000 * 1.8 = 18000` heap slots. There are now
+`20000 + 18000 = 38000` heap slots in total, of which 20001 are used and
+17999 are unused.
++
+The next time Ruby needs to allocate a new heap, that heap will have
+`18000 * 1.8 = 32400` heap slots.
+
+*`RUBY_GC_MALLOC_LIMIT`*::
+ The amount of C data structures which can be allocated without
+ triggering a garbage collection. If this is set too low, then the
+ garbage collector will be started even if there are empty heap slots
+ available. The default value is '8000000'.
+
+*`RUBY_HEAP_FREE_MIN`*::
+ The number of heap slots that should be available after a garbage
+ collector run. If fewer heap slots are available, then Ruby will
+ allocate a new heap according to the `RUBY_HEAP_SLOTS_INCREMENT` and
+ `RUBY_HEAP_SLOTS_GROWTH_FACTOR` parameters. The default value is '4096'.
+
+The best settings varies from application to application. You should try
+experimenting with the values.
+
+link:http://www.37signals.com[37signals] uses the following settings in production:
+
+----------------------------------
+RUBY_HEAP_MIN_SLOTS=600000
+RUBY_GC_MALLOC_LIMIT=59000000
+RUBY_HEAP_FREE_MIN=100000
+----------------------------------
+
+link:http://www.twitter.com[Twitter] uses the following settings in production:
+
+----------------------------------
+RUBY_HEAP_MIN_SLOTS=500000
+RUBY_HEAP_SLOTS_INCREMENT=250000
+RUBY_HEAP_SLOTS_GROWTH_FACTOR=1
+RUBY_GC_MALLOC_LIMIT=50000000
+----------------------------------
+
+Twitter's settings mean:
+
+ * Start with enough memory to hold the application (Ruby's default is very low,
+ lower than what a Rails application typically needs).
+ * Increase it linearly if you need more (Ruby's default is exponential increase).
+ * Only garbage-collect every 50 million `malloc` calls (Ruby's default is 6x smaller).
+
+Twitter link:http://blog.evanweaver.com/articles/2009/04/09/ruby-gc-tuning/[claims]
+that these settings give them about 20% to 40% average performance improvement,
+at the cost of slightly higher peak memory usage.
+
+=== Garbage collector statistics
+One can inspect various garbage collector statistics by calling certain methods.
+Statistics collection is disabled by default, so before one can obtain the
+statistics, statistics collection must be enabled by calling:
+
+[source,ruby]
+--------------------------
+GC.enable_stats
+--------------------------
+
+There's a very minor performance penalty when statistics collection is enabled.
+Statistics collection can be disabled by calling:
+
+[source,ruby]
+--------------------------
+GC.disable_stats
+--------------------------
+
+The following methods are available for obtaining the collected statistics
+information:
+
+*`GC.collections`*::
+ Returns the number of garbage collections that have been performed
+ since GC statistics collection was enabled.
++
+[source, ruby]
+----------------------------
+GC.enable_stats
+do_something
+GC.collections # => 20
+----------------------------
+
+*`GC.time`*::
+ Returns the total amount of time that has been spent on garbage
+ collection since GC statistics collection was enabled, in microseconds.
++
+[source, ruby]
+----------------------------
+GC.enable_stats
+do_something
+GC.time # => 3000000
+----------------------------
+
+*`GC.growth`*::
+ Returns the number of bytes that have been allocated since the last
+ garbage collection run.
+
+*`GC.dump`*::
+ Dumps information about the current GC data structures to the GC
+ log file, to `stderr` if no GC log file is specified. One can specify
+ the GC log file in the `RUBY_GC_DATA_FILE` environment variable, which
+ must be set before starting the Ruby interpreter.
++
+At this moment, the only thing that this method does is printing the size of
+each Ruby heap.
+
+The collected statistics information can be cleared by calling:
+
+[source,ruby]
+--------------------------
+GC.clear_stats
+--------------------------
+
+
+=== Memory allocation and object heap statistics
+One can obtain various statistics about object allocation. Some of the
+statistics methods listed here require one to explicitly enable statistics
+collection, just like the garbage collection statistics methods.
+
+The following methods are available:
+
+*`GC.allocated_size`*::
+ Returns the amount of memory (in bytes) that has been allocated since
+ GC statistics collection was enabled. This is the total amount of bytes
+ that has been passed to the C function `ruby_xmalloc()` so far.
++
+[source, ruby]
+--------------------------------
+GC.allocated_size #=> 4070
+--------------------------------
+
+*`GC.num_allocations`*::
+ Returns the number of memory allocation requests that have been
+ performed since GC statistics collection was enabled. This is the
+ number of times that the C function `ruby_xmalloc()` has been called.
++
+[source, ruby]
+--------------------------------
+GC.num_allocations #=> 4070
+--------------------------------
+
+*`ObjectSpace.live_objects`*::
+ Returns the number of objects that are currently allocated in the
+ system. This value usually goes down after the garbage collector runs.
+ This method does not require one to enable statistics collection.
++
+[source, ruby]
+--------------------------------
+ObjectSpace.live_objects #=> 30873
+--------------------------------
+
+*`ObjectSpace.allocated_objects`*::
+ Returns the number of objects that have been allocated since the Ruby
+ interpreter started. This number can only increase. To know how many
+ objects are currently allocated, use `ObjectSpace.live_objects` instead.
++
+[source, ruby]
+--------------------------------
+ObjectSpace.allocated_objects #=> 33266
+--------------------------------
+
+
+== Obtaining the backtrace of all threads
+The method `caller_for_all_threads` returns a Hash which maps each currently
+running thread to the thread's backtrace. A backtrace is an array of strings,
+in the same format as the return value of the method `caller`. For example,
+consider the following program `test.rb`:
+
+[source, ruby]
+---------------------------------
+require 'thread'
+require 'pp'
+
+def foo
+ bar
+end
+
+def bar
+ sleep 10
+end
+
+thread1 = Thread.new do
+ foo
+end
+
+thread2 = Thread.new do
+ STDIN.readline
+end
+
+# Give other threads some chance to run.
+sleep 0.1
+
+pp caller_for_all_threads
+---------------------------------
+
+This program will print:
+
+---------------------------------
+{#<Thread:0x8261954 sleep>=>
+ ["test.rb:9:in `bar'",
+ "test.rb:5:in `foo'",
+ "test.rb:13",
+ "test.rb:12:in `initialize'",
+ "test.rb:12:in `new'",
+ "test.rb:12"],
+ #<Thread:0x81986a8 run>=>["test.rb:23"],
+ #<Thread:0x82618c8 sleep>=>
+ ["test.rb:17",
+ "test.rb:16:in `initialize'",
+ "test.rb:16:in `new'",
+ "test.rb:16"]}
+---------------------------------
+
+=== Phusion Passenger integration
+`caller_for_all_threads` support is integrated into Phusion Passenger version 2.1
+(which at the time of writing hasn't been released yet). Upon sending a 'SIGQUIT'
+signal to a Phusion Passenger backend process, it will print the backtrace of
+all threads to the Apache error log. This feature is also documented in the
+Phusion Passenger users guide.
+
+
+== Obtaining the source filename and line of arbitrary methods and blocks
+All Method and Proc objects provide the `__file__` and `__line__` methods for
+obtaining the source filename and line on which said method or proc was defined.
+This is extremely useful for debugging applications or frameworks that rely on
+heavily on meta-programming.
+
+For example, consider a Ruby on Rails application which has a User model. The
+`users` database table has a `username` field, so ActiveRecord automatically
+generates a `username` method for the User class. By calling `__file__` and
+`__line__` one can see where in the ActiveRecord source code the method is
+defined:
+
+-------------------------------
+>> method = User.new.method(:username)
+=> #<Method: User#username>
+>> method.__file__
+=> "/opt/ruby-enterprise/lib/ruby/gems/1.8/gems/activerecord-2.3.2/lib/active_record/attribute_methods.rb"
+>> method.__line__
+=> 211
+-------------------------------
+
+A simpler example that doesn't involve Ruby on Rails:
+
+[source, ruby]
+-------------------------------
+# foo.rb
+
+class Foo
+ def foo
+ end
+end
+
+foo = Foo.new
+
+method = foo.method(:foo)
+method.__file__ # => foo.rb
+method.__line__ # => 4
+-------------------------------
View
2 distro/google-perftools-1.3/AUTHORS
@@ -0,0 +1,2 @@
+opensource@google.com
+
View
28 distro/google-perftools-1.3/COPYING
@@ -0,0 +1,28 @@
+Copyright (c) 2005, Google Inc.
+All rights reserved.
+
+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
+in the documentation and/or other materials provided with the
+distribution.
+ * Neither the name of Google Inc. nor the names of its
+contributors may be used to endorse or promote products derived from
+this software without specific prior written permission.
+
+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.
View
357 distro/google-perftools-1.3/ChangeLog
@@ -0,0 +1,357 @@
+Tue Jun 9 18:19:06 2009 Google Inc. <opensource@google.com>
+
+ * google-perftools: version 1.3 release
+ * Provide our own name for memory functions: tc_malloc, etc (csilvers)
+ * Weaken memory-alloc functions so user can override them (csilvers)
+ * Remove meaningless delete(nothrow) and delete[](nothrow) (csilvers)
+ * BUILD: replace clever libtcmalloc/profiler.a with a new .a (csilvers)
+ * PORTING: improve windows port by using google spinlocks (csilvers)
+ * PORTING: Fix RedHat 9 memory allocation in heapchecker (csilvers)
+ * PORTING: Rename OS_WINDOWS macro to PLATFORM_WINDOWS (mbelshe)
+ * PORTING/BUGFIX: Make sure we don't clobber GetLastError (mbelshe)
+ * BUGFIX: get rid of useless data for callgrind (weidenrinde)
+ * BUGFIX: Modify windows patching to deadlock sometimes (csilvers)
+ * BUGFIX: an improved fix for hook handling during fork (csilvers)
+ * BUGFIX: revamp profiler_unittest.sh, which was very broken (csilvers)
+
+Fri Apr 17 16:40:48 2009 Google Inc. <opensource@google.com>
+
+ * google-perftools: version 1.2 release
+ * Allow large_alloc_threshold=0 to turn it off entirely (csilvers)
+ * Die more helpfully when out of memory for internal data (csilvers)
+ * Refactor profile-data gathering, add a new unittest (cgd, nabeelmian)
+ * BUGFIX: fix rounding errors with static thread-size caches (addi)
+ * BUGFIX: disable hooks better when forking in leak-checker (csilvers)
+ * BUGFIX: fix realloc of crt pointers on windows (csilvers)
+ * BUGFIX: do a better job of finding binaries in .sh tests (csilvers)
+ * WINDOWS: allow overriding malloc/etc instead of patching (mbelshe)
+ * PORTING: fix compilation error in a ppc-specific file (csilvers)
+ * PORTING: deal with quirks in cygwin's /proc/self/maps (csilvers)
+ * PORTING: use 'A' version of functions for ascii input (mbelshe)
+ * PORTING: generate .so's on cygwin and mingw (ajenjo)
+ * PORTING: disable profiler methods on cygwin (jperkins)
+ * Updated autoconf version to 2.61 and libtool version to 1.5.26
+
+Wed Mar 11 11:25:34 2009 Google Inc. <opensource@google.com>
+
+ * google-perftools: version 1.1 release
+ * Dynamically resize thread caches -- nice perf. improvement (kash)
+ * Add VDSO support to give better stacktraces in linux (ppluzhnikov)
+ * Improve heap-profiling sampling algorithm (ford)
+ * Rewrite leak-checking code: should be faster and more robust (sanjay)
+ * Use ps2 instead of ps for dot: better page cropping for gv (csilvers)
+ * Disable malloc-failure warning messages by default (csilvers)
+ * Update config/Makefile to disable tests on a per-OS basis (csilvers)
+ * PORTING: Get perftools compiling under MSVC 7.1 again (csilvers)
+ * PORTING: Get perftools compiling under cygwin again (csilvers)
+ * PORTING: automatically set library flags for solaris x86 (csilvers)
+ * Add TCMALLOC_SKIP_SBRK to mirror TCMALLOC_SKIP_MMAP (csilvers)
+ * Add --enable flags to allow selective building (csilvers)
+ * Put addr2line-pdb and nm-pdb in proper output directory (csilvers)
+ * Remove deprecated DisableChecksIn (sanjay)
+ * DOCUMENTATION: Document most MallocExtension routines (csilvers)
+
+Tue Jan 6 13:58:56 2009 Google Inc. <opensource@google.com>
+
+ * google-perftools: version 1.0 release
+ * Exactly the same as 1.0rc2
+
+Sun Dec 14 17:10:35 2008 Google Inc. <opensource@google.com>
+
+ * google-perftools: version 1.0rc2 release
+ * Fix compile error on 64-bit systems (casting ptr to int) (csilvers)
+
+Thu Dec 11 16:01:32 2008 Google Inc. <opensource@google.com>
+
+ * google-perftools: version 1.0rc1 release
+ * Replace API for selectively disabling heap-checker in code (sanjay)
+ * Add a pre-mmap hook (daven, adlr)
+ * Add MallocExtension interface to set memory-releasing rate (fikes)
+ * Augment pprof to allow any string ending in /pprof/profile (csilvers)
+ * PORTING: Rewrite -- and fix -- malloc patching for windows (dvitek)
+ * PORTING: Add nm-pdb and addr2line-pdb for use by pprof (dvitek)
+ * PORTING: Improve cygwin and mingw support (jperkins, csilvers)
+ * PORTING: Fix pprof for mac os x, other pprof improvements (csilvers)
+ * PORTING: Fix some PPC bugs in our locking code (anton.blanchard)
+ * A new unittest, smapling_test, to verify tcmalloc-profiles (csilvers)
+ * Turn off TLS for gcc < 4.1.2, due to a TLS + -fPIC bug (csilvers)
+ * Prefer __builtin_frame_address to assembly for stacktraces (nlewycky)
+ * Separate tcmalloc.cc out into multiple files -- finally! (kash)
+ * Make our locking code work with -fPIC on 32-bit x86 (aruns)
+ * Fix an initialization-ordering bug for tcmalloc/profiling (csilvers)
+ * Use "initial exec" model of TLS to speed up tcmalloc (csilvers)
+ * Enforce 16-byte alignment for tcmalloc, for SSE (sanjay)
+
+Tue Sep 23 08:56:31 2008 Google Inc. <opensource@google.com>
+
+ * google-perftools: version 0.99.2 release
+ * COMPILE FIX: add #include needed for FreeBSD and OS X (csilvers)
+
+Sat Sep 20 09:37:18 2008 Google Inc. <opensource@google.com>
+
+ * google-perftools: version 0.99.1 release
+ * BUG FIX: look for nm, etc in /usr/bin, not /usr/crosstool (csilvers)
+
+Thu Sep 18 16:00:27 2008 Google Inc. <opensource@google.com>
+
+ * google-perftools: version 0.99 release
+ * Add IsHeapProfileRunning (csilvers)
+ * Add C shims for some of the C++ header files (csilvers)
+ * Fix heap profile file clean-up logic (maxim)
+ * Rename linuxthreads.c to .cc for better compiler support (csilvers)
+ * Add source info to disassembly in pprof (sanjay)
+ * Use open instead of fopen to avoid memory alloc (csilvers)
+ * Disable malloc extensions when running under valgrind (kcc)
+ * BUG FIX: Fix out-of-bound error by reordering a check (larryz)
+ * Add Options struct to ProfileData (cgd)
+ * Correct PC-handling of --base in pprof (csilvers)
+ * Handle 1 function occurring twice in an image (sanjay)
+ * Improve stack-data cleaning (maxim)
+ * Use 'struct Foo' to make header C compatible (csilvers)
+ * Add 'total' line to pprof --text (csilvers)
+ * Pre-allocate buffer for heap-profiler to avoid OOM errors (csilvers)
+ * Allow a few more env-settings to control tcmalloc (csilvers)
+ * Document some of the issues involving thread-local storage (csilvers)
+ * BUG FIX: Define strtoll and friends for windows (csilvers)
+
+Mon Jun 9 16:47:03 2008 Google Inc. <opensource@google.com>
+
+ * google-perftools: version 0.98 release
+ * Add ProfilerStartWithOptions() (cgd)
+ * Change tcmalloc_minimal to not do any stack-tracing at all (csilvers)
+ * Prefer mmap to sbrk for 64-buit debug mode (sanjay)
+ * Fix accounting for some tcmalloc stats (sanjay)
+ * Use setrlimit() to keep unittests from killing the machine (odo)
+ * Fix a bug when sbrk-ing near address 4G (csilvers)
+ * Make MallocHook thread-safe (jyasskin)
+ * Fix windows build for MemoryBarrier (jyasskin)
+ * Fix CPU-profiler docs to mention correct libs (csilvers)
+ * Fix for GetHeapProfile() when heap-profiling is off (maxim)
+ * Avoid realloc resizing ping-pongs using hysteresis (csilvers)
+ * Add --callgrind output support to pprof (klimek)
+ * Fix profiler.h and heap-profiler.h to be C-compatible (csilvers)
+ * Break malloc_hook.h into two parts to reduce dependencies (csilvers)
+ * Better handle systems that don't implement mmap (csilvers)
+ * PORTING: disable system_alloc_unittest for msvc (csilvers)
+ * PORTING: Makefile tweaks to build better on cygwin (csilvers)
+
+Mon Apr 21 15:20:52 2008 Google Inc. <opensource@google.com>
+
+ * google-perftools: version 0.97 release
+ * Refactor GetHeapProfile to avoid using malloc (maxim)
+ * Fix heap-checker and heap-profiler hook interactions (maxim)
+ * Fix a data race in MemoryRegionMap::Lock (jyasskin)
+ * Improve thread-safety of leak checker (maxim)
+ * Fix mmap profile to no longer deadlock (maxim)
+ * Fix rpm to have devel package depend on non-devel (csilvers)
+ * PORTING: Fix clock-speed detection for Mac OS X (csilvers)
+
+Tue Mar 18 14:30:44 2008 Google Inc. <opensource@google.com>
+
+ * google-perftools: version 0.96 release
+ * major atomicops rewrite; fixed atomic ops code for linux/ppc (vchen)
+ * nix the stacktrace library; now build structure is simpler (csilvers)
+ * Speed up heap-checker, and reduce extraneous logging (maxim)
+ * Improve itimer code for NPTL case (cgd)
+ * Add source code annotations for use by valgrind, etc (kcc)
+ * PORTING: Fix high resolution timers for Mac OS X (adlr)
+
+Tue Feb 19 12:01:31 2008 Google Inc. <opensource@google.com>
+
+ * google-perftools: version 0.95.1 release (bugfix release)
+ * x86_64 compile-fix: nix pread64 and pwrite64 (csilvers)
+ * more heap-checker debug logging (maxim)
+ * minor improvement to x86_64 CycleClock (gpike)
+
+Tue Feb 12 12:28:32 2008 Google Inc. <opensource@google.com>
+
+ * google-perftools: version 0.95 release
+ * Better -- not perfect -- support for linux-ppc (csilvers)
+ * Fix race condition in libunwind stacktrace (aruns)
+ * Speed up x86 spinlock locking (m3b)
+ * Improve heap-checker performance (maxim)
+ * Heap checker traverses more ptrs inside heap-alloced objects (maxim)
+ * Remove deprecated ProfilerThreadState function (cgd)
+ * Update libunwind documentation for statically linked binaries (aruns)
+
+Mon Dec 3 23:51:54 2007 Google Inc. <opensource@google.com>
+
+ * google-perftools: version 0.94.1 release (bugfix release)
+ * Fix missing #includes for x86_64 compile using libunwind (csilvers)
+
+Thu Nov 29 07:59:43 2007 Google Inc. <opensource@google.com>
+
+ * google-perftools: version 0.94 release
+ * PORTING: MinGW/Msys support -- runs same code as MSVC does (csilvers)
+ * PORTING: Add NumCPUs support for Mac OS X (csilvers)
+ * Work around a sscanf bug in glibc(?) (waldemar)
+ * Fix Windows MSVC bug triggered by thread deletion (csilvers)
+ * Fix bug that triggers in MSVC /O2: missing volatile (gpike)
+ * March-of-time support: quiet warnings/errors for gcc 4.2, OS X 10.5
+ * Modify pprof so it works without nm: useful for windows (csilvers)
+ * pprof: Support filtering for CPU profiles (cgd)
+ * Bugfix: have realloc report to hooks in all situations (maxim)
+ * Speed improvement: replace slow memcpy with std::copy (soren)
+ * Speed: better iterator efficiency in RecordRegionRemoval (soren)
+ * Speed: minor speed improvements via better bitfield alignment (gpike)
+ * Documentation: add documentation of binary profile output (cgd)
+
+Fri Aug 17 12:32:56 2007 Google Inc. <opensource@google.com>
+
+ * google-perftools: version 0.93 release
+ * PORTING: everything compiles on Solaris, OS X, FreeBSD (see INSTALL)
+ * PORTING: cpu-profiler works on most platforms (much better GetPC())
+ * PORTING: heap-profiler works on most platforms
+ * PORTING: improved windows support, including release builds
+ * No longer build or run ptmalloc tests by default
+ * Add support for using memfs filesystem to allocate memory in linux
+ * WINDOWS: give debug library and release library different names
+
+Tue Jul 17 22:26:27 2007 Google Inc. <opensource@google.com>
+
+ * google-perftools: version 0.92 release
+ * PERFORMANCE: use a packed cache to speed up tcmalloc
+ * PORTING: preliminary windows support! (see README.windows)
+ * PORTING: better support for solaris, OS X, FreeBSD (see INSTALL)
+ * Envvar support for running the heap-checker under gdb
+ * Add weak declarations to maybe_threads to fix no-pthreads compile bugs
+ * Some 64bit fixes, especially with pprof
+ * Better heap-checker support for some low-level allocations
+ * Fix bug where heap-profiles would sometimes get truncated
+ * New documentation about how to handle common heap leak situations
+ * Use computed includes for hash_map/set: easier config
+ * Added all used .m4 templates to the distribution
+
+Wed Apr 18 16:43:55 2007 Google Inc. <opensource@google.com>
+
+ * google-perftools: version 0.91 release
+ * Brown-paper-bag bugfix: compilation error on some x86-64 machines
+
+Fri Apr 13 14:50:51 2007 Google Inc. <opensource@google.com>
+
+ * google-perftools: version 0.90 release
+ * (As the version-number jump hints, this is a major new release:
+ almost every piece of functionality was rewritten. I can't do
+ justice to all the changes, but will concentrate on highlights.)
+ *** USER-VISIBLE CHANGES:
+ * Ability to "release" unused memory added to tcmalloc
+ * Exposed more tweaking knobs via environment variables (see docs)
+ * pprof tries harder to map addresses to functions
+ * tcmalloc_minimal compiles and runs on FreeBSD 6.0 and Solaris 10
+ *** INTERNAL CHANGES:
+ * Much better 64-bit support
+ * Better multiple-processor support (e.g. multicore contention tweaks)
+ * Support for recent kernel ABI changes (e.g. new arg to mremap)
+ * Addition of spinlocks to tcmalloc to reduce contention cost
+ * Speed up tcmalloc by using __thread on systems that support TLS
+ * Total redesign of heap-checker to improve liveness checking
+ * More portable stack-frame analysis -- no more hard-coded constants!
+ * Disentangled heap-profiler code and heap-checker code
+ * Several new unittests to test, e.g., thread-contention costs
+ * Lots of small (but important!) bug fixes: e.g., fixing GetPC on amd64
+ *** KNOWN PROBLEMS:
+ * CPU-profiling may crash on x86_64 (64-bit) systems. See the README
+ * Profiling/heap-checking may deadlock on x86_64 systems. See README
+
+Wed Jun 14 15:11:14 2006 Google Inc. <opensource@google.com>
+
+ * google-perftools: version 0.8 release
+ * Experimental support for remote profiling added to pprof (many)
+ * Fixed race condition in ProfileData::FlushTable (etune)
+ * Better support for weird /proc maps (maxim, mec)
+ * Fix heap-checker interaction with gdb (markus)
+ * Better 64-bit support in pprof (aruns)
+ * Reduce scavenging cost in tcmalloc by capping NumMoveSize (sanjay)
+ * Cast syscall(SYS_mmap); works on more 64-bit systems now (menage)
+ * Document the text output of pprof! (csilvers)
+ * Better compiler support for no-THREADS and for old compilers (csilvers)
+ * Make libunwind the default stack unwinder for x86-64 (aruns)
+ * Somehow the COPYING file got erased. Regenerate it (csilvers)
+
+Thu Apr 13 20:59:09 2006 Google Inc. <opensource@google.com>
+
+ * google-perftools: version 0.7 release
+ * Major rewrite of thread introspection for new kernels (markus)
+ * Major rewrite of heap-checker to use new thread tools (maxim)
+ * Add proper support for following data in thread registers (maxim)
+ * Syscall support for older kernels, including _syscall6 (markus)
+ * Support PIC mode (markus, mbland, iant)
+ * Better support for running in non-threaded contexts (csilvers)
+
+Fri Jan 27 14:04:27 2006 Google Inc. <opensource@google.com>
+
+ * google-perftools: version 0.6 release
+ * More sophisticated stacktrace usage, possibly using libunwind (aruns)
+ * Update pprof to handle 64-bit profiles (dehnert)
+ * Fix GetStackTrace to correctly return top stackframe (sanjay)
+ * Add ANSI compliance for new and new[], including new_handler (jkearney)
+ * More accuracy by reading ELF files directly rather than objdump (mec)
+ * Add readline support for pprof (addi)
+ * Add #includes for PPC (csilvers)
+ * New PC-detection routine for ibook powerpc (asbestoshead)
+ * Vastly improved tcmalloc unittest (csilvers)
+ * Move documentation from /usr/doc to /usr/share/doc
+
+Mon Nov 14 17:28:59 2005 Google Inc. <opensource@google.com>
+
+ * google-perftools: version 0.5 release
+ * Add va_start/va_end calls around vsnprintf() (csilvers)
+ * Write our own __syscall_return(), since it's not defined
+ consistently on all 64-bit linux distros (markus)
+
+Wed Oct 26 15:19:16 2005 Google Inc. <opensource@google.com>
+
+ * google-perftools: version 0.4 release
+ * Decrease fragmentation in tcmalloc (lefevere)
+ * Support for ARM in some of the thread-specific code (markus)
+ * Turn off heap-checker for statically-linked binaries, which
+ cause error leak reports now (etune)
+ * Many pprof improvements, including a command-line interface (jeff)
+ * CPU profiling now automatically affects all threads in linux 2.6.
+ (Kernel bugs break CPU profiling and threads in linux 2.4 a bit.)
+ ProfilerEnable() and ProfilerDisable() are deprecated. (sanjay)
+ * tcmalloc now correctly intercepts memalign (m3b, maxim)
+ * Syntax fix: added missing va_end()s. Helps non-gcc compiling (etune)
+ * Fixed a few coredumper bugs: race condition after PTRACE_DETACH,
+ ignore non-aligned stackframe pointers (markus, menage)
+ * 64-bit cleanup, especially for spinlock code (etune) and mmap (sanjay)
+ * Better support for finding threads in linux (markus)
+ * tcmalloc now tracks those stack traces that allocate memory (sanjay)
+ * Work around a weird setspecific problem (sanjay)
+ * Fix tcmalloc overflow problems when an alloc is close to 2G/4G (sanjay)
+
+Fri Jun 24 18:02:26 2005 Google Inc. <opensource@google.com>
+
+ * google-perftools: version 0.3 release
+ * Add missing errno include for one of the unittests (csilvers)
+ * Reduce tcmalloc startup memory from 5M to 256K (sanjay)
+ * Add support for mallopt() and mallinfo (sanjay)
+ * Improve stacktrace's performance on some 64-bit systems (etune)
+ * Improve the stacktrace unittest (etune)
+
+Tue May 31 08:14:38 2005 Google Inc. <opensource@google.com>
+
+ * google-perftools: version 0.2 release
+ * Use mmap2() instead of mmap(), to map more memory (menage)
+ * Do correct pthread-local checking in heap-checker! (maxim)
+ * Avoid overflow on 64-bit machines in pprof (sanjay)
+ * Add a few more GetPC() functions, including for AMD (csilvers)
+ * Better method for overriding pthread functions (menage)
+ * (Hacky) fix to avoid overwriting profile files after fork() (csilvers)
+ * Crashing bugfix involving dumping heaps on small-stack threads (tudor)
+ * Allow library versions with letters at the end (csilvers)
+ * Config fixes for systems that don't define PATH_MAX (csilvers)
+ * Confix fixes so we no longer need config.h after install (csilvers)
+ * Fix to pprof to correctly read very big cpu profiles (csilvers)
+ * Fix to pprof to deal with new commandline flags in modern gv's
+ * Better error reporting when we can't access /proc/maps (etune)
+ * Get rid of the libc-preallocate code (which could crash on some
+ systems); no longer needed with local-threads fix (csilvers)
+
+Tue Feb 8 09:57:17 2005 Google Inc. <opensource@google.com>
+
+ * google-perftools: initial release:
+ The google-perftools package contains some utilities to improve
+ and analyze the performance of C++ programs. This includes an
+ optimized thread-caching malloc() and cpu and heap profiling
+ utilities.
View
468 distro/google-perftools-1.3/INSTALL
@@ -0,0 +1,468 @@
+Copyright 1994, 1995, 1996, 1999, 2000, 2001, 2002 Free Software
+Foundation, Inc.
+
+ This file is free documentation; the Free Software Foundation gives
+unlimited permission to copy, distribute and modify it.
+
+
+Perftools-Specific Install Notes
+================================
+
+*** NOTE FOR 64-BIT LINUX SYSTEMS
+
+The glibc built-in stack-unwinder on 64-bit systems has some problems
+with the perftools libraries. (In particular, the cpu/heap profiler
+may be in the middle of malloc, holding some malloc-related locks when
+they invoke the stack unwinder. The built-in stack unwinder may call
+malloc recursively, which may require the thread to acquire a lock it
+already holds: deadlock.)
+
+For that reason, if you use a 64-bit system, we strongly recommend you
+install libunwind before trying to configure or install google
+perftools. libunwind can be found at
+
+ http://download.savannah.gnu.org/releases/libunwind/libunwind-0.99-beta.tar.gz
+
+Even if you already have libunwind installed, you should check the
+version. Versions older than this will not work properly; too-new
+versions introduce new code that does not work well with perftools
+(because libunwind can call malloc, which will lead to deadlock).
+
+CAUTION: if you install libunwind from the url above, be aware that
+you may have trouble if you try to statically link your binary with
+perftools: that is, if you link with 'gcc -static -lgcc_eh ...'. This
+is because both libunwind and libgcc implement the same C++ exception
+handling APIs, but they implement them differently on some platforms.
+This is not likely to be a problem on ia64, but may be on x86-64.
+
+Also, if you link binaries statically, make sure that you add
+-Wl,--eh-frame-hdr to your linker options. This is required so that
+libunwind can find the information generated by the compiler required
+for stack unwinding.
+
+Using -static is rare, though, so unless you know this will affect you
+it probably won't.
+
+If you cannot or do not wish to install libunwind, you can still try
+to use the built-in stack unwinder. The built-in stack unwinder
+requires that your application, the tcmalloc library, and system
+libraries like libc, all be compiled with a frame pointer. This is
+*not* the default for x86-64.
+
+If you are on x86-64 system, know that you have a set of system
+libraries with frame-pointers enabled, and compile all your
+applications with -fno-omit-frame-pointer, then you can enable the
+built-in perftools stack unwinder by passing the
+--enable-frame-pointers flag to configure.
+
+Even with the use of libunwind, there are still known problems with
+stack unwinding on 64-bit systems, particularly x86-64. See the
+"64-BIT ISSUES" section in README.
+
+If you encounter problems, try compiling perftools with './configure
+--enable-frame-pointers'. Note you will need to compile your
+application with frame pointers (via 'gcc -fno-omit-frame-pointer
+...') in this case.
+
+
+*** NOTE FOR ___tls_get_addr ERROR
+
+When compiling perftools on some old systems, like RedHat 8, you may
+get an error like this:
+ ___tls_get_addr: symbol not found
+
+This means that you have a system where some parts are updated enough
+to support Thread Local Storage, but others are not. The perftools
+configure script can't always detect this kind of case, leading to
+that error. To fix it, just comment out the line
+ #define HAVE_TLS 1
+in your config.h file before building.
+
+
+*** TCMALLOC AND DLOPEN
+
+To improve performance, we use the "initial exec" model of Thread
+Local Storage in tcmalloc. The price for this is the library will not
+work correctly if it is loaded via dlopen(). This should not be a
+problem, since loading a malloc-replacement library via dlopen is
+asking for trouble in any case: some data will be allocated with one
+malloc, some with another. If, for some reason, you *do* need to use
+dlopen on tcmalloc, the easiest way is to use a version of tcmalloc
+with TLS turned off; see the ___tls_get_addr note above.
+
+
+*** COMPILING ON NON-LINUX SYSTEMS
+
+Perftools has been tested on the following systems:
+ FreeBSD 6.0 (x86)
+ Linux Fedora Core 3 (x86)
+ Linux Fedora Core 4 (x86)
+ Linux Fedora Core 5 (x86)
+ Linux Fedora Core 6 (x86)
+ Linux Ubuntu 6.06.1 (x86)
+ Linux Ubuntu 6.06.1 (x86_64)
+ Linux RedHat 9 (x86)
+ Linux Debian 4.0 (PPC)
+ Mac OS X 10.3.9 (Panther) (PowerPC)
+ Mac OS X 10.4.8 (Tiger) (PowerPC)
+ Mac OS X 10.4.8 (Tiger) (x86)
+ Mac OS X 10.5 (Leopard) (x86)
+ Solaris 10 (x86)
+ Windows XP, Visual Studio 2003 (VC++ 7) (x86)
+ Windows XP, Visual Studio 2005 (VC++ 8) (x86)
+ Windows XP, MinGW 5.1.3 (x86)
+ Windows XP, Cygwin 5.1 (x86)
+
+It works in its full generality on the Linux systems
+tested (though see 64-bit notes above). Portions of perftools work on
+the other systems. The basic memory-allocation library,
+tcmalloc_minimal, works on all systems. The cpu-profiler also works
+fairly widely. However, the heap-profiler and heap-checker are not
+yet as widely supported. In general, the 'configure' script will
+detect what OS you are building for, and only build the components
+that work on that OS.
+
+Note that tcmalloc_minimal is perfectly usable as a malloc/new
+replacement, so it is possible to use tcmalloc on all the systems
+above, by linking in libtcmalloc_minimal.
+
+** FreeBSD:
+
+ The following binaries build and run successfully (creating
+ libtcmalloc_minimal.so and libprofile.so in the process):
+ % ./configure
+ % make tcmalloc_minimal_unittest tcmalloc_minimal_large_unittest \
+ addressmap_unittest atomicops_unittest frag_unittest \
+ low_level_alloc_unittest markidle_unittest memalign_unittest \
+ packed_cache_test stacktrace_unittest system_alloc_unittest \
+ thread_dealloc_unittest profiler_unittest.sh
+ % ./tcmalloc_minimal_unittest # to run this test
+ % [etc] # to run other tests
+
+ Three caveats: first, frag_unittest tries to allocate 400M of memory,
+ and if you have less virtual memory on your system, the test may
+ fail with a bad_alloc exception.
+
+ Second, profiler_unittest.sh sometimes fails in the "fork" test.
+ This is because stray SIGPROF signals from the parent process are
+ making their way into the child process. (This may be a kernel
+ bug that only exists in older kernels.) The profiling code itself
+ is working fine. This only affects programs that call fork(); for
+ most programs, the cpu profiler is entirely safe to use.
+
+ Third, perftools depends on /proc to get shared library
+ information. If you are running a FreeBSD system without proc,
+ perftools will not be able to map addresses to functions. Some
+ unittests will fail as a result.
+
+ Finally, the new test introduced in perftools-1.2,
+ profile_handler_unittest, fails on FreeBSD. It has something to do
+ with how the itimer works. The cpu profiler test passes, so I
+ believe the functionality is correct and the issue is with the test
+ somehow. If anybody is an expert on itimers and SIGPROF in
+ FreeBSD, and would like to debug this, I'd be glad to hear the
+ results!
+
+ libtcmalloc.so successfully builds, and the "advanced" tcmalloc
+ functionality all works except for the leak-checker, which has
+ Linux-specific code:
+ % make heap-profiler_unittest.sh maybe_threads_unittest.sh \
+ tcmalloc_unittest tcmalloc_both_unittest \
+ tcmalloc_large_unittest # THESE WORK
+ % make -k heap-checker_unittest.sh \
+ heap-checker-death_unittest.sh # THESE DO NOT
+
+ Note that unless you specify --enable-heap-checker explicitly,
+ 'make' will not build the heap-checker unittests on a FreeBSD
+ system.
+
+ I have not tested other *BSD systems, but they are probably similar.
+
+** Mac OS X:
+
+ I've tested OS X 10.5 [Leopard], OS X 10.4 [Tiger] and OS X 10.3
+ [Panther] on both intel (x86) and PowerPC systems. For Panther
+ systems, perftools does not work at all: it depends on a header
+ file, OSAtomic.h, which is new in 10.4. (It's possible to get the
+ code working for Panther/i386 without too much work; if you're
+ interested in exploring this, drop an e-mail.)
+
+ For the other seven systems, the binaries and libraries that
+ successfully build are exactly the same as for FreeBSD. See that
+ section for a list of binaries and instructions on building them.
+
+** Solaris 10 x86:
+
+ I've only tested using the GNU C++ compiler, not the Sun C++
+ compiler. Using g++ requires setting the PATH appropriately when
+ configuring.
+
+ % PATH=${PATH}:/usr/sfw/bin/:/usr/ccs/bin ./configure
+ % PATH=${PATH}:/usr/sfw/bin/:/usr/ccs/bin make [...]
+
+ Again, the binaries and libraries that successfully build are
+ exactly the same as for FreeBSD. (However, while libprofiler.so can
+ be used to generate profiles, pprof is not very successful at
+ reading them -- necessary helper programs like nm don't seem
+ to be installed by default on Solaris, or perhaps are only
+ installed as part of the Sun C++ compiler package.) See that
+ section for a list of binaries, and instructions on building them.
+
+** Windows:
+
+ Work on Windows is rather preliminary: we haven't found a good way
+ to get stack traces in release mode on windows (that is, when FPO
+ is enabled), so the heap profiling may not be reliable in that
+ case. Also, heap-checking and CPU profiling do not yet work at
+ all. But as in other ports, the basic tcmalloc library
+ functionality, overriding malloc and new and such (and even
+ windows-specific functions like _aligned_malloc!), is working fine,
+ at least with VC++ 7.1 (Visual Studio 2003) and VC++ 8.0
+ (Visual Studio 2005), in both debug and release modes. See
+ README.windows for instructions on how to install on Windows using
+ Visual Studio.
+
+ Cygwin can compile some but not all of perftools. Furthermore,
+ there is a problem with exception-unwinding in cygwin (it can call
+ malloc, which can call the exception-unwinding-setup code, which
+ can lead to an infinite loop). I've comitted a workaround to the
+ exception unwinding problem, but it only works in debug mode and
+ when statically linking in tcmalloc. I hope to have a more proper
+ fix in a later release. To configure under cygwin, run
+
+ ./configure --disable-shared CXXFLAGS=-g && make
+
+ Most of cygwin will compile (cygwin doesn't allow weak symbols, so
+ the heap-checker and a few other pieces of functionality will not
+ compile). 'make' will compile those libraries and tests that can
+ be compiled. You can run 'make check' to make sure the basic
+ functionality is working.
+
+ This Windows functionality is also available using MinGW and Msys,
+ In this case, you can use the regular './configure && make'
+ process. 'make install' should also work. The Makefile will limit
+ itself to those libraries and binaries that work on windows.
+
+
+Basic Installation
+==================
+
+ These are generic installation instructions.
+
+ The `configure' shell script attempts to guess correct values for
+various system-dependent variables used during compilation. It uses
+those values to create a `Makefile' in each directory of the package.
+It may also create one or more `.h' files containing system-dependent
+definitions. Finally, it creates a shell script `config.status' that
+you can run in the future to recreate the current configuration, and a
+file `config.log' containing compiler output (useful mainly for
+debugging `configure').
+
+ It can also use an optional file (typically called `config.cache'
+and enabled with `--cache-file=config.cache' or simply `-C') that saves
+the results of its tests to speed up reconfiguring. (Caching is
+disabled by default to prevent problems with accidental use of stale
+cache files.)
+
+ If you need to do unusual things to compile the package, please try
+to figure out how `configure' could check whether to do them, and mail
+diffs or instructions to the address given in the `README' so they can
+be considered for the next release. If you are using the cache, and at
+some point `config.cache' contains results you don't want to keep, you
+may remove or edit it.
+
+ The file `configure.ac' (or `configure.in') is used to create
+`configure' by a program called `autoconf'. You only need
+`configure.ac' if you want to change it or regenerate `configure' using
+a newer version of `autoconf'.
+
+The simplest way to compile this package is:
+
+ 1. `cd' to the directory containing the package's source code and type
+ `./configure' to configure the package for your system. If you're
+ using `csh' on an old version of System V, you might need to type
+ `sh ./configure' instead to prevent `csh' from trying to execute
+ `configure' itself.
+
+ Running `configure' takes awhile. While running, it prints some
+ messages telling which features it is checking for.
+
+ 2. Type `make' to compile the package.
+
+ 3. Optionally, type `make check' to run any self-tests that come with
+ the package.
+
+ 4. Type `make install' to install the programs and any data files and
+ documentation.
+
+ 5. You can remove the program binaries and object files from the
+ source code directory by typing `make clean'. To also remove the
+ files that `configure' created (so you can compile the package for
+ a different kind of computer), type `make distclean'. There is
+ also a `make maintainer-clean' target, but that is intended mainly
+ for the package's developers. If you use it, you may have to get
+ all sorts of other programs in order to regenerate files that came
+ with the distribution.
+
+Compilers and Options
+=====================
+
+ Some systems require unusual options for compilation or linking that
+the `configure' script does not know about. Run `./configure --help'
+for details on some of the pertinent environment variables.
+
+ You can give `configure' initial values for configuration parameters
+by setting variables in the command line or in the environment. Here
+is an example:
+
+ ./configure CC=c89 CFLAGS=-O2 LIBS=-lposix
+
+ *Note Defining Variables::, for more details.
+
+Compiling For Multiple Architectures
+====================================
+
+ You can compile the package for more than one kind of computer at the
+same time, by placing the object files for each architecture in their
+own directory. To do this, you must use a version of `make' that
+supports the `VPATH' variable, such as GNU `make'. `cd' to the
+directory where you want the object files and executables to go and run
+the `configure' script. `configure' automatically checks for the
+source code in the directory that `configure' is in and in `..'.
+
+ If you have to use a `make' that does not support the `VPATH'
+variable, you have to compile the package for one architecture at a
+time in the source code directory. After you have installed the
+package for one architecture, use `make distclean' before reconfiguring
+for another architecture.
+
+Installation Names
+==================
+
+ By default, `make install' will install the package's files in
+`/usr/local/bin', `/usr/local/man', etc. You can specify an
+installation prefix other than `/usr/local' by giving `configure' the
+option `--prefix=PATH'.
+
+ You can specify separate installation prefixes for
+architecture-specific files and architecture-independent files. If you
+give `configure' the option `--exec-prefix=PATH', the package will use
+PATH as the prefix for installing programs and libraries.
+Documentation and other data files will still use the regular prefix.
+
+ In addition, if you use an unusual directory layout you can give
+options like `--bindir=PATH' to specify different values for particular
+kinds of files. Run `configure --help' for a list of the directories
+you can set and what kinds of files go in them.
+
+ If the package supports it, you can cause programs to be installed
+with an extra prefix or suffix on their names by giving `configure' the
+option `--program-prefix=PREFIX' or `--program-suffix=SUFFIX'.
+
+Optional Features
+=================
+
+ Some packages pay attention to `--enable-FEATURE' options to
+`configure', where FEATURE indicates an optional part of the package.
+They may also pay attention to `--with-PACKAGE' options, where PACKAGE
+is something like `gnu-as' or `x' (for the X Window System). The
+`README' should mention any `--enable-' and `--with-' options that the
+package recognizes.
+
+ For packages that use the X Window System, `configure' can usually
+find the X include and library files automatically, but if it doesn't,
+you can use the `configure' options `--x-includes=DIR' and
+`--x-libraries=DIR' to specify their locations.
+
+Specifying the System Type
+==========================
+
+ There may be some features `configure' cannot figure out
+automatically, but needs to determine by the type of machine the package
+will run on. Usually, assuming the package is built to be run on the
+_same_ architectures, `configure' can figure that out, but if it prints
+a message saying it cannot guess the machine type, give it the
+`--build=TYPE' option. TYPE can either be a short name for the system
+type, such as `sun4', or a canonical name which has the form:
+
+ CPU-COMPANY-SYSTEM
+
+where SYSTEM can have one of these forms:
+
+ OS KERNEL-OS
+
+ See the file `config.sub' for the possible values of each field. If
+`config.sub' isn't included in this package, then this package doesn't
+need to know the machine type.
+
+ If you are _building_ compiler tools for cross-compiling, you should
+use the `--target=TYPE' option to select the type of system they will
+produce code for.
+
+ If you want to _use_ a cross compiler, that generates code for a
+platform different from the build platform, you should specify the
+"host" platform (i.e., that on which the generated programs will
+eventually be run) with `--host=TYPE'.
+
+Sharing Defaults
+================
+
+ If you want to set default values for `configure' scripts to share,
+you can create a site shell script called `config.site' that gives
+default values for variables like `CC', `cache_file', and `prefix'.
+`configure' looks for `PREFIX/share/config.site' if it exists, then
+`PREFIX/etc/config.site' if it exists. Or, you can set the
+`CONFIG_SITE' environment variable to the location of the site script.
+A warning: not all `configure' scripts look for a site script.
+
+Defining Variables
+==================
+
+ Variables not defined in a site shell script can be set in the
+environment passed to `configure'. However, some packages may run
+configure again during the build, and the customized values of these
+variables may be lost. In order to avoid this problem, you should set
+them in the `configure' command line, using `VAR=value'. For example:
+
+ ./configure CC=/usr/local2/bin/gcc
+
+will cause the specified gcc to be used as the C compiler (unless it is
+overridden in the site shell script).
+
+`configure' Invocation
+======================
+
+ `configure' recognizes the following options to control how it
+operates.
+
+`--help'
+`-h'
+ Print a summary of the options to `configure', and exit.
+
+`--version'
+`-V'
+ Print the version of Autoconf used to generate the `configure'
+ script, and exit.
+
+`--cache-file=FILE'
+ Enable the cache: use and save the results of the tests in FILE,
+ traditionally `config.cache'. FILE defaults to `/dev/null' to
+ disable caching.
+
+`--config-cache'
+`-C'
+ Alias for `--cache-file=config.cache'.
+
+`--quiet'
+`--silent'
+`-q'
+ Do not print messages saying which checks are being made. To
+ suppress all normal output, redirect it to `/dev/null' (any error
+ messages will still be shown).
+
+`--srcdir=DIR'
+ Look for the package's source code in directory DIR. Usually
+ `configure' can determine that directory automatically.
+
+`configure' also accepts some other, not widely useful, options. Run
+`configure --help' for more details.
View
994 distro/google-perftools-1.3/Makefile.am
@@ -0,0 +1,994 @@
+## Process this file with automake to produce Makefile.in
+
+# Note: for every library we create, we're explicit about what symbols
+# we export. In order to avoid complications with C++ mangling, we always
+# use the regexp for of specifying symbols.
+
+# Make sure that when we re-make ./configure, we get the macros we need
+ACLOCAL_AMFLAGS = -I m4
+
+# This is so we can #include <google/foo>
+AM_CPPFLAGS = -I$(top_srcdir)/src
+
+if !WITH_STACK_TRACE
+AM_CPPFLAGS += -DNO_TCMALLOC_SAMPLES
+endif !WITH_STACK_TRACE
+
+# This is mostly based on configure options
+AM_CXXFLAGS =
+
+# These are good warnings to turn on by default,
+if GCC
+AM_CXXFLAGS += -Wall -Wwrite-strings -Woverloaded-virtual -Wno-sign-compare
+endif GCC
+
+# The -no-undefined flag allows libtool to generate shared libraries for
+# Cygwin and MinGW. LIBSTDCXX_LA_LINKER_FLAG is used to fix a Solaris bug.
+AM_LDFLAGS = -no-undefined $(LIBSTDCXX_LA_LINKER_FLAG)
+
+# We know our low-level code cannot trigger an exception. On some
+# systems, such as cygwin, it would be disastrous if they did, because
+# the exception handler might call malloc! If our low-level routines
+# raised an exception within the malloc, they'd deadlock. Luckily,
+# we control all this code, and do not need exceptions for it.
+if GCC
+NO_EXCEPTIONS = -fno-exceptions
+else !GCC
+NO_EXCEPTIONS =
+endif !GCC
+
+# These are x86-specific, having to do with frame-pointers
+if X86_64
+if ENABLE_FRAME_POINTERS
+AM_CXXFLAGS += -fno-omit-frame-pointer
+else
+ # TODO(csilvers): check if -fomit-frame-pointer might be in $(CXXFLAGS),
+ # before setting this.
+AM_CXXFLAGS += -DNO_FRAME_POINTER
+endif !ENABLE_FRAME_POINTERS
+endif X86_64
+
+# For windows systems (at least, mingw), we need to tell all our
+# tests to link in libtcmalloc using -u. This is because libtcmalloc
+# accomplishes its tasks via patching, leaving no work for the linker
+# to identify, so the linker will ignore libtcmalloc by default unless
+# we explicitly create a dependency via -u.
+TCMALLOC_FLAGS =
+if MINGW
+TCMALLOC_FLAGS += -Wl,-u__tcmalloc
+endif MINGW
+
+# If we have objcopy, make malloc/free/etc weak symbols. That way folks
+# can override our malloc if they want to (they can still use tc_malloc).
+if HAVE_OBJCOPY_WEAKEN
+WEAKEN = $(OBJCOPY) -W malloc -W free -W realloc -W calloc -W cfree -W memalign -W posix_memalign -W valloc -W pvalloc -W malloc_stats -W mallopt -W mallinfo
+else
+WEAKEN = :
+endif !HAVE_OBJCOPY_WEAKEN
+
+LIBS_TO_WEAKEN =
+
+googleincludedir = $(includedir)/google
+# The .h files you want to install (that is, .h files that people
+# who install this package can include in their own applications.)
+# We'll add to this later, on a library-by-library basis
+googleinclude_HEADERS =
+# tcmalloc.h is a special case, because it's a .h.in file
+nodist_googleinclude_HEADERS = src/google/tcmalloc.h
+noinst_HEADERS = src/google/tcmalloc.h.in
+
+docdir = $(prefix)/share/doc/$(PACKAGE)-$(VERSION)
+# This is for HTML and other documentation you want to install.
+# Add your documentation files (in doc/) in addition to these
+# top-level boilerplate files. Also add a TODO file if you have one.
+# We'll add to this later, on a library-by-library basis
+dist_doc_DATA = AUTHORS COPYING ChangeLog INSTALL NEWS README README.windows \
+ TODO
+
+# The libraries (.so's) you want to install
+# We'll add to this later, on a library-by-library basis
+lib_LTLIBRARIES =
+# This is for 'convenience libraries' -- basically just a container for sources
+noinst_LTLIBRARIES =
+## The location of the windows project file for each binary we make
+WINDOWS_PROJECTS = google-perftools.sln
+
+# unittests you want to run when people type 'make check'.
+# Note: tests cannot take any arguments!
+# In theory, unittests that are scripts should be added to check_SCRIPTS
+# instead. But check_SCRIPTS is definitely a second-class testing mechanims:
+# it don't get TESTS_ENVIRONMENT, and it doesn't get success/failure counting
+# (in fact, a script failure aborts all the rest of the tests, even with -k).
+# So, for scripts, we add the script to tests, and also put in an empty
+# rule so automake doesn't try to build the script as a C binary.
+TESTS =
+# TESTS_ENVIRONMENT sets environment variables for when you run unittest.
+# We always get "srcdir" set for free.
+# We'll add to this later, on a library-by-library basis.
+TESTS_ENVIRONMENT =
+# All script tests should be added here
+noinst_SCRIPTS =
+# If your test calls another program that, like the test itself, shouldn't
+# be installed, add it here. (Stuff in TESTS is automatically added later).
+noinst_PROGRAMS =
+
+# Binaries we might build that should be installed
+bin_PROGRAMS =
+
+# This is my own var, used for extra libraries I make that I need installed
+EXTRA_INSTALL =
+
+## vvvv RULES TO MAKE THE LIBRARIES, BINARIES, AND UNITTESTS
+
+dist_doc_DATA += doc/index.html doc/designstyle.css
+
+
+### ------- library routines, in src/base
+
+# This is a 'convenience library' -- it's not actually installed or anything
+LOGGING_INCLUDES = src/base/logging.h \
+ src/base/commandlineflags.h \
+ src/base/basictypes.h \
+ src/base/dynamic_annotations.h
+noinst_LTLIBRARIES += liblogging.la
+liblogging_la_SOURCES = src/base/logging.cc \
+ src/base/dynamic_annotations.cc \
+ $(LOGGING_INCLUDES)
+
+SYSINFO_INCLUDES = src/base/sysinfo.h \
+ src/base/logging.h \
+ src/base/commandlineflags.h \
+ src/base/cycleclock.h \
+ src/base/basictypes.h
+noinst_LTLIBRARIES += libsysinfo.la
+libsysinfo_la_SOURCES = src/base/sysinfo.cc \
+ $(SYSINFO_INCLUDES)
+libsysinfo_la_LIBADD = $(NANOSLEEP_LIBS)
+
+# For MinGW, we use also have to use libwindows Luckily, we need the
+# windows.a library in exactly the same place we need spinlock.a
+# (pretty much everywhere), so we can use the same variable name for
+# each. We can also optimize the MinGW rule a bit by leaving out
+# files we know aren't used on windows, such as
+# atomicops-internals-x86.cc. libwindows also obsoletes the need for
+# other files like system_alloc.cc.
+if MINGW
+WINDOWS_INCLUDES = src/windows/port.h \
+ src/windows/mingw.h \
+ src/windows/mini_disassembler.h \
+ src/windows/mini_disassembler_types.h \
+ src/windows/preamble_patcher.h
+noinst_LTLIBRARIES += libwindows.la
+libwindows_la_SOURCES = $(WINDOWS_INCLUDES) \
+ src/windows/port.cc \
+ src/windows/ia32_modrm_map.cc \
+ src/windows/ia32_opcode_map.cc \
+ src/windows/mini_disassembler.cc \
+ src/windows/patch_functions.cc \
+ src/windows/preamble_patcher.cc \
+ src/windows/preamble_patcher_with_stub.cc
+
+SPINLOCK_INCLUDES = src/base/spinlock.h \
+ src/base/atomicops.h \
+ src/base/atomicops-internals-macosx.h \
+ src/base/atomicops-internals-linuxppc.h \
+ src/base/atomicops-internals-x86-msvc.h \
+ src/base/atomicops-internals-x86.h
+noinst_LTLIBRARIES += libspinlock.la
+libspinlock_la_SOURCES = src/base/spinlock.cc \
+ $(SPINLOCK_INCLUDES)
+
+LIBSPINLOCK = libwindows.la libspinlock.la libsysinfo.la liblogging.la
+
+# We also need to tell mingw that sysinfo.cc needs shlwapi.lib.
+# (We do this via a #pragma for msvc, but need to do it here for mingw).
+libsysinfo_la_LIBADD += -lshlwapi
+
+# patch_functions.cc #includes tcmalloc.cc, so no need to link it in.
+TCMALLOC_CC =
+# windows has its own system for threads and system memory allocation.
+MAYBE_THREADS_CC =
+SYSTEM_ALLOC_CC =
+else !MINGW
+# spinlock is the only code that uses atomicops.
+SPINLOCK_INCLUDES = src/base/spinlock.h \
+ src/base/atomicops.h \
+ src/base/atomicops-internals-macosx.h \
+ src/base/atomicops-internals-linuxppc.h \
+ src/base/atomicops-internals-x86-msvc.h \
+ src/base/atomicops-internals-x86.h
+
+noinst_LTLIBRARIES += libspinlock.la
+libspinlock_la_SOURCES = src/base/spinlock.cc \
+ src/base/atomicops-internals-x86.cc \
+ $(SPINLOCK_INCLUDES)
+libspinlock_la_LIBADD = $(NANOSLEEP_LIBS)
+# spinlock also needs NumCPUs, from libsysinfo, which in turn needs liblogging
+LIBSPINLOCK = libspinlock.la libsysinfo.la liblogging.la
+
+TCMALLOC_CC = src/tcmalloc.cc
+MAYBE_THREADS_CC = src/maybe_threads.cc
+SYSTEM_ALLOC_CC = src/system-alloc.cc
+endif !MINGW
+
+### Unittests
+TESTS += low_level_alloc_unittest
+WINDOWS_PROJECTS += vsprojects/low_level_alloc_unittest/low_level_alloc_unittest.vcproj
+LOW_LEVEL_ALLOC_UNITTEST_INCLUDES = src/base/low_level_alloc.h \
+ src/base/basictypes.h \
+ src/google/malloc_hook.h \
+ src/google/malloc_hook_c.h \
+ src/malloc_hook-inl.h \
+ $(SPINLOCK_INCLUDES) \
+ $(LOGGING_INCLUDES)
+low_level_alloc_unittest_SOURCES = src/base/low_level_alloc.cc \
+ src/malloc_hook.cc \
+ src/tests/low_level_alloc_unittest.cc \
+ $(LOW_LEVEL_ALLOC_UNITTEST_INCLUDES)
+# By default, MallocHook takes stack traces for use by the heap-checker.
+# We don't need that functionality here, so we turn it off to reduce deps.
+low_level_alloc_unittest_CXXFLAGS = -DNO_TCMALLOC_SAMPLES
+low_level_alloc_unittest_LDADD = $(LIBSPINLOCK)
+
+TESTS += atomicops_unittest
+ATOMICOPS_UNITTEST_INCLUDES = src/base/atomicops.h \
+ src/base/atomicops-internals-macosx.h \
+ src/base/atomicops-internals-x86-msvc.h \
+ src/base/atomicops-internals-x86.h \
+ $(LOGGING_INCLUDES)
+atomicops_unittest_SOURCES = src/tests/atomicops_unittest.cc \
+ $(ATOMICOPS_UNITTEST_INCLUDES)
+atomicops_unittest_LDADD = $(LIBSPINLOCK)
+
+
+### ------- stack trace
+
+if WITH_STACK_TRACE
+
+### The header files we use. We divide into categories based on directory
+S_STACKTRACE_INCLUDES = src/stacktrace_config.h \
+ src/stacktrace_generic-inl.h \
+ src/stacktrace_libunwind-inl.h \
+ src/stacktrace_powerpc-inl.h \
+ src/stacktrace_x86_64-inl.h \
+ src/stacktrace_x86-inl.h \
+ src/stacktrace_win32-inl.h \
+ src/base/vdso_support.h
+SG_STACKTRACE_INCLUDES = src/google/stacktrace.h
+STACKTRACE_INCLUDES = $(S_STACKTRACE_INCLUDES) $(SG_STACKTRACE_INCLUDES)
+googleinclude_HEADERS += $(SG_STACKTRACE_INCLUDES)
+
+### Making the library
+noinst_LTLIBRARIES += libstacktrace.la
+libstacktrace_la_SOURCES = src/stacktrace.cc \
+ src/stacktrace_with_context.cc \
+ src/base/vdso_support.cc \
+ $(STACKTRACE_INCLUDES)
+libstacktrace_la_LIBADD = $(UNWIND_LIBS) $(LIBSPINLOCK)
+STACKTRACE_SYMBOLS = '(GetStackTrace|GetStackFrames|GetStackTraceWithContext|GetStackFramesWithContext)'
+libstacktrace_la_LDFLAGS = -export-symbols-regex $(STACKTRACE_SYMBOLS)
+
+### Unittests
+TESTS += stacktrace_unittest
+STACKTRACE_UNITTEST_INLCUDES = src/config_for_unittests.h \
+ src/base/commandlineflags.h \
+ $(STACKTRACE_INCLUDES) \
+ $(LOGGING_INCLUDES)
+stacktrace_unittest_SOURCES = src/tests/stacktrace_unittest.cc \
+ $(STACKTRACE_UNITTEST_INLCUDES)
+stacktrace_unittest_LDADD = libstacktrace.la liblogging.la
+
+### Documentation
+dist_doc_DATA +=
+
+endif WITH_STACK_TRACE
+
+### ------- pprof
+
+# If we are not compiling with stacktrace support, pprof is worthless
+if WITH_STACK_TRACE
+
+bin_SCRIPTS = src/pprof
+
+### Unittests
+
+check_SCRIPTS = pprof_unittest
+pprof_unittest: $(top_srcdir)/src/pprof
+ $(top_srcdir)/src/pprof -test
+
+# Let unittests find pprof if they need to run it
+TESTS_ENVIRONMENT += PPROF_PATH=$(top_srcdir)/src/pprof
+
+### Documentation
+dist_man_MANS = doc/pprof.1
+dist_doc_DATA += doc/pprof_remote_servers.html
+
+# On MSVC, we need our own versions of addr2line and nm to work with pprof.
+WINDOWS_PROJECTS += vsprojects/nm-pdb/nm-pdb.vcproj
+WINDOWS_PROJECTS += vsprojects/addr2line-pdb/addr2line-pdb.vcproj
+# This is a slight abuse of WINDOWS_PROJECTS, but not much
+WINDOWS_PROJECTS += src/windows/nm-pdb.c \
+ src/windows/addr2line-pdb.c
+
+endif WITH_STACK_TRACE
+
+### ------- tcmalloc_minimal (thread-caching malloc)
+
+### The header files we use. We divide into categories based on directory
+S_TCMALLOC_MINIMAL_INCLUDES = src/common.h \
+ src/internal_logging.h \
+ src/system-alloc.h \
+ src/packed-cache-inl.h \
+ $(SPINLOCK_INCLUDES) \
+ src/tcmalloc_guard.h \
+ src/base/commandlineflags.h \
+ src/base/basictypes.h \
+ src/pagemap.h \
+ src/sampler.h \
+ src/central_freelist.h \
+ src/linked_list.h \
+ src/page_heap.h \
+ src/page_heap_allocator.h \
+ src/span.h \
+ src/static_vars.h \
+ src/thread_cache.h \
+ src/stack_trace_table.h \
+ src/base/thread_annotations.h \
+ src/malloc_hook-inl.h \
+ src/maybe_threads.h
+SG_TCMALLOC_MINIMAL_INCLUDES = src/google/malloc_hook.h \
+ src/google/malloc_hook_c.h \
+ src/google/malloc_extension.h \
+ src/google/malloc_extension_c.h \
+ src/google/stacktrace.h
+TCMALLOC_MINIMAL_INCLUDES = $(S_TCMALLOC_MINIMAL_INCLUDES) $(SG_TCMALLOC_MINIMAL_INCLUDES)
+googleinclude_HEADERS += $(SG_TCMALLOC_MINIMAL_INCLUDES)
+
+### Making the library
+
+# As we describe at the top of this file, we want to turn off exceptions
+# for all files in this library -- except tcmalloc.cc which needs them
+# to fulfill its API. Automake doesn't allow per-file CXXFLAGS, so we need
+# to separate into two libraries.
+noinst_LTLIBRARIES += libtcmalloc_minimal_internal.la
+libtcmalloc_minimal_internal_la_SOURCES = src/common.cc \
+ src/internal_logging.cc \
+ $(SYSTEM_ALLOC_CC) \
+ src/memfs_malloc.cc \
+ src/central_freelist.cc \
+ src/page_heap.cc \
+ src/sampler.cc \
+ src/span.cc \
+ src/stack_trace_table.cc \
+ src/static_vars.cc \
+ src/thread_cache.cc \
+ src/malloc_hook.cc \
+ src/malloc_extension.cc \
+ $(MAYBE_THREADS_CC) \
+ $(TCMALLOC_MINIMAL_INCLUDES)
+# We #define NO_TCMALLOC_SAMPLES, since sampling is turned off for _minimal.
+libtcmalloc_minimal_internal_la_CXXFLAGS = -DNO_TCMALLOC_SAMPLES \
+ $(PTHREAD_CFLAGS) -DNDEBUG \
+ $(AM_CXXFLAGS) $(NO_EXCEPTIONS)
+libtcmalloc_minimal_internal_la_LDFLAGS = $(PTHREAD_CFLAGS)
+libtcmalloc_minimal_internal_la_LIBADD = $(PTHREAD_LIBS) $(LIBSPINLOCK)
+
+lib_LTLIBRARIES += libtcmalloc_minimal.la
+WINDOWS_PROJECTS += vsprojects/libtcmalloc_minimal/libtcmalloc_minimal.vcproj
+libtcmalloc_minimal_la_SOURCES = $(TCMALLOC_CC) $(TCMALLOC_MINIMAL_INCLUDES)
+libtcmalloc_minimal_la_CXXFLAGS = -DNO_TCMALLOC_SAMPLES \
+ $(PTHREAD_CFLAGS) -DNDEBUG $(AM_CXXFLAGS)
+libtcmalloc_minimal_la_LDFLAGS = $(PTHREAD_CFLAGS)
+libtcmalloc_minimal_la_LIBADD = $(PTHREAD_LIBS) libtcmalloc_minimal_internal.la
+
+# For windows, we're playing around with trying to do some stacktrace
+# support even with libtcmalloc_minimal. For everyone else, though,
+# we turn off all stack-trace activity for libtcmalloc_minimal.
+# TODO(csilvers): when we're done experimenting, do something principled here
+if MINGW
+LIBTCMALLOC_MINIMAL = libtcmalloc_minimal.la libstacktrace.la
+else !MINGW
+LIBTCMALLOC_MINIMAL = libtcmalloc_minimal.la
+endif !MINGW
+
+LIBS_TO_WEAKEN += libtcmalloc_minimal.la
+
+### Unittests
+
+# Commented out for the moment because malloc(very_big_num) is broken in
+# standard libc! At least, in some situations, some of the time.
+## TESTS += malloc_unittest
+## MALLOC_UNITEST_INCLUDES = src/google/malloc_extension.h \
+## src/google/malloc_hook.h \
+## src/google/malloc_hook_c.h \
+## src/malloc_hook-inl.h \
+## src/base/basictypes.h \
+## src/maybe_threads.h
+## malloc_unittest_SOURCES = src/tests/tcmalloc_unittest.cc \
+## src/malloc_hook.cc \
+## src/malloc_extension.cc \
+## $(MAYBE_THREADS_CC) \
+## $(MALLOC_UNITTEST_INCLUDES)
+## malloc_unittest_CXXFLAGS = $(PTHREAD_CFLAGS) $(AM_CXXFLAGS)
+## malloc_unittest_LDFLAGS = $(PTHREAD_CFLAGS)
+## malloc_unittest_LDADD = $(PTHREAD_LIBS)
+
+TESTS += tcmalloc_minimal_unittest
+WINDOWS_PROJECTS += vsprojects/tcmalloc_minimal_unittest/tcmalloc_minimal_unittest.vcproj
+WINDOWS_PROJECTS += vsprojects/tmu-static/tmu-static.vcproj
+tcmalloc_minimal_unittest_SOURCES = src/tests/tcmalloc_unittest.cc \
+ src/tests/testutil.h src/tests/testutil.cc \
+ $(TCMALLOC_UNITTEST_INCLUDES)
+tcmalloc_minimal_unittest_CXXFLAGS = $(PTHREAD_CFLAGS) $(AM_CXXFLAGS)
+tcmalloc_minimal_unittest_LDFLAGS = $(PTHREAD_CFLAGS) $(TCMALLOC_FLAGS)
+tcmalloc_minimal_unittest_LDADD = $(LIBTCMALLOC_MINIMAL) \
+ liblogging.la $(PTHREAD_LIBS)
+
+TESTS += tcmalloc_minimal_large_unittest
+WINDOWS_PROJECTS += vsprojects/tcmalloc_minimal_large/tcmalloc_minimal_large_unittest.vcproj
+tcmalloc_minimal_large_unittest_SOURCES = src/tests/tcmalloc_large_unittest.cc
+tcmalloc_minimal_large_unittest_CXXFLAGS = $(PTHREAD_CFLAGS) $(AM_CXXFLAGS)
+tcmalloc_minimal_large_unittest_LDFLAGS = $(PTHREAD_CFLAGS) $(TCMALLOC_FLAGS)
+tcmalloc_minimal_large_unittest_LDADD = $(LIBTCMALLOC_MINIMAL) $(PTHREAD_LIBS)
+
+# This tests it works to LD_PRELOAD libtcmalloc (tests maybe_threads.cc)
+# In theory this should work under mingw, but mingw has trouble running
+# shell scripts that end in .exe. And it doesn't seem to build shared
+# libraries anyway (so can't be LD_PRELOADed).
+# TODO(csilvers): figure out how to nix ".exe" or otherwise work under mingw
+if !MINGW
+TESTS += maybe_threads_unittest.sh$(EXEEXT)
+maybe_threads_unittest_sh_SOURCES = src/tests/maybe_threads_unittest.sh
+noinst_SCRIPTS += $(maybe_threads_unittest_sh_SOURCES)
+# This script preloads libtcmalloc, and calls two other binaries as well
+# TODO(csilvers): replace by 'if ! cmp $^ $@ >/dev/null 2>&; then ...; fi'
+maybe_threads_unittest.sh$(EXEEXT): $(top_srcdir)/$(maybe_threads_unittest_sh_SOURCES) \
+ $(LIBTCMALLOC_MINIMAL) \
+ low_level_alloc_unittest
+ rm -f $@
+ cp -p $(top_srcdir)/$(maybe_threads_unittest_sh_SOURCES) $@
+endif !MINGW
+
+# These all tests components of tcmalloc_minimal
+
+TESTS += addressmap_unittest
+WINDOWS_PROJECTS += vsprojects/addressmap_unittest/addressmap_unittest.vcproj
+ADDRESSMAP_UNITTEST_INCLUDES = src/addressmap-inl.h \
+ src/base/commandlineflags.h \
+ $(LOGGING_INCLUDES)
+addressmap_unittest_SOURCES = src/tests/addressmap_unittest.cc \
+ $(ADDRESSMAP_UNITTEST_INCLUDES)
+addressmap_unittest_CXXFLAGS = -g $(AM_CXXFLAGS)
+addressmap_unittest_LDADD = liblogging.la
+
+if !MINGW
+TESTS += system_alloc_unittest
+system_alloc_unittest_SOURCES = src/config_for_unittests.h \
+ src/tests/system-alloc_unittest.cc
+system_alloc_unittest_CXXFLAGS = $(PTHREAD_CFLAGS) $(AM_CXXFLAGS)
+system_alloc_unittest_LDFLAGS = $(PTHREAD_CFLAGS) $(TCMALLOC_FLAGS)
+system_alloc_unittest_LDADD = $(LIBTCMALLOC_MINIMAL) $(PTHREAD_LIBS)
+endif !MINGW
+
+TESTS += packed_cache_test
+WINDOWS_PROJECTS += vsprojects/packed-cache_test/packed-cache_test.vcproj
+packed_cache_test_SOURCES = src/tests/packed-cache_test.cc \
+ src/packed-cache-inl.h \
+ src/base/logging.h
+
+TESTS += frag_unittest
+WINDOWS_PROJECTS += vsprojects/frag_unittest/frag_unittest.vcproj
+frag_unittest_SOURCES = src/tests/frag_unittest.cc src/config_for_unittests.h
+frag_unittest_CXXFLAGS = $(PTHREAD_CFLAGS) $(AM_CXXFLAGS)
+frag_unittest_LDFLAGS = $(PTHREAD_CFLAGS) $(TCMALLOC_FLAGS)
+frag_unittest_LDADD = $(LIBTCMALLOC_MINIMAL) $(PTHREAD_LIBS)
+
+TESTS += markidle_unittest
+WINDOWS_PROJECTS += vsprojects/markidle_unittest/markidle_unittest.vcproj
+markidle_unittest_SOURCES = src/tests/markidle_unittest.cc \
+ src/config_for_unittests.h \
+ src/tests/testutil.h src/tests/testutil.cc
+markidle_unittest_CXXFLAGS = $(PTHREAD_CFLAGS) $(AM_CXXFLAGS)
+markidle_unittest_LDFLAGS = $(PTHREAD_CFLAGS) $(TCMALLOC_FLAGS)
+markidle_unittest_LDADD = $(LIBTCMALLOC_MINIMAL) $(PTHREAD_LIBS)
+
+TESTS += malloc_extension_test
+WINDOWS_PROJECTS += vsprojects/malloc_extension_test/malloc_extension_test.vcproj
+malloc_extension_test_SOURCES = src/tests/malloc_extension_test.cc \
+ src/config_for_unittests.h \
+ src/base/logging.h \
+ src/google/malloc_extension.h \
+ src/google/malloc_extension_c.h
+malloc_extension_test_CXXFLAGS = $(PTHREAD_CFLAGS) $(AM_CXXFLAGS)
+malloc_extension_test_LDFLAGS = $(PTHREAD_CFLAGS) $(TCMALLOC_FLAGS)
+malloc_extension_test_LDADD = $(LIBTCMALLOC_MINIMAL) $(PTHREAD_LIBS)
+
+if !MINGW
+TESTS += memalign_unittest
+memalign_unittest_SOURCES = src/tests/memalign_unittest.cc \
+ src/tcmalloc.h \
+ src/config_for_unittests.h \
+ src/tests/testutil.h src/tests/testutil.cc
+memalign_unittest_CXXFLAGS = $(PTHREAD_CFLAGS) $(AM_CXXFLAGS)
+