From 8174a918ea3b7cb216bf7ea98cfdc10661b5c37d Mon Sep 17 00:00:00 2001 From: Florian Fischer Date: Wed, 6 May 2020 16:56:32 +0200 Subject: make the whole project more python idiomatic * rename src directory to allocbench * make global variable names UPPERCASE * format a lot of code using yapf * use lowercase ld_preload and ld_library_path as Allocator members * name expected Errors 'err' and don't raise a new Exception * disable some pylint messages --- src/allocators/BA_allocators.py | 24 ------ src/allocators/__init__.py | 17 ---- src/allocators/bumpptr.py | 29 ------- src/allocators/chattymalloc.py | 52 ------------- src/allocators/glibc.py | 67 ---------------- .../glibc/glibc_2.29_no_passive_falsesharing.patch | 30 -------- .../glibc_2.29_no_passive_falsesharing_fancy.patch | 33 -------- src/allocators/hoard.py | 41 ---------- src/allocators/jemalloc.py | 41 ---------- src/allocators/llalloc.py | 42 ---------- src/allocators/malt.py | 28 ------- src/allocators/mesh.py | 40 ---------- src/allocators/mimalloc.py | 38 --------- src/allocators/no_falsesharing.py | 25 ------ src/allocators/paper.py | 33 -------- src/allocators/rpmalloc.py | 40 ---------- src/allocators/scalloc.py | 55 ------------- src/allocators/scalloc/scalloc_fix_log.patch | 35 --------- src/allocators/snmalloc.py | 40 ---------- src/allocators/speedymalloc.py | 87 --------------------- src/allocators/streamflow.py | 41 ---------- src/allocators/supermalloc.py | 42 ---------- .../remove_faulty_aligned_alloc_test.patch | 13 ---- src/allocators/tbbmalloc.py | 38 --------- src/allocators/tcmalloc.py | 90 ---------------------- .../tcmalloc_2.7_cacheline_exclusive.patch | 26 ------- .../tcmalloc_2.7_no_active_falsesharing.patch | 17 ---- .../tcmalloc/tcmalloc_bazel_build_so.patch | 22 ------ 28 files changed, 1086 deletions(-) delete mode 100644 src/allocators/BA_allocators.py delete mode 100644 src/allocators/__init__.py delete mode 100644 src/allocators/bumpptr.py delete mode 100644 src/allocators/chattymalloc.py delete mode 100644 src/allocators/glibc.py delete mode 100644 src/allocators/glibc/glibc_2.29_no_passive_falsesharing.patch delete mode 100644 src/allocators/glibc/glibc_2.29_no_passive_falsesharing_fancy.patch delete mode 100644 src/allocators/hoard.py delete mode 100644 src/allocators/jemalloc.py delete mode 100644 src/allocators/llalloc.py delete mode 100644 src/allocators/malt.py delete mode 100644 src/allocators/mesh.py delete mode 100644 src/allocators/mimalloc.py delete mode 100644 src/allocators/no_falsesharing.py delete mode 100644 src/allocators/paper.py delete mode 100644 src/allocators/rpmalloc.py delete mode 100644 src/allocators/scalloc.py delete mode 100644 src/allocators/scalloc/scalloc_fix_log.patch delete mode 100644 src/allocators/snmalloc.py delete mode 100644 src/allocators/speedymalloc.py delete mode 100644 src/allocators/streamflow.py delete mode 100644 src/allocators/supermalloc.py delete mode 100644 src/allocators/supermalloc/remove_faulty_aligned_alloc_test.patch delete mode 100644 src/allocators/tbbmalloc.py delete mode 100644 src/allocators/tcmalloc.py delete mode 100644 src/allocators/tcmalloc/tcmalloc_2.7_cacheline_exclusive.patch delete mode 100644 src/allocators/tcmalloc/tcmalloc_2.7_no_active_falsesharing.patch delete mode 100644 src/allocators/tcmalloc/tcmalloc_bazel_build_so.patch (limited to 'src/allocators') diff --git a/src/allocators/BA_allocators.py b/src/allocators/BA_allocators.py deleted file mode 100644 index 9c11873..0000000 --- a/src/allocators/BA_allocators.py +++ /dev/null @@ -1,24 +0,0 @@ -# Copyright 2018-2019 Florian Fischer -# -# This file is part of allocbench. -# -# allocbench is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# allocbench is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with allocbench. If not, see . -"""Collection containing all allocators used in Florian's BA thesis""" - -from src.allocators.glibc import glibc, glibc_notc -from src.allocators.tcmalloc import tcmalloc -from src.allocators.jemalloc import jemalloc -from src.allocators.hoard import hoard - -allocators = [glibc, glibc_notc, tcmalloc, jemalloc, hoard] diff --git a/src/allocators/__init__.py b/src/allocators/__init__.py deleted file mode 100644 index d5c6419..0000000 --- a/src/allocators/__init__.py +++ /dev/null @@ -1,17 +0,0 @@ -# Copyright 2018-2019 Florian Fischer -# -# This file is part of allocbench. -# -# allocbench is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# allocbench is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with allocbench. If not, see . -"""allocbench allocator definitions""" diff --git a/src/allocators/bumpptr.py b/src/allocators/bumpptr.py deleted file mode 100644 index 9165352..0000000 --- a/src/allocators/bumpptr.py +++ /dev/null @@ -1,29 +0,0 @@ -# Copyright 2018-2019 Florian Fischer -# -# This file is part of allocbench. -# -# allocbench is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# allocbench is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with allocbench. If not, see . -"""Bumpptr allocator - -The bumpptr allocator makes the biggest possible tradeoff between speed and -memory in speeds favor. Memory is mmapped per thread and never freed. -See src/bumpptr.c for the actual implementation. -""" - -import os -from src.allocator import Allocator, BUILDDIR - -bumpptr = Allocator("bumpptr", - LD_PRELOAD=os.path.join(BUILDDIR, "bumpptr_alloc.so"), - color="xkcd:black") diff --git a/src/allocators/chattymalloc.py b/src/allocators/chattymalloc.py deleted file mode 100644 index ff4a3ba..0000000 --- a/src/allocators/chattymalloc.py +++ /dev/null @@ -1,52 +0,0 @@ -# Copyright 2018-2020 Florian Fischer -# -# This file is part of allocbench. -# -# allocbench is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# allocbench is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with allocbench. If not, see . -"""chattymalloc allocator - -This shared library is not a functional allocator. It is used to trace -the allocator usage and the executed program. It overrides the malloc API -and saves each call and its result to a memory mapped output file. -""" - -import os - -from src.artifact import GitArtifact -from src.allocator import Allocator - -VERSION = "1a09b144eb18919014ecf86da3442344b0eaa5b2" - -class Chattymalloc(Allocator): - """Chattymalloc definition for allocbench""" - - sources = GitArtifact("chattymalloc", - "https://github.com/fischerling/chattymalloc") - - def __init__(self, name, **kwargs): - - configuration = "--buildtype=release " - for option, value in kwargs.get("options", {}).items(): - configuration += f"-D{option}={value} " - - self.build_cmds = [ - f"meson {{srcdir}} {{dir}} {configuration}", "ninja -C {dir}" - ] - - self.LD_PRELOAD = "{dir}/libchattymalloc.so" - self.cmd_prefix="env CHATTYMALLOC_FILE={{result_dir}}/{{perm}}.trace" - super().__init__(name, **kwargs) - - -chattymalloc = Chattymalloc("chattymalloc", version=VERSION) diff --git a/src/allocators/glibc.py b/src/allocators/glibc.py deleted file mode 100644 index 5d2814d..0000000 --- a/src/allocators/glibc.py +++ /dev/null @@ -1,67 +0,0 @@ -# Copyright 2018-2019 Florian Fischer -# -# This file is part of allocbench. -# -# allocbench is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# allocbench is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with allocbench. If not, see . -"""Glibc definitions""" - -from multiprocessing import cpu_count - -from src.allocator import Allocator, LIBRARY_PATH -from src.artifact import GitArtifact - - -class Glibc(Allocator): - """Glibc definition for allocbench - - Glibcs are loaded using their own supplied loader""" - - sources = GitArtifact("glibc", "git://sourceware.org/git/glibc.git") - - def __init__(self, name, **kwargs): - configure_args = "" - if "configure_args" in kwargs: - configure_args = kwargs["configure_args"] - del kwargs["configure_args"] - - self.build_cmds = [ - "mkdir -p glibc-build", - "cd glibc-build; {srcdir}/configure --prefix={dir} " + - configure_args, "cd glibc-build; make", - f"cd glibc-build; make -l {cpu_count()} install" - ] - - self.cmd_prefix = "{dir}/lib/ld-linux-x86-64.so.2 --library-path {dir}/lib:" + LIBRARY_PATH - - super().__init__(name, **kwargs) - - -glibc = Glibc("glibc", version="glibc-2.29", color="xkcd:red") - -glibc_notc = Glibc("glibc-noThreadCache", - configure_args="--disable-experimental-malloc", - version="glibc-2.29", - color="xkcd:maroon") - -glibc_nofs = Glibc( - "glibc-noFalsesharing", - patches=["{patchdir}/glibc_2.29_no_passive_falsesharing.patch"], - version="glibc-2.29", - color="xkcd:pink") - -glibc_nofs_fancy = Glibc( - "glibc-noFalsesharingClever", - patches=["{patchdir}/glibc_2.29_no_passive_falsesharing_fancy.patch"], - version="glibc-2.29", - color="xkcd:orange") diff --git a/src/allocators/glibc/glibc_2.29_no_passive_falsesharing.patch b/src/allocators/glibc/glibc_2.29_no_passive_falsesharing.patch deleted file mode 100644 index becbfda..0000000 --- a/src/allocators/glibc/glibc_2.29_no_passive_falsesharing.patch +++ /dev/null @@ -1,30 +0,0 @@ -diff --git malloc/malloc.c malloc/malloc.c -index 0abd653be2..eaefd3bd7c 100644 ---- malloc/malloc.c -+++ malloc/malloc.c -@@ -4194,6 +4194,9 @@ _int_free (mstate av, mchunkptr p, int have_lock) - - #if USE_TCACHE - { -+ /* Check if chunk is from our own arena. */ -+ if (av == thread_arena) -+ { - size_t tc_idx = csize2tidx (size); - if (tcache != NULL && tc_idx < mp_.tcache_bins) - { -@@ -4223,6 +4226,7 @@ _int_free (mstate av, mchunkptr p, int have_lock) - return; - } - } -+ } - } - #endif - -@@ -4997,6 +5001,7 @@ __malloc_stats (void) - memset (&mi, 0, sizeof (mi)); - __libc_lock_lock (ar_ptr->mutex); - int_mallinfo (ar_ptr, &mi); -+ fprintf (stderr, "false sharing path by muhq\n"); - fprintf (stderr, "Arena %d:\n", i); - fprintf (stderr, "system bytes = %10u\n", (unsigned int) mi.arena); - fprintf (stderr, "in use bytes = %10u\n", (unsigned int) mi.uordblks); diff --git a/src/allocators/glibc/glibc_2.29_no_passive_falsesharing_fancy.patch b/src/allocators/glibc/glibc_2.29_no_passive_falsesharing_fancy.patch deleted file mode 100644 index 480d072..0000000 --- a/src/allocators/glibc/glibc_2.29_no_passive_falsesharing_fancy.patch +++ /dev/null @@ -1,33 +0,0 @@ -diff --git malloc/malloc.c malloc/malloc.c -index 0abd653be2..71b2d433ba 100644 ---- malloc/malloc.c -+++ malloc/malloc.c -@@ -4194,6 +4194,12 @@ _int_free (mstate av, mchunkptr p, int have_lock) - - #if USE_TCACHE - { -+ /* Check if chunk is from our own arena or false sharing is not possible -+ because the chunk is cache line aligned and it's size is a multiple -+ of a cacheline */ -+ if (av == thread_arena -+ || (((size_t)p & 63) == 0 && ((size + 2*SIZE_SZ) % 64) == 0)) -+ { - size_t tc_idx = csize2tidx (size); - if (tcache != NULL && tc_idx < mp_.tcache_bins) - { -@@ -4223,6 +4229,7 @@ _int_free (mstate av, mchunkptr p, int have_lock) - return; - } - } -+ } - } - #endif - -@@ -4997,6 +5004,7 @@ __malloc_stats (void) - memset (&mi, 0, sizeof (mi)); - __libc_lock_lock (ar_ptr->mutex); - int_mallinfo (ar_ptr, &mi); -+ fprintf (stderr, "fancy false sharing patch by muhq"); - fprintf (stderr, "Arena %d:\n", i); - fprintf (stderr, "system bytes = %10u\n", (unsigned int) mi.arena); - fprintf (stderr, "in use bytes = %10u\n", (unsigned int) mi.uordblks); diff --git a/src/allocators/hoard.py b/src/allocators/hoard.py deleted file mode 100644 index 5d0c2ce..0000000 --- a/src/allocators/hoard.py +++ /dev/null @@ -1,41 +0,0 @@ -# Copyright 2018-2019 Florian Fischer -# -# This file is part of allocbench. -# -# allocbench is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# allocbench is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with allocbench. -"""Hoard allocator definition for allocbench""" - -from src.allocator import Allocator -from src.artifact import GitArtifact - - -class Hoard(Allocator): - """Hoard allocator""" - - sources = GitArtifact("Hoard", "https://github.com/emeryberger/Hoard.git") - - def __init__(self, name, **kwargs): - self.LD_PRELOAD = "{dir}/libhoard.so" - self.build_cmds = [ - "cd {srcdir}/src; make", "mkdir -p {dir}", - "ln -f -s {srcdir}/src/libhoard.so {dir}/libhoard.so" - ] - self.requirements = ["clang"] - - super().__init__(name, **kwargs) - - -hoard = Hoard("Hoard", - version="aa6d31700d5368a9f5ede3d62731247c8d9f0ebb", - color="xkcd:brown") diff --git a/src/allocators/jemalloc.py b/src/allocators/jemalloc.py deleted file mode 100644 index ab2528b..0000000 --- a/src/allocators/jemalloc.py +++ /dev/null @@ -1,41 +0,0 @@ -# Copyright 2018-2019 Florian Fischer -# -# This file is part of allocbench. -# -# allocbench is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# allocbench is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with allocbench. -"""jemalloc definition for allocbench""" - -from src.allocator import Allocator -from src.artifact import GitArtifact - - -class Jemalloc(Allocator): - """jemalloc allocator""" - - sources = GitArtifact("jemalloc", - "https://github.com/jemalloc/jemalloc.git") - - def __init__(self, name, **kwargs): - self.LD_PRELOAD = "{dir}/libjemalloc.so" - self.prepare_cmds = ["./autogen.sh"] - self.build_cmds = [ - "cd {srcdir}; ./configure --prefix={dir}", "cd {srcdir}; make -j4", - "mkdir -p {dir}", - "ln -f -s {srcdir}/lib/libjemalloc.so {dir}/libjemalloc.so" - ] - - super().__init__(name, **kwargs) - - -jemalloc = Jemalloc("jemalloc", version="5.1.0", color="xkcd:yellow") diff --git a/src/allocators/llalloc.py b/src/allocators/llalloc.py deleted file mode 100644 index d3c5288..0000000 --- a/src/allocators/llalloc.py +++ /dev/null @@ -1,42 +0,0 @@ -# Copyright 2018-2019 Florian Fischer -# -# This file is part of allocbench. -# -# allocbench is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# allocbench is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with allocbench. -"""Lockless allocator definition for allocbench""" - -from src.allocator import Allocator -from src.artifact import ArchiveArtifact - - -class LocklessAllocator(Allocator): - """Lockless allocator""" - def __init__(self, name, **kwargs): - - self.sources = ArchiveArtifact( - "llalloc", - "https://locklessinc.com/downloads/lockless_allocator_src.tgz", - "tar", "c6cb5a57882fa4775b5227a322333a6126b61f7c") - - self.build_cmds = [ - "cd {srcdir}/lockless_allocator; make", "mkdir -p {dir}", - "ln -f -s {srcdir}/lockless_allocator/libllalloc.so.1.3 {dir}/libllalloc.so" - ] - - self.LD_PRELOAD = "{dir}/libllalloc.so" - - super().__init__(name, **kwargs) - - -llalloc = LocklessAllocator("llalloc", color="purple") diff --git a/src/allocators/malt.py b/src/allocators/malt.py deleted file mode 100644 index 8613145..0000000 --- a/src/allocators/malt.py +++ /dev/null @@ -1,28 +0,0 @@ -# Copyright 2018-2019 Florian Fischer -# -# This file is part of allocbench. -# -# allocbench is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# allocbench is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with allocbench. -"""malt allocator definition - -Malt is a malloc tracker and used to capture and analyse the allocation profile -of a program. See https://github.com/memtt/malt for more details -""" - -from src.allocator import Allocator - -# result_dir and perm are substituted during Benchmark.run -malt = Allocator( - "malt", - cmd_prefix="malt -q -o output:name={{result_dir}}/malt.{{perm}}.%3") diff --git a/src/allocators/mesh.py b/src/allocators/mesh.py deleted file mode 100644 index 4d99f4d..0000000 --- a/src/allocators/mesh.py +++ /dev/null @@ -1,40 +0,0 @@ -# Copyright 2018-2019 Florian Fischer -# -# This file is part of allocbench. -# -# allocbench is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# allocbench is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with allocbench. -"""Mesh definition for allocbench""" - -from src.allocator import Allocator -from src.artifact import GitArtifact - - -class Mesh(Allocator): - """Mesh allocator""" - - sources = GitArtifact("Mesh", "https://github.com/plasma-umass/Mesh") - - def __init__(self, name, **kwargs): - self.LD_PRELOAD = "{dir}/libmesh.so" - self.build_cmds = [ - "cd {srcdir}; ./configure", "cd {srcdir}; make -j 4", - "mkdir -p {dir}", "ln -f -s {srcdir}/libmesh.so {dir}/libmesh.so" - ] - - super().__init__(name, **kwargs) - - -mesh = Mesh("Mesh", - version="4a1012cee990cb98cc1ea0294a836f467b29be02", - color="xkcd:mint") diff --git a/src/allocators/mimalloc.py b/src/allocators/mimalloc.py deleted file mode 100644 index 6801191..0000000 --- a/src/allocators/mimalloc.py +++ /dev/null @@ -1,38 +0,0 @@ -# Copyright 2018-2019 Florian Fischer -# -# This file is part of allocbench. -# -# allocbench is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# allocbench is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with allocbench. -"""mimalloc definition for allocbench""" - -from src.allocator import Allocator -from src.artifact import GitArtifact - - -class Mimalloc(Allocator): - """mimalloc allocator""" - - sources = GitArtifact("mimalloc", "https://github.com/microsoft/mimalloc") - - def __init__(self, name, **kwargs): - self.LD_PRELOAD = "{dir}/libmimalloc.so" - self.build_cmds = [ - "mkdir -p {dir}", "cd {dir}; cmake {srcdir}", "cd {dir}; make" - ] - self.requirements = ["cmake"] - - super().__init__(name, **kwargs) - - -mimalloc = Mimalloc("mimalloc", version="v1.6.0") diff --git a/src/allocators/no_falsesharing.py b/src/allocators/no_falsesharing.py deleted file mode 100644 index 77310b3..0000000 --- a/src/allocators/no_falsesharing.py +++ /dev/null @@ -1,25 +0,0 @@ -# Copyright 2018-2019 Florian Fischer -# -# This file is part of allocbench. -# -# allocbench is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# allocbench is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with allocbench. -"""Collection containing all no falsesahring patches""" - -from src.allocators.tcmalloc import tcmalloc_gperftools, tcmalloc_gperftools_nofs -from src.allocators.glibc import glibc, glibc_nofs, glibc_nofs_fancy - -allocators = [ - glibc, glibc_nofs, glibc_nofs_fancy, tcmalloc_gperftools, - tcmalloc_gperftools_nofs -] diff --git a/src/allocators/paper.py b/src/allocators/paper.py deleted file mode 100644 index 3f36be9..0000000 --- a/src/allocators/paper.py +++ /dev/null @@ -1,33 +0,0 @@ -# Copyright 2018-2019 Florian Fischer -# -# This file is part of allocbench. -# -# allocbench is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# allocbench is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with allocbench. If not, see . -"""Collection containing all available allocators""" - -from src.allocators.glibc import glibc -from src.allocators.tcmalloc import tcmalloc, tcmalloc_align, tcmalloc_gperftools, tcmalloc_gperftools_align -from src.allocators.jemalloc import jemalloc -from src.allocators.scalloc import scalloc -from src.allocators.llalloc import llalloc -from src.allocators.tbbmalloc import tbbmalloc -from src.allocators.mimalloc import mimalloc -from src.allocators.bumpptr import bumpptr -from src.allocators.speedymalloc import speedymalloc - -allocators = [ - glibc, tcmalloc, tcmalloc_align, tcmalloc_gperftools, - tcmalloc_gperftools_align, jemalloc, llalloc, mimalloc, bumpptr, - speedymalloc -] diff --git a/src/allocators/rpmalloc.py b/src/allocators/rpmalloc.py deleted file mode 100644 index c27f244..0000000 --- a/src/allocators/rpmalloc.py +++ /dev/null @@ -1,40 +0,0 @@ -# Copyright 2018-2019 Florian Fischer -# -# This file is part of allocbench. -# -# allocbench is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# allocbench is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with allocbench. -"""rpmalloc definition for allocbench""" - -from src.allocator import Allocator -from src.artifact import GitArtifact - - -class Rpmalloc(Allocator): - """rpmalloc allocator""" - - sources = GitArtifact("rpmalloc", "https://github.com/mjansson/rpmalloc") - - def __init__(self, name, **kwargs): - - self.LD_PRELOAD = "{dir}/librpmalloc.so" - self.build_cmds = [ - "cd {srcdir}; ./configure.py", "cd {srcdir}; ninja", - "mkdir -p {dir}", - 'ln -f -s $(find {srcdir}/bin -path "*release*librpmalloc.so") {dir}/librpmalloc.so' - ] - - super().__init__(name, **kwargs) - - -rpmalloc = Rpmalloc("rpmalloc", color="xkcd:chestnut", version="1.4.0") diff --git a/src/allocators/scalloc.py b/src/allocators/scalloc.py deleted file mode 100644 index c071f22..0000000 --- a/src/allocators/scalloc.py +++ /dev/null @@ -1,55 +0,0 @@ -# Copyright 2018-2019 Florian Fischer -# -# This file is part of allocbench. -# -# allocbench is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# allocbench is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with allocbench. -"""Scalloc definition for allocbench""" - -from src.allocator import Allocator -from src.artifact import GitArtifact - - -class Scalloc(Allocator): - """Scalloc allocator""" - - sources = GitArtifact("scalloc", - "https://github.com/cksystemsgroup/scalloc") - - def __init__(self, name, **kwargs): - self.prepare_cmds = [ - "tools/make_deps.sh", "build/gyp/gyp --depth=. scalloc.gyp" - ] - - self.build_cmds = [ - "cd {srcdir}; BUILDTYPE=Release make", "mkdir -p {dir}" - ] - - self.LD_PRELOAD = "{srcdir}/out/Release/lib.target/libscalloc.so" - - self.patches = ["{patchdir}/scalloc_fix_log.patch"] - - super().__init__(name, **kwargs) - - def build(self): - with open("/proc/sys/vm/overcommit_memory", "r") as f: - if f.read()[0] != "1": - raise AssertionError("""\ -vm.overcommit_memory not set -Scalloc needs permission to overcommit_memory. -sysctl vm.overcommit_memory=1 -""") - return super().build() - - -scalloc = Scalloc("scalloc", color="xkcd:magenta", version="v1.0.0") diff --git a/src/allocators/scalloc/scalloc_fix_log.patch b/src/allocators/scalloc/scalloc_fix_log.patch deleted file mode 100644 index 9d4a7d8..0000000 --- a/src/allocators/scalloc/scalloc_fix_log.patch +++ /dev/null @@ -1,35 +0,0 @@ -diff --git src/log.h src/log.h -index 3edc36d..e1d181c 100644 ---- src/log.h -+++ src/log.h -@@ -46,13 +46,13 @@ inline void LogPrintf( - - snprintf(line_buffer, sizeof(line_buffer), "%d", line); - // Start with "__FILENAME__:__LINE__ ". -- strncat(buffer, file, strlen(file)); -+ strncat(buffer, file, rest); - rest -= strlen(file); -- strncat(buffer, ":", 1); -+ strncat(buffer, ":", rest); - rest -= 1; -- strncat(buffer, line_buffer, strlen(line_buffer)); -+ strncat(buffer, line_buffer, rest); - rest -= strlen(line_buffer); -- strncat(buffer, " ", 1); -+ strncat(buffer, " ", rest); - rest -= 1; - - // Sanity check. -@@ -69,10 +69,10 @@ inline void LogPrintf( - // For copying the suffix we need actual rest value again. - strncpy(rest_start + (rest - strlen(truncate_suffix)), - truncate_suffix, -- strlen(truncate_suffix)); -+ rest); - } - -- strncat(buffer, "\n", 1); -+ strncat(buffer, "\n", rest); - - // Sanity check. - if (buffer[kLogLen-1] != 0) { diff --git a/src/allocators/snmalloc.py b/src/allocators/snmalloc.py deleted file mode 100644 index 2c5dfa8..0000000 --- a/src/allocators/snmalloc.py +++ /dev/null @@ -1,40 +0,0 @@ -# Copyright 2018-2019 Florian Fischer -# -# This file is part of allocbench. -# -# allocbench is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# allocbench is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with allocbench. -"""Snmalloc definition for allocbench""" - -from src.allocator import Allocator -from src.artifact import GitArtifact - - -class Snmalloc(Allocator): - """snmalloc allocator""" - - sources = GitArtifact("snmalloc", "https://github.com/microsoft/snmalloc") - - def __init__(self, name, **kwargs): - self.LD_PRELOAD = "{dir}/libsnmallocshim.so" - self.build_cmds = [ - "mkdir -p {dir}", - "cd {dir}; cmake -G Ninja {srcdir} -DCMAKE_BUILD_TYPE=Release", - "cd {dir}; ninja" - ] - self.requirements = ["cmake", "ninja", "clang"] - - super().__init__(name, **kwargs) - - -snmalloc = Snmalloc("snmalloc", version="0.2") diff --git a/src/allocators/speedymalloc.py b/src/allocators/speedymalloc.py deleted file mode 100644 index 6fe202a..0000000 --- a/src/allocators/speedymalloc.py +++ /dev/null @@ -1,87 +0,0 @@ -# Copyright 2018-2020 Florian Fischer -# -# This file is part of allocbench. -# -# allocbench is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# allocbench is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with allocbench. If not, see . -"""Speedymalloc - -Speedymalloc is a cached bump pointer allocator. -A bump pointer allocator makes the biggest possible tradeoff between speed and -memory in speeds favor. Memory is mmapped per thread and never freed. -""" - -from src.artifact import GitArtifact -from src.allocator import Allocator - -VERSION = "dd24b9d24c78c798df97ca5556ba248ccff97ca7" - - -class Speedymalloc(Allocator): - """Speedymalloc definition for allocbench""" - - sources = GitArtifact("speedymalloc", - "https://gitlab.cs.fau.de/flow/speedymalloc.git") - - def __init__(self, name, **kwargs): - - configuration = "--buildtype=release " - for option, value in kwargs.get("options", {}).items(): - configuration += f"-D{option}={value} " - - self.build_cmds = [ - f"meson {{srcdir}} {{dir}} {configuration}", "ninja -C {dir}" - ] - - self.LD_PRELOAD = "{dir}/libspeedymalloc.so" - super().__init__(name, **kwargs) - - -speedymalloc = Speedymalloc("speedymalloc", version=VERSION) - -speedymalloc_no_madv_free = Speedymalloc("speedymalloc_no_madv_free", - options={"madvise_free": "false"}, - version=VERSION) - -speedymalloc_no_madv_willneed = Speedymalloc( - "speedymalloc_no_madv_willneed", - options={"madvise_willneed": "false"}, - version=VERSION) - -speedymalloc_4095_sc_32 = Speedymalloc("speedymalloc_4095_sc_32", - options={ - "cache_bins": 4095, - "cache_bin_seperation": 32 - }, - version=VERSION) - -speedymalloc_4095_sc_128 = Speedymalloc("speedymalloc_4095_sc_128", - options={ - "cache_bins": 4095, - "cache_bin_seperation": 128 - }, - version=VERSION) - -speedymalloc_only_glab = Speedymalloc( - "speedymalloc_only_glab", - options={"max_local_allocation_buffer_size": 0}, - version=VERSION) - -speedymalloc_no_glab = Speedymalloc( - "speedymalloc_no_glab", - options={"max_local_allocation_buffer_size": -1}, - version=VERSION) - -# speedymalloc_rseq = Speedymalloc( - # "speedymalloc_rseq", - # version="e1549fa2a2833deba0ba53504a6c67ee31a0e42a") diff --git a/src/allocators/streamflow.py b/src/allocators/streamflow.py deleted file mode 100644 index 3b04a21..0000000 --- a/src/allocators/streamflow.py +++ /dev/null @@ -1,41 +0,0 @@ -# Copyright 2018-2019 Florian Fischer -# -# This file is part of allocbench. -# -# allocbench is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# allocbench is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with allocbench. -"""Streamflow allocator definition for allocbench""" - -from src.allocator import Allocator -from src.artifact import GitArtifact - - -class Streamflow(Allocator): - """Streamflow allocator""" - - sources = GitArtifact("streamflow", "https://github.com/scotts/streamflow") - - def __init__(self, name, **kwargs): - - self.LD_PRELOAD = "{dir}/libstreamflow.so" - self.build_cmds = [ - "cd {srcdir}; make", "mkdir -p {dir}", - "ln -f -s {srcdir}/libstreamflow.so {dir}/libstreamflow.so" - ] - - super().__init__(name, **kwargs) - - -streamflow = Streamflow("Streamflow", - version="8ac345c0f69ec9e7af02f3555c2c97eaa07a442e", - color="xkcd:light brown") diff --git a/src/allocators/supermalloc.py b/src/allocators/supermalloc.py deleted file mode 100644 index 32f9588..0000000 --- a/src/allocators/supermalloc.py +++ /dev/null @@ -1,42 +0,0 @@ -# Copyright 2018-2019 Florian Fischer -# -# This file is part of allocbench. -# -# allocbench is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# allocbench is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with allocbench. -"""SuperMalloc definition for allocbench""" - -from src.allocator import Allocator -from src.artifact import GitArtifact - - -class SuperMalloc(Allocator): - """SuperMalloc allocator""" - - sources = GitArtifact("SuperMalloc", - "https://github.com/kuszmaul/SuperMalloc") - - def __init__(self, name, **kwargs): - self.LD_PRELOAD = "{dir}/libsupermalloc.so" - self.build_cmds = [ - "cd {srcdir}/release; make", "mkdir -p {dir}", - "ln -f -s {srcdir}/release/lib/libsupermalloc.so {dir}/libsupermalloc.so" - ] - self.patches = ["{patchdir}/remove_faulty_aligned_alloc_test.patch"] - - super().__init__(name, **kwargs) - - -supermalloc = SuperMalloc("SuperMalloc", - color="xkcd:lime", - version="709663fb81ba091b0a78058869a644a272f4163d") diff --git a/src/allocators/supermalloc/remove_faulty_aligned_alloc_test.patch b/src/allocators/supermalloc/remove_faulty_aligned_alloc_test.patch deleted file mode 100644 index 074f758..0000000 --- a/src/allocators/supermalloc/remove_faulty_aligned_alloc_test.patch +++ /dev/null @@ -1,13 +0,0 @@ -diff --git Makefile.include Makefile.include -index bb3cef3..09ee7eb 100644 ---- Makefile.include -+++ Makefile.include -@@ -37,7 +37,7 @@ default: tests - #lib: $(LIB)/libsupermalloc.so - #.PHONY: lib - --TESTS = aligned_alloc calloc posix_memalign $(UNITTESTS) test-malloc_test new-malloc-test malloc-test-fixed-work test22 cache-index madvise-small test38 test-no-overlaps #unit-timing -+TESTS = calloc posix_memalign $(UNITTESTS) test-malloc_test new-malloc-test malloc-test-fixed-work test22 cache-index madvise-small test38 test-no-overlaps #unit-timing - TESTS_IN_DIR = $(patsubst %, $(BLD)/%, $(TESTS)) - - LDFLAGS += -ldl diff --git a/src/allocators/tbbmalloc.py b/src/allocators/tbbmalloc.py deleted file mode 100644 index 6580939..0000000 --- a/src/allocators/tbbmalloc.py +++ /dev/null @@ -1,38 +0,0 @@ -# Copyright 2018-2019 Florian Fischer -# -# This file is part of allocbench. -# -# allocbench is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# allocbench is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with allocbench. -"""tbbmalloc definition for allocbench""" - -from src.allocator import Allocator -from src.artifact import GitArtifact - - -class TBBMalloc(Allocator): - """tbbmalloc allocator""" - - sources = GitArtifact("tbb", "https://github.com/intel/tbb.git") - - def __init__(self, name, **kwargs): - self.LD_PRELOAD = "{dir}/libtbbmalloc.so" - self.build_cmds = [ - "cd {srcdir}; make tbbmalloc -j4", "mkdir -p {dir}", - 'ln -f -s $(find {srcdir} -executable -name "*libtbbmalloc_proxy.so*" | head -1) {dir}/libtbbmalloc.so' - ] - - super().__init__(name, **kwargs) - - -tbbmalloc = TBBMalloc("tbbmalloc", color="xkcd:green", version="2019_U8") diff --git a/src/allocators/tcmalloc.py b/src/allocators/tcmalloc.py deleted file mode 100644 index 7f67146..0000000 --- a/src/allocators/tcmalloc.py +++ /dev/null @@ -1,90 +0,0 @@ -# Copyright 2018-2019 Florian Fischer -# -# This file is part of allocbench. -# -# allocbench is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# allocbench is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with allocbench. -"""TCMalloc definition for allocbench""" - -from src.allocator import Allocator, BUILDDIR -from src.artifact import GitArtifact - - -class TCMalloc(Allocator): - """TCMalloc allocator""" - - sources = GitArtifact("tcmalloc", "https://github.com/google/tcmalloc.git") - - def __init__(self, name, **kwargs): - - self.LD_PRELOAD = "{dir}/libtcmalloc.so" - self.patches = ["{patchdir}/tcmalloc_bazel_build_so.patch"] - self.build_cmds = [ - "cd {srcdir}; bazel build tcmalloc/tcmalloc.so --compilation_mode opt", - "mkdir -p {dir}", - "cp -f {srcdir}/bazel-bin/tcmalloc/tcmalloc.so {dir}/libtcmalloc.so" - ] - - super().__init__(name, **kwargs) - - -tcmalloc = TCMalloc("TCMalloc", - color="xkcd:blue", - version="1676100265bd189df6b5513feac15f102542367e") - -tcmalloc_align = TCMalloc("TCMalloc-Aligned", - version="1676100265bd189df6b5513feac15f102542367e", - color="xkcd:light blue") - -tcmalloc_align.LD_PRELOAD = f"{BUILDDIR}/align_to_cl.so {tcmalloc_align.LD_PRELOAD}" - - -class TCMallocGperftools(Allocator): - """gperftools TCMalloc allocator""" - - sources = GitArtifact("gperftools", - "https://github.com/gperftools/gperftools.git") - - def __init__(self, name, **kwargs): - - self.LD_PRELOAD = "{dir}/lib/libtcmalloc.so" - self.prepare_cmds = ["./autogen.sh"] - self.build_cmds = [ - "cd {srcdir}; ./configure --prefix={dir}", - "cd {srcdir}; make install -j4" - ] - - super().__init__(name, **kwargs) - - -tcmalloc_gperftools = TCMallocGperftools("TCMalloc-gperftools", - color="xkcd:dark blue", - version="gperftools-2.7") - -tcmalloc_gperftools_nofs = TCMallocGperftools( - "TCMalloc-Gperftools-NoFalsesharing", - patches=["{patchdir}/tcmalloc_2.7_no_active_falsesharing.patch"], - version="gperftools-2.7", - color="xkcd:navy") - -tcmalloc_gperftools_align = TCMallocGperftools("TCMalloc-Gperftools-Aligned", - version="gperftools-2.7", - color="xkcd:navy blue") - -tcmalloc_gperftools_align.LD_PRELOAD = f"{BUILDDIR}/align_to_cl.so {tcmalloc_gperftools_align.LD_PRELOAD}" - -tcmalloc_gperftools_cacheline_exclusive = TCMallocGperftools( - "TCMalloc-Gperftools-Cacheline-Exclusive", - patches=["{patchdir}/tcmalloc_2.7_cacheline_exclusive.patch"], - version="gperftools-2.7", - color="xkcd:royal blue") diff --git a/src/allocators/tcmalloc/tcmalloc_2.7_cacheline_exclusive.patch b/src/allocators/tcmalloc/tcmalloc_2.7_cacheline_exclusive.patch deleted file mode 100644 index bdd63e3..0000000 --- a/src/allocators/tcmalloc/tcmalloc_2.7_cacheline_exclusive.patch +++ /dev/null @@ -1,26 +0,0 @@ -diff --git src/common.cc src/common.cc -index 203afdf..9257518 100644 ---- src/common.cc -+++ src/common.cc -@@ -79,7 +79,7 @@ int AlignmentForSize(size_t size) { - if (size > kMaxSize) { - // Cap alignment at kPageSize for large sizes. - alignment = kPageSize; -- } else if (size >= 128) { -+ } else if (size >= 512) { - // Space wasted due to alignment is at most 1/8, i.e., 12.5%. - alignment = (1 << LgFloor(size)) / 8; - } else if (size >= kMinAlign) { -diff --git a/src/common.h b/src/common.h -index cb45315..4131a13 100644 ---- src/common.h -+++ src/common.h -@@ -61,7 +61,7 @@ typedef uintptr_t Length; - // waste due alignment of 25%. (eg malloc of 24 bytes will get 32 bytes) - static const size_t kMinAlign = 8; - #else --static const size_t kMinAlign = 16; -+static const size_t kMinAlign = 64; - #endif - - // Using large pages speeds up the execution at a cost of larger memory use. diff --git a/src/allocators/tcmalloc/tcmalloc_2.7_no_active_falsesharing.patch b/src/allocators/tcmalloc/tcmalloc_2.7_no_active_falsesharing.patch deleted file mode 100644 index a76a2f2..0000000 --- a/src/allocators/tcmalloc/tcmalloc_2.7_no_active_falsesharing.patch +++ /dev/null @@ -1,17 +0,0 @@ -diff --git src/thread_cache.cc src/thread_cache.cc -index 6d2f832..2074f4a 100644 ---- src/thread_cache.cc -+++ src/thread_cache.cc -@@ -120,7 +120,11 @@ void* ThreadCache::FetchFromCentralCache(uint32 cl, int32_t byte_size, - ASSERT(list->empty()); - const int batch_size = Static::sizemap()->num_objects_to_move(cl); - -- const int num_to_move = min(list->max_length(), batch_size); -+ int num_to_move = min(list->max_length(), batch_size); -+ const int cache_line_parts = 64 / byte_size; -+ if (cache_line_parts > 0 && cache_line_parts > num_to_move) -+ num_to_move = cache_line_parts; -+ - void *start, *end; - int fetch_count = Static::central_cache()[cl].RemoveRange( - &start, &end, num_to_move); diff --git a/src/allocators/tcmalloc/tcmalloc_bazel_build_so.patch b/src/allocators/tcmalloc/tcmalloc_bazel_build_so.patch deleted file mode 100644 index cdd2840..0000000 --- a/src/allocators/tcmalloc/tcmalloc_bazel_build_so.patch +++ /dev/null @@ -1,22 +0,0 @@ -diff --git tcmalloc/BUILD tcmalloc/BUILD -index 66d160e..25946af 100644 ---- tcmalloc/BUILD -+++ tcmalloc/BUILD -@@ -109,6 +109,17 @@ cc_library( - alwayslink = 1, - ) - -+# This library provides tcmalloc as shared object -+cc_binary( -+ name = "tcmalloc.so", -+ copts = TCMALLOC_DEFAULT_COPTS, -+ linkshared = 1, -+ linkstatic = 1, -+ deps = overlay_deps + tcmalloc_deps + [ -+ ":tcmalloc", -+ ] -+) -+ - # Provides tcmalloc always; use per-thread mode. - # - cc_library( -- cgit v1.2.3