1# Copyright 2023 The Pigweed Authors 2# 3# Licensed under the Apache License, Version 2.0 (the "License"); you may not 4# use this file except in compliance with the License. You may obtain a copy of 5# the License at 6# 7# https://www.apache.org/licenses/LICENSE-2.0 8# 9# Unless required by applicable law or agreed to in writing, software 10# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT 11# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the 12# License for the specific language governing permissions and limitations under 13# the License. 14 15include($ENV{PW_ROOT}/pw_build/pigweed.cmake) 16 17# The core target of this module. 18 19pw_add_library(pw_allocator STATIC 20 HEADERS 21 public/pw_allocator/allocator.h 22 public/pw_allocator/capability.h 23 public/pw_allocator/deallocator.h 24 public/pw_allocator/internal/managed_ptr.h 25 public/pw_allocator/layout.h 26 public/pw_allocator/pool.h 27 public/pw_allocator/unique_ptr.h 28 PUBLIC_INCLUDES 29 public 30 PUBLIC_DEPS 31 pw_allocator.config 32 pw_allocator.hardening 33 pw_numeric.checked_arithmetic 34 pw_bytes 35 pw_preprocessor 36 pw_status 37 pw_result 38 PRIVATE_DEPS 39 pw_assert 40 pw_bytes.alignment 41 pw_third_party.fuchsia.stdcompat 42 SOURCES 43 allocator.cc 44 managed_ptr.cc 45) 46 47# Module configuration 48 49pw_add_module_config(pw_allocator_CONFIG) 50 51pw_add_library(pw_allocator.config INTERFACE 52 HEADERS 53 public/pw_allocator/config.h 54 PUBLIC_INCLUDES 55 public 56 PUBLIC_DEPS 57 ${pw_allocator_CONFIG} 58) 59 60pw_add_library(pw_allocator.test_config INTERFACE 61 PUBLIC_DEFINES 62 PW_ALLOCATOR_HARDENING=PW_ALLOCATOR_HARDENING_DEBUG 63 PW_ALLOCATOR_BLOCK_POISON_INTERVAL=4 64) 65 66# Libraries 67 68# TODO(b/376730645): Remove deprecated alias. 69pw_add_library(pw_allocator.allocator INTERFACE 70 PUBLIC_DEPS 71 pw_allocator 72) 73 74pw_add_library(pw_allocator.allocator_as_pool STATIC 75 HEADERS 76 public/pw_allocator/allocator_as_pool.h 77 PUBLIC_INCLUDES 78 public 79 PUBLIC_DEPS 80 pw_allocator 81 pw_status 82 SOURCES 83 allocator_as_pool.cc 84) 85 86pw_add_library(pw_allocator.best_fit INTERFACE 87 HEADERS 88 public/pw_allocator/best_fit.h 89 PUBLIC_INCLUDES 90 public 91 PUBLIC_DEPS 92 pw_allocator.block_allocator 93 pw_allocator.block.detailed_block 94 pw_allocator.bucket.sorted 95 pw_allocator.bucket.fast_sorted 96 pw_allocator.config 97) 98 99pw_add_library(pw_allocator.best_fit_block_allocator INTERFACE 100 HEADERS 101 public/pw_allocator/best_fit_block_allocator.h 102 PUBLIC_INCLUDES 103 public 104 PUBLIC_DEPS 105 pw_allocator.best_fit 106 pw_allocator.config 107) 108 109# TODO(b/376730645): Deprecated; use pw_allocator.block.detailed_block or 110# similar instead. 111pw_add_library(pw_allocator.block INTERFACE 112 PUBLIC_DEPS 113 pw_allocator.block.detailed_block 114) 115 116pw_add_library(pw_allocator.block_allocator STATIC 117 HEADERS 118 public/pw_allocator/block_allocator.h 119 PUBLIC_INCLUDES 120 public 121 PUBLIC_DEPS 122 pw_allocator 123 pw_allocator.config 124 pw_allocator.block.allocatable 125 pw_allocator.block.basic 126 pw_allocator.block.iterable 127 pw_allocator.block.result 128 pw_allocator.block.poisonable 129 pw_allocator.block.with_layout 130 pw_allocator.fragmentation 131 pw_allocator.hardening 132 pw_bytes 133 pw_result 134 pw_status 135 PRIVATE_DEPS 136 pw_assert 137 SOURCES 138 block_allocator.cc 139) 140 141pw_add_library(pw_allocator.bucket_allocator INTERFACE 142 HEADERS 143 public/pw_allocator/bucket_allocator.h 144 PUBLIC_INCLUDES 145 public 146 PUBLIC_DEPS 147 pw_allocator.block_allocator 148 pw_allocator.block.detailed_block 149 pw_allocator.bucket.unordered 150 pw_status 151) 152 153# TODO(b/376730645): Remove deprecated interfaces. 154pw_add_library(pw_allocator.bucket_block_allocator INTERFACE 155 PUBLIC_DEPS 156 pw_allocator.bucket_allocator 157) 158 159pw_add_library(pw_allocator.buddy_allocator STATIC 160 HEADERS 161 public/pw_allocator/buddy_allocator.h 162 PUBLIC_INCLUDES 163 public 164 PUBLIC_DEPS 165 pw_allocator 166 pw_allocator.block.basic 167 pw_allocator.bucket.unordered 168 pw_allocator.hardening 169 pw_bytes 170 pw_containers.vector 171 pw_status 172 PRIVATE_DEPS 173 pw_assert 174 pw_third_party.fuchsia.stdcompat 175 SOURCES 176 buddy_allocator.cc 177) 178 179pw_add_library(pw_allocator.buffer INTERFACE 180 HEADERS 181 public/pw_allocator/buffer.h 182 PUBLIC_INCLUDES 183 public 184 PUBLIC_DEPS 185 pw_bytes 186 pw_result 187) 188 189pw_add_library(pw_allocator.bump_allocator STATIC 190 HEADERS 191 public/pw_allocator/bump_allocator.h 192 PUBLIC_INCLUDES 193 public 194 PUBLIC_DEPS 195 pw_allocator 196 pw_bytes 197 PRIVATE_DEPS 198 pw_allocator.buffer 199 pw_bytes.alignment 200 SOURCES 201 bump_allocator.cc 202) 203 204pw_add_library(pw_allocator.chunk_pool STATIC 205 HEADERS 206 public/pw_allocator/chunk_pool.h 207 PUBLIC_INCLUDES 208 public 209 PUBLIC_DEPS 210 pw_allocator 211 pw_bytes 212 pw_result 213 pw_status 214 PRIVATE_DEPS 215 pw_allocator.buffer 216 pw_bytes.alignment 217 pw_assert.check 218 pw_third_party.fuchsia.stdcompat 219 SOURCES 220 chunk_pool.cc 221) 222 223# TODO(b/376730645): Remove deprecated alias. 224pw_add_library(pw_allocator.deallocator INTERFACE 225 PUBLIC_DEPS 226 pw_allocator 227) 228 229pw_add_library(pw_allocator.dl_allocator INTERFACE 230 HEADERS 231 public/pw_allocator/dl_allocator.h 232 PUBLIC_INCLUDES 233 public 234 PUBLIC_DEPS 235 pw_allocator.block_allocator 236 pw_allocator.block.detailed_block 237 pw_allocator.bucket.fast_sorted 238 pw_allocator.bucket.unordered 239 pw_allocator.config 240 pw_third_party.fuchsia.stdcompat 241) 242 243 # TODO(b/376730645): Remove deprecated interfaces. 244pw_add_library(pw_allocator.dual_first_fit_block_allocator INTERFACE 245 HEADERS 246 public/pw_allocator/dual_first_fit_block_allocator.h 247 PUBLIC_INCLUDES 248 public 249 PUBLIC_DEPS 250 pw_allocator.first_fit 251) 252 253pw_add_library(pw_allocator.fallback_allocator STATIC 254 SOURCES 255 fallback_allocator.cc 256 HEADERS 257 public/pw_allocator/fallback_allocator.h 258 PUBLIC_INCLUDES 259 public 260 PUBLIC_DEPS 261 pw_allocator 262 pw_result 263 pw_status 264 PRIVATE_DEPS 265 pw_assert.check 266) 267 268pw_add_library(pw_allocator.first_fit INTERFACE 269 HEADERS 270 public/pw_allocator/first_fit.h 271 PUBLIC_INCLUDES 272 public 273 PUBLIC_DEPS 274 pw_allocator.block_allocator 275 pw_allocator.config 276 pw_allocator.block.detailed_block 277 pw_allocator.bucket.sequenced 278) 279 280# TODO(b/376730645): Remove deprecated interfaces. 281pw_add_library(pw_allocator.first_fit_block_allocator INTERFACE 282 HEADERS 283 public/pw_allocator/first_fit_block_allocator.h 284 PUBLIC_INCLUDES 285 public 286 PUBLIC_DEPS 287 pw_allocator.first_fit 288) 289 290pw_add_library(pw_allocator.fragmentation STATIC 291 HEADERS 292 public/pw_allocator/fragmentation.h 293 PUBLIC_INCLUDES 294 public 295 SOURCES 296 fragmentation.cc 297) 298 299pw_add_library(pw_allocator.freelist_heap INTERFACE 300 HEADERS 301 public/pw_allocator/freelist_heap.h 302 PUBLIC_INCLUDES 303 public 304 PUBLIC_DEPS 305 pw_allocator.bucket_allocator 306 pw_allocator.hardening 307 pw_bytes 308) 309 310pw_add_library(pw_allocator.hardening INTERFACE 311 HEADERS 312 public/pw_allocator/hardening.h 313 PUBLIC_INCLUDES 314 public 315 PUBLIC_DEPS 316 pw_allocator.config 317 pw_assert 318 pw_preprocessor 319) 320 321# TODO(b/376730645): Remove deprecated interfaces. 322pw_add_library(pw_allocator.last_fit_block_allocator INTERFACE 323 HEADERS 324 public/pw_allocator/last_fit_block_allocator.h 325 PUBLIC_INCLUDES 326 public 327 PUBLIC_DEPS 328 pw_allocator.first_fit 329) 330 331pw_add_library(pw_allocator.libc_allocator STATIC 332 SOURCES 333 libc_allocator.cc 334 HEADERS 335 public/pw_allocator/libc_allocator.h 336 PUBLIC_INCLUDES 337 public 338 PUBLIC_DEPS 339 pw_allocator 340) 341 342pw_add_library(pw_allocator.null_allocator STATIC 343 SOURCES 344 null_allocator.cc 345 HEADERS 346 public/pw_allocator/null_allocator.h 347 PUBLIC_INCLUDES 348 public 349 PUBLIC_DEPS 350 pw_allocator 351) 352 353pw_add_library(pw_allocator.metrics INTERFACE 354 HEADERS 355 public/pw_allocator/metrics.h 356 PUBLIC_INCLUDES 357 public 358 PUBLIC_DEPS 359 pw_allocator 360 pw_metric 361) 362 363pw_add_library(pw_allocator.pmr_allocator STATIC 364 HEADERS 365 public/pw_allocator/pmr_allocator.h 366 PUBLIC_INCLUDES 367 public 368 PUBLIC_DEPS 369 pw_allocator 370 pw_allocator.config 371 pw_assert 372 pw_status 373 SOURCES 374 pmr_allocator.cc 375) 376 377# TODO(b/376730645): Remove deprecated alias. 378pw_add_library(pw_allocator.pool INTERFACE 379 PUBLIC_DEPS 380 pw_allocator 381) 382 383pw_add_library(pw_allocator.synchronized_allocator INTERFACE 384 HEADERS 385 public/pw_allocator/synchronized_allocator.h 386 PUBLIC_INCLUDES 387 public 388 PUBLIC_DEPS 389 pw_allocator 390 pw_sync.borrow 391 pw_sync.lock_annotations 392) 393 394pw_add_library(pw_allocator.tlsf_allocator INTERFACE 395 HEADERS 396 public/pw_allocator/tlsf_allocator.h 397 PUBLIC_INCLUDES 398 public 399 PUBLIC_DEPS 400 pw_allocator.block_allocator 401 pw_allocator.block.detailed_block 402 pw_allocator.bucket.sorted 403 pw_allocator.bucket.fast_sorted 404 pw_allocator.config 405 pw_third_party.fuchsia.stdcompat 406) 407 408pw_add_library(pw_allocator.tracking_allocator INTERFACE 409 HEADERS 410 public/pw_allocator/tracking_allocator.h 411 PUBLIC_INCLUDES 412 public 413 PUBLIC_DEPS 414 pw_allocator 415 pw_allocator.metrics 416 pw_status 417 PRIVATE_DEPS 418 pw_assert 419) 420 421pw_add_library(pw_allocator.typed_pool INTERFACE 422 HEADERS 423 public/pw_allocator/typed_pool.h 424 PUBLIC_INCLUDES 425 public 426 PUBLIC_DEPS 427 pw_allocator.chunk_pool 428 pw_allocator.hardening 429 pw_bytes 430) 431 432pw_add_library(pw_allocator.worst_fit INTERFACE 433 HEADERS 434 public/pw_allocator/worst_fit.h 435 PUBLIC_INCLUDES 436 public 437 PUBLIC_DEPS 438 pw_allocator.block_allocator 439 pw_allocator.block.detailed_block 440 pw_allocator.bucket.sorted 441 pw_allocator.bucket.fast_sorted 442 pw_allocator.config 443) 444 445pw_add_library(pw_allocator.worst_fit_block_allocator INTERFACE 446 HEADERS 447 public/pw_allocator/worst_fit_block_allocator.h 448 PUBLIC_INCLUDES 449 public 450 PUBLIC_DEPS 451 pw_allocator.worst_fit 452 pw_allocator.config 453) 454 455 456# Test support 457 458pw_add_library(pw_allocator.testing INTERFACE 459 HEADERS 460 public/pw_allocator/testing.h 461 PUBLIC_INCLUDES 462 public 463 PUBLIC_DEPS 464 pw_allocator 465 pw_allocator.buffer 466 pw_allocator.first_fit 467 pw_allocator.hardening 468 pw_allocator.test_config 469 pw_allocator.tracking_allocator 470 pw_bytes 471 pw_result 472 pw_status 473 pw_unit_test 474 PRIVATE_DEPS 475 pw_assert 476) 477 478pw_add_library(pw_allocator.block_allocator_testing STATIC 479 HEADERS 480 public/pw_allocator/block_allocator_testing.h 481 PUBLIC_INCLUDES 482 public 483 PUBLIC_DEPS 484 pw_allocator 485 pw_allocator.block.testing 486 pw_allocator.block_allocator 487 pw_allocator.block.detailed_block 488 pw_allocator.buffer 489 pw_allocator.fuzzing 490 pw_allocator.test_harness 491 pw_unit_test 492 PRIVATE_DEPS 493 pw_assert 494 pw_bytes.alignment 495 pw_status 496 pw_third_party.fuchsia.stdcompat 497 SOURCES 498 block_allocator_testing.cc 499) 500 501pw_add_library(pw_allocator.managed_ptr_testing STATIC 502 HEADERS 503 public/pw_allocator/internal/managed_ptr_testing.h 504 PUBLIC_INCLUDES 505 public 506 PUBLIC_DEPS 507 pw_allocator 508 pw_allocator.testing 509 pw_unit_test 510 SOURCES 511 managed_ptr_testing.cc 512) 513 514pw_add_library(pw_allocator.test_harness STATIC 515 HEADERS 516 public/pw_allocator/test_harness.h 517 PUBLIC_INCLUDES 518 public 519 PUBLIC_DEPS 520 pw_allocator 521 pw_containers.intrusive_list 522 pw_containers.vector 523 pw_random 524 PRIVATE_DEPS 525 pw_assert 526 pw_third_party.fuchsia.stdcompat 527 SOURCES 528 test_harness.cc 529) 530 531pw_add_library(pw_allocator.fuzzing STATIC 532 HEADERS 533 public/pw_allocator/fuzzing.h 534 PUBLIC_INCLUDES 535 public 536 PUBLIC_DEPS 537 pw_allocator 538 pw_allocator.test_harness 539 pw_fuzzer.fuzztest 540 SOURCES 541 fuzzing.cc 542) 543 544# Tests 545 546pw_add_test(pw_allocator.allocator_as_pool_test 547 SOURCES 548 allocator_as_pool_test.cc 549 PRIVATE_DEPS 550 pw_allocator 551 pw_allocator.allocator_as_pool 552 pw_allocator.testing 553 GROUPS 554 modules 555 pw_allocator 556) 557 558pw_add_test(pw_allocator.allocator_test 559 SOURCES 560 allocator_test.cc 561 PRIVATE_DEPS 562 pw_allocator 563 pw_allocator.testing 564 GROUPS 565 modules 566 pw_allocator 567) 568 569pw_add_test(pw_allocator.best_fit_test 570 SOURCES 571 best_fit_test.cc 572 PRIVATE_DEPS 573 pw_allocator.best_fit 574 pw_allocator.best_fit_block_allocator 575 pw_allocator.block_allocator_testing 576 pw_allocator.buffer 577 GROUPS 578 modules 579 pw_allocator 580) 581 582pw_add_test(pw_allocator.bucket_allocator_test 583 SOURCES 584 bucket_allocator_test.cc 585 PRIVATE_DEPS 586 pw_allocator 587 pw_allocator.block_allocator_testing 588 pw_allocator.bucket_allocator 589 pw_allocator.bucket_block_allocator 590 GROUPS 591 modules 592 pw_allocator 593) 594 595pw_add_test(pw_allocator.buddy_allocator_test 596 SOURCES 597 buddy_allocator_test.cc 598 PRIVATE_DEPS 599 pw_allocator.buddy_allocator 600 pw_allocator.fuzzing 601 pw_allocator.testing 602 GROUPS 603 modules 604 pw_allocator 605) 606 607pw_add_test(pw_allocator.buffer_test 608 SOURCES 609 buffer_test.cc 610 PRIVATE_DEPS 611 pw_allocator.buffer 612 pw_allocator.testing 613 pw_bytes 614 pw_result 615 pw_third_party.fuchsia.stdcompat 616 GROUPS 617 modules 618 pw_allocator 619) 620 621pw_add_test(pw_allocator.bump_allocator_test 622 SOURCES 623 bump_allocator_test.cc 624 PRIVATE_DEPS 625 pw_allocator.bump_allocator 626 pw_allocator.testing 627 pw_third_party.fuchsia.stdcompat 628 GROUPS 629 modules 630 pw_allocator 631) 632 633pw_add_test(pw_allocator.chunk_pool_test 634 SOURCES 635 chunk_pool_test.cc 636 PRIVATE_DEPS 637 pw_allocator.chunk_pool 638 pw_allocator.testing 639 GROUPS 640 modules 641 pw_allocator 642) 643 644pw_add_test(pw_allocator.dl_allocator_test 645 SOURCES 646 dl_allocator_test.cc 647 PRIVATE_DEPS 648 pw_allocator.block_allocator_testing 649 pw_allocator.dl_allocator 650 GROUPS 651 modules 652 pw_allocator 653) 654 655pw_add_test(pw_allocator.fallback_allocator_test 656 PRIVATE_DEPS 657 pw_allocator.testing 658 pw_allocator.fallback_allocator 659 pw_status 660 SOURCES 661 fallback_allocator_test.cc 662 GROUPS 663 modules 664 pw_allocator 665) 666 667pw_add_test(pw_allocator.first_fit_test 668 SOURCES 669 first_fit_test.cc 670 PRIVATE_DEPS 671 pw_allocator.block_allocator_testing 672 pw_allocator.buffer 673 pw_allocator.dual_first_fit_block_allocator 674 pw_allocator.first_fit 675 pw_allocator.first_fit_block_allocator 676 pw_allocator.last_fit_block_allocator 677 pw_third_party.fuchsia.stdcompat 678 GROUPS 679 modules 680 pw_allocator 681) 682 683pw_add_test(pw_allocator.fragmentation_test 684 SOURCES 685 fragmentation_test.cc 686 PRIVATE_DEPS 687 pw_allocator.fragmentation 688 pw_allocator.testing 689 GROUPS 690 modules 691 pw_allocator 692) 693 694pw_add_test(pw_allocator.freelist_heap_test 695 SOURCES 696 freelist_heap_test.cc 697 PRIVATE_DEPS 698 pw_allocator.block.testing 699 pw_allocator.freelist_heap 700 pw_allocator.testing 701 pw_bytes.alignment 702 pw_third_party.fuchsia.stdcompat 703 GROUPS 704 modules 705 pw_allocator 706) 707 708pw_add_test(pw_allocator.layout_test 709 SOURCES 710 layout_test.cc 711 PRIVATE_DEPS 712 pw_allocator 713 pw_allocator.testing 714 pw_result 715 pw_status 716 GROUPS 717 modules 718 pw_allocator 719) 720 721pw_add_test(pw_allocator.libc_allocator_test 722 SOURCES 723 libc_allocator_test.cc 724 PRIVATE_DEPS 725 pw_allocator.libc_allocator 726 pw_allocator.testing 727 pw_unit_test 728 GROUPS 729 modules 730 pw_allocator 731) 732 733pw_add_test(pw_allocator.metrics_test 734 SOURCES 735 metrics_test.cc 736 PRIVATE_DEPS 737 pw_allocator.metrics 738 pw_unit_test 739 GROUPS 740 modules 741 pw_allocator 742) 743 744pw_add_test(pw_allocator.null_allocator_test 745 SOURCES 746 null_allocator_test.cc 747 PRIVATE_DEPS 748 pw_allocator.null_allocator 749 pw_allocator.testing 750 pw_unit_test 751 GROUPS 752 modules 753 pw_allocator 754) 755 756pw_add_test(pw_allocator.pmr_allocator_test 757 SOURCES 758 pmr_allocator_test.cc 759 PRIVATE_DEPS 760 pw_allocator.pmr_allocator 761 pw_allocator.testing 762 pw_unit_test 763 GROUPS 764 modules 765 pw_allocator 766) 767 768pw_add_test(pw_allocator.synchronized_allocator_test 769 SOURCES 770 synchronized_allocator_test.cc 771 PRIVATE_DEPS 772 pw_allocator.testing 773 pw_allocator.test_harness 774 pw_allocator.synchronized_allocator 775 pw_containers.vector 776 pw_random 777 pw_status 778 pw_sync.binary_semaphore 779 pw_sync.interrupt_spin_lock 780 pw_sync.mutex 781 pw_thread.test_thread_context 782 pw_thread.thread 783 pw_thread.thread_core 784 pw_thread.yield 785 GROUPS 786 modules 787 pw_allocator 788) 789 790pw_add_test(pw_allocator.tlsf_allocator_test 791 SOURCES 792 tlsf_allocator_test.cc 793 PRIVATE_DEPS 794 pw_allocator.block_allocator_testing 795 pw_allocator.tlsf_allocator 796 GROUPS 797 modules 798 pw_allocator 799) 800 801pw_add_test(pw_allocator.tracking_allocator_test 802 SOURCES 803 tracking_allocator_test.cc 804 PRIVATE_DEPS 805 pw_allocator 806 pw_allocator.first_fit 807 pw_allocator.metrics 808 pw_allocator.testing 809 pw_allocator.tracking_allocator 810 pw_log 811 pw_metric 812 GROUPS 813 modules 814 pw_allocator 815) 816 817pw_add_test(pw_allocator.typed_pool_test 818 SOURCES 819 typed_pool_test.cc 820 PRIVATE_DEPS 821 pw_allocator 822 pw_allocator.testing 823 pw_allocator.typed_pool 824 pw_bytes.alignment 825 pw_unit_test 826 GROUPS 827 modules 828 pw_allocator 829) 830 831pw_add_test(pw_allocator.unique_ptr_test 832 SOURCES 833 unique_ptr_test.cc 834 PRIVATE_DEPS 835 pw_allocator 836 pw_allocator.managed_ptr_testing 837 GROUPS 838 modules 839 pw_allocator 840) 841 842pw_add_test(pw_allocator.worst_fit_test 843 SOURCES 844 worst_fit_test.cc 845 PRIVATE_DEPS 846 pw_allocator.block_allocator_testing 847 pw_allocator.worst_fit 848 pw_allocator.worst_fit_block_allocator 849 GROUPS 850 modules 851 pw_allocator 852) 853 854add_subdirectory(benchmarks) 855add_subdirectory(block) 856add_subdirectory(bucket) 857add_subdirectory(examples) 858