== 03 February 2012 ==

I've just released gperftools 2.0

The `google-perftools` project has been renamed to `gperftools`.  I
(csilvers) am stepping down as maintainer, to be replaced by
David Chappelle.  Welcome to the team, David!  David has been an
an active contributor to perftools in the past -- in fact, he's the
only person other than me that already has commit status.  I am
pleased to have him take over as maintainer.

I have both renamed the project (the Google Code site renamed a few
weeks ago), and bumped the major version number up to 2, to reflect
the new community ownership of the project.  Almost all the
[http://gperftools.googlecode.com/svn/tags/gperftools-2.0/ChangeLog changes]
are related to the renaming.

The main functional change from google-perftools 1.10 is that
I've renamed the `google/` include-directory to be `gperftools/`
instead.  New code should `#include <gperftools/tcmalloc.h>`/etc.
(Most users of perftools don't need any perftools-specific includes at
all, so this is mostly directed to "power users.")  I've kept the old
names around as forwarding headers to the new, so `#include
<google/tcmalloc.h>` will continue to work.

(The other functional change which I snuck in is getting rid of some
bash-isms in one of the unittest driver scripts, so it could run on
Solaris.)

Note that some internal names still contain the text `google`, such as
the `google_malloc` internal linker section.  I think that's a
trickier transition, and can happen in a future release (if at all).


=== 31 January 2012 ===

I've just released perftools 1.10

There is an API-incompatible change: several of the methods in the
`MallocExtension` class have changed from taking a `void*` to taking a
`const void*`.  You should not be affected by this API change
unless you've written your own custom malloc extension that derives
from `MallocExtension`, but since it is a user-visible change, I have
upped the `.so` version number for this release.

This release focuses on improvements to linux-syscall-support.h,
including ARM and PPC fixups and general cleanups.  I hope this will
magically fix an array of bugs people have been seeing.

There is also exciting news on the porting front, with support for
patching win64 assembly contributed by IBM Canada!  This is an
important step -- perhaps the most difficult -- to getting perftools
to work on 64-bit windows using the patching technique (it doesn't
affect the libc-modification technique).  `premable_patcher_test` has
been added to help test these changes; it is meant to compile under
x86_64, and won't work under win32.

For the full list of changes, including improved `HEAP_PROFILE_MMAP`
support, see the
[http://gperftools.googlecode.com/svn/tags/google-perftools-1.10/ChangeLog ChangeLog].


=== 24 January 2011 ===

The `google-perftools` Google Code page has been renamed to
`gperftools`, in preparation for the project being renamed to
`gperftools`.  In the coming weeks, I'll be stepping down as
maintainer for the perftools project, and as part of that Google is
relinquishing ownership of the project; it will now be entirely
community run.  The name change reflects that shift.  The 'g' in
'gperftools' stands for 'great'. :-)

=== 23 December 2011 ===

I've just released perftools 1.9.1

I missed including a file in the tarball, that is needed to compile on
ARM.  If you are not compiling on ARM, or have successfully compiled
perftools 1.9, there is no need to upgrade.


=== 22 December 2011 ===

I've just released perftools 1.9

This change has a slew of improvements, from better ARM and freebsd
support, to improved performance by moving some code outside of locks,
to better pprof reporting of code with overloaded functions.

The full list of changes is in the
[http://google-perftools.googlecode.com/svn/tags/google-perftools-1.9/ChangeLog ChangeLog].


=== 26 August 2011 ===

I've just released perftools 1.8.3

The star-crossed 1.8 series continues; in 1.8.1, I had accidentally
removed some code that was needed for FreeBSD.  (Without this code
many apps would crash at startup.)  This release re-adds that code.
If you are not on FreeBSD, or are using FreeBSD with perftools 1.8 or
earlier, there is no need to upgrade.

=== 11 August 2011 ===

I've just released perftools 1.8.2

I was incorrectly calculating the patch-level in the configuration
step, meaning the TC_VERSION_PATCH #define in tcmalloc.h was wrong.
Since the testing framework checks for this, it was failing.  Now it
should work again.  This time, I was careful to re-run my tests after
upping the version number. :-)

If you don't care about the TC_VERSION_PATCH #define, there's no
reason to upgrae.

=== 26 July 2011 ===

I've just released perftools 1.8.1

I was missing an #include that caused the build to break under some
compilers, especially newer gcc's, that wanted it.  This only affects
people who build from source, so only the .tar.gz file is updated from
perftools 1.8.  If you didn't have any problems compiling perftools
1.8, there's no reason to upgrade.

=== 15 July 2011 ===

I've just released perftools 1.8

Of the many changes in this release, a good number pertain to porting.
I've revamped OS X support to use the malloc-zone framework; it should
now Just Work to link in tcmalloc, without needing
`DYLD_FORCE_FLAT_NAMESPACE` or the like.  (This is a pretty major
change, so please feel free to report feedback at
google-perftools@googlegroups.com.)  64-bit Windows support is also
improved, as is ARM support, and the hooks are in place to improve
FreeBSD support as well.

On the other hand, I'm seeing hanging tests on Cygwin.  I see the same
hanging even with (the old) perftools 1.7, so I'm guessing this is
either a problem specific to my Cygwin installation, or nobody is
trying to use perftools under Cygwin.  If you can reproduce the
problem, and even better have a solution, you can report it at
google-perftools@googlegroups.com.

Internal changes include several performance and space-saving tweaks.
One is user-visible (but in "stealth mode", and otherwise
undocumented): you can compile with `-DTCMALLOC_SMALL_BUT_SLOW`.  In
this mode, tcmalloc will use less memory overhead, at the cost of
running (likely not noticeably) slower.

There are many other changes as well, too numerous to recount here,
but present in the
[http://google-perftools.googlecode.com/svn/tags/google-perftools-1.8/ChangeLog ChangeLog].


=== 7 February 2011 ===

Thanks to endlessr..., who
[http://code.google.com/p/google-perftools/issues/detail?id=307 identified]
why some tests were failing under MSVC 10 in release mode.  It does not look
like these failures point toward any problem with tcmalloc itself; rather, the
problem is with the test, which made some assumptions that broke under the
some aggressive optimizations used in MSVC 10.  I'll fix the test, but in
the meantime, feel free to use perftools even when compiled under MSVC
10.

=== 4 February 2011 ===

I've just released perftools 1.7

I apologize for the delay since the last release; so many great new
patches and bugfixes kept coming in (and are still coming in; I also
apologize to those folks who have to slip until the next release).  I
picked this arbitrary time to make a cut.

Among the many new features in this release is a multi-megabyte
reduction in the amount of tcmalloc overhead uder x86_64, improved
performance in the case of contention, and many many bugfixes,
especially architecture-specific bugfixes.  See the
[http://google-perftools.googlecode.com/svn/tags/google-perftools-1.7/ChangeLog ChangeLog]
for full details.

One architecture-specific change of note is added comments in the
[http://google-perftools.googlecode.com/svn/tags/perftools-1.7/README README]
for using tcmalloc under OS X.  I'm trying to get my head around the
exact behavior of the OS X linker, and hope to have more improvements
for the next release, but I hope these notes help folks who have been
having trouble with tcmalloc on OS X.

*Windows users*: I've heard reports that some unittests fail on
Windows when compiled with MSVC 10 in Release mode.  All tests pass in
Debug mode.  I've not heard of any problems with earlier versions of
MSVC.  I don't know if this is a problem with the runtime patching (so
the static patching discussed in README_windows.txt will still work),
a problem with perftools more generally, or a bug in MSVC 10.  Anyone
with windows expertise that can debug this, I'd be glad to hear from!


=== 5 August 2010 ===

I've just released perftools 1.6

This version also has a large number of minor changes, including
support for `malloc_usable_size()` as a glibc-compatible alias to
`malloc_size()`, the addition of SVG-based output to `pprof`, and
experimental support for tcmalloc large pages, which may speed up
tcmalloc at the cost of greater memory use.  To use tcmalloc large
pages, see the
[http://google-perftools.googlecode.com/svn/tags/perftools-1.6/INSTALL
INSTALL file]; for all changes, see the
[http://google-perftools.googlecode.com/svn/tags/perftools-1.6/ChangeLog
ChangeLog].

OS X NOTE: improvements in the profiler unittest have turned up an OS
X issue: in multithreaded programs, it seems that OS X often delivers
the profiling signal (from sigitimer()) to the main thread, even when
it's sleeping, rather than spawned threads that are doing actual work.
If anyone knows details of how OS X handles SIGPROF events (from
setitimer) in threaded programs, and has insight into this problem,
please send mail to google-perftools@googlegroups.com.

To see if you're affected by this, look for profiling time that pprof
attributes to `___semwait_signal`.  This is work being done in other
threads, that is being attributed to sleeping-time in the main thread.


=== 20 January 2010 ===

I've just released perftools 1.5

This version has a slew of changes, leading to somewhat faster
performance and improvements in portability.  It adds features like
`ITIMER_REAL` support to the cpu profiler, and `tc_set_new_mode` to
mimic the windows function of the same name.  Full details are in the
[http://google-perftools.googlecode.com/svn/tags/perftools-1.5/ChangeLog
ChangeLog].


=== 11 September 2009 ===

I've just released perftools 1.4

The major change this release is the addition of a debugging malloc
library!  If you link with `libtcmalloc_debug.so` instead of
`libtcmalloc.so` (and likewise for the `minimal` variants) you'll get
a debugging malloc, which will catch double-frees, writes to freed
data, `free`/`delete` and `delete`/`delete[]` mismatches, and even
(optionally) writes past the end of an allocated block.

We plan to do more with this library in the future, including
supporting it on Windows, and adding the ability to use the debugging
library with your default malloc in addition to using it with
tcmalloc.

There are also the usual complement of bug fixes, documented in the
ChangeLog, and a few minor user-tunable knobs added to components like
the system allocator.


=== 9 June 2009 ===

I've just released perftools 1.3

Like 1.2, this has a variety of bug fixes, especially related to the
Windows build.  One of my bugfixes is to undo the weird `ld -r` fix to
`.a` files that I introduced in perftools 1.2: it caused problems on
too many platforms.  I've reverted back to normal `.a` files.  To work
around the original problem that prompted the `ld -r` fix, I now
provide `libtcmalloc_and_profiler.a`, for folks who want to link in
both.

The most interesting API change is that I now not only override
`malloc`/`free`/etc, I also expose them via a unique set of symbols:
`tc_malloc`/`tc_free`/etc.  This enables clients to write their own
memory wrappers that use tcmalloc:
{{{
   void* malloc(size_t size) { void* r = tc_malloc(size); Log(r); return r; }
}}}


=== 17 April 2009 ===

I've just released perftools 1.2.

This is mostly a bugfix release.  The major change is internal: I have
a new system for creating packages, which allows me to create 64-bit
packages.  (I still don't do that for perftools, because there is
still no great 64-bit solution, with libunwind still giving problems
and --disable-frame-pointers not practical in every environment.)

Another interesting change involves Windows: a
[http://code.google.com/p/google-perftools/issues/detail?id=126 new
patch] allows users to choose to override malloc/free/etc on Windows
rather than patching, as is done now.  This can be used to create
custom CRTs.

My fix for this
[http://groups.google.com/group/google-perftools/browse_thread/thread/1ff9b50043090d9d/a59210c4206f2060?lnk=gst&q=dynamic#a59210c4206f2060
bug involving static linking] ended up being to make libtcmalloc.a and
libperftools.a a big .o file, rather than a true `ar` archive.  This
should not yield any problems in practice -- in fact, it should be
better, since the heap profiler, leak checker, and cpu profiler will
now all work even with the static libraries -- but if you find it
does, please file a bug report.

Finally, the profile_handler_unittest provided in the perftools
testsuite (new in this release) is failing on FreeBSD.  The end-to-end
test that uses the profile-handler is passing, so I suspect the
problem may be with the test, not the perftools code itself.  However,
I do not know enough about how itimers work on FreeBSD to be able to
debug it.  If you can figure it out, please let me know!

=== 11 March 2009 ===

I've just released perftools 1.1!

It has many changes since perftools 1.0 including

  * Faster performance due to dynamically sized thread caches
  * Better heap-sampling for more realistic profiles
  * Improved support on Windows (MSVC 7.1 and cygwin)
  * Better stacktraces in linux (using VDSO)
  * Many bug fixes and feature requests

Note: if you use the CPU-profiler with applications that fork without
doing an exec right afterwards, please see the README.  Recent testing
has shown that profiles are unreliable in that case.  The problem has
existed since the first release of perftools.  We expect to have a fix
for perftools 1.2.  For more details, see
[http://code.google.com/p/google-perftools/issues/detail?id=105 issue 105].

Everyone who uses perftools 1.0 is encouraged to upgrade to perftools
1.1.  If you see any problems with the new release, please file a bug
report at http://code.google.com/p/google-perftools/issues/list.

Enjoy!
