Skip to content
Snippets Groups Projects
  • Nat Goodspeed's avatar
    52899ed6
    DRTVWR-418, MAINT-6996: Rationalize LLMemory wrt 64-bit support. · 52899ed6
    Nat Goodspeed authored
    There were two distinct LLMemory methods getCurrentRSS() and
    getWorkingSetSize(). It was pointless to have both: on Windows they were
    completely redundant; on other platforms getWorkingSetSize() always returned
    0. (Amusingly, though the Windows implementations both made exactly the same
    GetProcessMemoryInfo() call and used exactly the same logic, the code was
    different in the two -- as though the second was implemented without awareness
    of the first, even though they were adjacent in the source file.)
    
    One of the actual MAINT-6996 problems was due to the fact that
    getWorkingSetSize() returned U32, where getCurrentRSS() returns U64. In other
    words, getWorkingSetSize() was both useless *and* wrong. Remove it, and change
    its one call to getCurrentRSS() instead.
    
    The other culprit was that in several places, the 64-bit WorkingSetSize
    returned by the Windows GetProcessMemoryInfo() call (and by getCurrentRSS())
    was explicitly cast to a 32-bit data type. That works only when explicitly or
    implicitly (using LLUnits type conversion) scaling the value to kilobytes or
    megabytes. When the size in bytes is desired, use 64-bit types instead.
    
    In addition to the symptoms, LLMemory was overdue for a bit of cleanup.
    
    There was a 16K block of memory called reserveMem, the comment on which read:
    "reserve 16K for out of memory error handling." Yet *nothing* was ever done
    with that block! If it were going to be useful, one would think someone would
    at some point explicitly free the block. In fact there was a method
    freeReserve(), apparently for just that purpose -- which was never called. As
    things stood, reserveMem served only to *prevent* the viewer from ever using
    that chunk of memory. Remove reserveMem and the unused freeReserve().
    
    The only function of initClass() and cleanupClass() was to allocate and free
    reserveMem. Remove initClass(), cleanupClass() and the LLCommon calls to them.
    
    In a similar vein, there was an LLMemoryInfo::getPhysicalMemoryClamped()
    method that returned U32Bytes. Its job was simply to return a size in bytes
    that could fit into a U32 data type, returning U32_MAX if the 64-bit value
    exceeded 4GB. Eliminate that; change all its calls to getPhysicalMemoryKB()
    (which getPhysicalMemoryClamped() used internally anyway). We no longer care
    about any platform that cannot handle 64-bit data types.
    52899ed6
    History
    DRTVWR-418, MAINT-6996: Rationalize LLMemory wrt 64-bit support.
    Nat Goodspeed authored
    There were two distinct LLMemory methods getCurrentRSS() and
    getWorkingSetSize(). It was pointless to have both: on Windows they were
    completely redundant; on other platforms getWorkingSetSize() always returned
    0. (Amusingly, though the Windows implementations both made exactly the same
    GetProcessMemoryInfo() call and used exactly the same logic, the code was
    different in the two -- as though the second was implemented without awareness
    of the first, even though they were adjacent in the source file.)
    
    One of the actual MAINT-6996 problems was due to the fact that
    getWorkingSetSize() returned U32, where getCurrentRSS() returns U64. In other
    words, getWorkingSetSize() was both useless *and* wrong. Remove it, and change
    its one call to getCurrentRSS() instead.
    
    The other culprit was that in several places, the 64-bit WorkingSetSize
    returned by the Windows GetProcessMemoryInfo() call (and by getCurrentRSS())
    was explicitly cast to a 32-bit data type. That works only when explicitly or
    implicitly (using LLUnits type conversion) scaling the value to kilobytes or
    megabytes. When the size in bytes is desired, use 64-bit types instead.
    
    In addition to the symptoms, LLMemory was overdue for a bit of cleanup.
    
    There was a 16K block of memory called reserveMem, the comment on which read:
    "reserve 16K for out of memory error handling." Yet *nothing* was ever done
    with that block! If it were going to be useful, one would think someone would
    at some point explicitly free the block. In fact there was a method
    freeReserve(), apparently for just that purpose -- which was never called. As
    things stood, reserveMem served only to *prevent* the viewer from ever using
    that chunk of memory. Remove reserveMem and the unused freeReserve().
    
    The only function of initClass() and cleanupClass() was to allocate and free
    reserveMem. Remove initClass(), cleanupClass() and the LLCommon calls to them.
    
    In a similar vein, there was an LLMemoryInfo::getPhysicalMemoryClamped()
    method that returned U32Bytes. Its job was simply to return a size in bytes
    that could fit into a U32 data type, returning U32_MAX if the 64-bit value
    exceeded 4GB. Eliminate that; change all its calls to getPhysicalMemoryKB()
    (which getPhysicalMemoryClamped() used internally anyway). We no longer care
    about any platform that cannot handle 64-bit data types.
Code owners
Assign users and groups as approvers for specific file changes. Learn more.