From: Mike Stepanek (mstepane) Date: Fri, 22 Feb 2019 15:48:35 +0000 (-0500) Subject: Merge pull request #1524 in SNORT/snort3 from ~PSHINDE2/snort3:memory_tracker_simplif... X-Git-Tag: 3.0.0-251~39 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=0bb8323f6aae61501aaaaa6a9e904448ddf35ceb;p=thirdparty%2Fsnort3.git Merge pull request #1524 in SNORT/snort3 from ~PSHINDE2/snort3:memory_tracker_simplified to master Squashed commit of the following: commit 81eeda054e60e4dd3b56a90f1eba947f1d8816da Author: Pratik Shinde Date: Tue Feb 19 13:16:05 2019 -0500 memory: Use only one variable to keep track of allocated and deallocated memory --- diff --git a/src/memory/memory_cap.cc b/src/memory/memory_cap.cc index 0d29099cf..bb00c15d2 100644 --- a/src/memory/memory_cap.cc +++ b/src/memory/memory_cap.cc @@ -50,28 +50,34 @@ namespace struct Tracker { - size_t allocated = 0; - size_t deallocated = 0; + size_t used_memory = 0; uint64_t allocations = 0; uint64_t deallocations = 0; void allocate(size_t n) - { allocated += n; ++allocations; } + { + used_memory += n; + ++allocations; + } void deallocate(size_t n) - { deallocated += n; ++deallocations; } - - size_t used() const { - // FIXIT-H this assertion fails at analyzer.cc:93 / starting packet thread - // {allocated = 0, deallocated = 48, allocations = 0, deallocations = 1} - //assert(allocated >= deallocated); + // FIXIT-H If memory is allocated in one thread and passed to another thread, + // when it is freed, we may have (used_memory < memory_to_be_freed) + // Following assertion will fail. + //assert(n <= used_memory); - if ( allocated < deallocated ) - return 0; + if(n > used_memory) + return; - return allocated - deallocated; + used_memory -= n; + ++deallocations; + } + + size_t used() const + { + return used_memory; } constexpr Tracker() = default; @@ -93,10 +99,10 @@ inline bool free_space(size_t requested, size_t cap, Tracker& trk, Handler& hand auto used = trk.used(); - if ( used + requested <= cap ) + if ( requested <= cap - used ) return true; - while ( used + requested > cap ) + while ( requested > cap - used ) { handler(); @@ -311,6 +317,15 @@ TEST_CASE( "memory cap free space", "[memory]" ) CHECK_FALSE( memory::free_space(1, 1024, tracker, handler) ); CHECK( handler.calls == 1 ); } + + SECTION( "free_space() does not rollover" ) + { + MockTracker tracker { SIZE_MAX }; + HandlerSpy handler { -5, tracker }; + CHECK( memory::free_space(1, SIZE_MAX, tracker, handler) ); + CHECK( handler.calls == 1 ); + } + } #endif