[Lldb-commits] [lldb] r185046 - Remove the process's reservation cache and don't
Sean Callanan
scallanan at apple.com
Wed Jun 26 17:10:26 PDT 2013
Author: spyffe
Date: Wed Jun 26 19:10:26 2013
New Revision: 185046
URL: http://llvm.org/viewvc/llvm-project?rev=185046&view=rev
Log:
Remove the process's reservation cache and don't
bother checking if a region is safe to use. In
cases where regions need to be synthesized rather
than properly allocated, the memory reads required
to determine whether the area is used are
- insufficient, because intermediate locations
could be in use, and
- unsafe, because on some platforms reading from
memory can trigger events.
All this only makes a difference on platforms
where memory allocation in the target is impossible.
Behavior on platforms where it is possible should
stay the same.
<rdar://problem/14023970>
Modified:
lldb/trunk/include/lldb/Target/Process.h
lldb/trunk/source/Expression/IRMemoryMap.cpp
lldb/trunk/source/Target/Process.cpp
Modified: lldb/trunk/include/lldb/Target/Process.h
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/Target/Process.h?rev=185046&r1=185045&r2=185046&view=diff
==============================================================================
--- lldb/trunk/include/lldb/Target/Process.h (original)
+++ lldb/trunk/include/lldb/Target/Process.h Wed Jun 26 19:10:26 2013
@@ -3526,72 +3526,6 @@ public:
return m_public_run_lock;
}
- //------------------------------------------------------------------
- // This is a cache of reserved and available memory address ranges
- // for a single modification ID (see m_mod_id). It's meant for use
- // by IRMemoryMap, but to stick with the process. These memory
- // ranges happen to be unallocated in the underlying process, but we
- // make no guarantee that at a future modification ID they won't be
- // gone. This is only useful if the underlying process can't
- // allocate memory.
- //
- // When a memory space is determined to be available it is
- // registered as reserved at the current modification. If it is
- // freed later, it is added to the free list if the modification ID
- // hasn't changed. Then clients can simply query the free list for
- // the size they want.
- //------------------------------------------------------------------
- class ReservationCache
- {
- public:
- ReservationCache (Process &process);
-
- //------------------------------------------------------------------
- // Mark that a particular range of addresses is in use. Adds it
- // to the reserved map, implicitly tying it to the current
- // modification ID.
- //------------------------------------------------------------------
- void
- Reserve (lldb::addr_t addr, size_t size);
-
- //------------------------------------------------------------------
- // Mark that a range is no longer in use. If it's found in the
- // reservation list, that means that the modification ID hasn't
- // changed since it was reserved, so it can be safely added to the
- // free list.
- //------------------------------------------------------------------
- void
- Unreserve (lldb::addr_t addr);
-
- //------------------------------------------------------------------
- // Try to find an unused range of the given size in the free list.
- //------------------------------------------------------------------
- lldb::addr_t
- Find (size_t size);
- private:
- //------------------------------------------------------------------
- // Clear all lists if the modification ID has changed.
- //------------------------------------------------------------------
- void CheckModID();
-
- typedef std::map <lldb::addr_t, size_t> ReservedMap;
- typedef std::vector <lldb::addr_t> FreeList;
- typedef std::map <size_t, FreeList> FreeMap;
-
- ReservedMap m_reserved_cache;
- FreeMap m_free_cache;
-
- Process &m_process;
- ProcessModID m_mod_id;
- };
-
- ReservationCache &
- GetReservationCache ()
- {
- return m_reservation_cache;
- }
-private:
- ReservationCache m_reservation_cache;
protected:
//------------------------------------------------------------------
// NextEventAction provides a way to register an action on the next
Modified: lldb/trunk/source/Expression/IRMemoryMap.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Expression/IRMemoryMap.cpp?rev=185046&r1=185045&r2=185046&view=diff
==============================================================================
--- lldb/trunk/source/Expression/IRMemoryMap.cpp (original)
+++ lldb/trunk/source/Expression/IRMemoryMap.cpp Wed Jun 26 19:10:26 2013
@@ -66,14 +66,6 @@ IRMemoryMap::FindSpace (size_t size)
return ret;
}
- if (process_sp)
- {
- ret = process_sp->GetReservationCache().Find(size);
-
- if (ret != LLDB_INVALID_ADDRESS)
- return ret;
- }
-
for (int iterations = 0; iterations < 16; ++iterations)
{
lldb::addr_t candidate = LLDB_INVALID_ADDRESS;
@@ -101,21 +93,9 @@ IRMemoryMap::FindSpace (size_t size)
if (IntersectsAllocation(candidate, size))
continue;
-
- char buf[1];
-
- Error err;
-
- if (process_sp &&
- (process_sp->ReadMemory(candidate, buf, 1, err) == 1 ||
- process_sp->ReadMemory(candidate + size, buf, 1, err) == 1))
- continue;
-
+
ret = candidate;
-
- if (process_sp)
- process_sp->GetReservationCache().Reserve(candidate, size);
-
+
return ret;
}
@@ -416,8 +396,6 @@ IRMemoryMap::Free (lldb::addr_t process_
{
if (process_sp->CanJIT() && process_sp->IsAlive())
process_sp->DeallocateMemory(allocation.m_process_alloc); // FindSpace allocated this for real
- else
- process_sp->GetReservationCache().Unreserve(allocation.m_process_alloc); // FindSpace registered this memory
}
break;
Modified: lldb/trunk/source/Target/Process.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Target/Process.cpp?rev=185046&r1=185045&r2=185046&view=diff
==============================================================================
--- lldb/trunk/source/Target/Process.cpp (original)
+++ lldb/trunk/source/Target/Process.cpp Wed Jun 26 19:10:26 2013
@@ -996,7 +996,6 @@ Process::Process(Target &target, Listene
ProcessProperties (false),
UserID (LLDB_INVALID_PROCESS_ID),
Broadcaster (&(target.GetDebugger()), "lldb.process"),
- m_reservation_cache (*this),
m_target (target),
m_public_state (eStateUnloaded),
m_private_state (eStateUnloaded),
@@ -5590,60 +5589,3 @@ Process::DidExec ()
DoDidExec();
CompleteAttach ();
}
-
-Process::ReservationCache::ReservationCache (Process &process) : m_process(process)
-{
- m_mod_id = process.GetModID();
-}
-
-void
-Process::ReservationCache::Reserve (lldb::addr_t addr, size_t size)
-{
- CheckModID();
- m_reserved_cache[addr] = size;
-}
-
-void
-Process::ReservationCache::Unreserve (lldb::addr_t addr)
-{
- CheckModID();
- ReservedMap::iterator iter = m_reserved_cache.find(addr);
-
- if (iter != m_reserved_cache.end())
- {
- size_t size = iter->second;
- m_reserved_cache.erase(iter);
- m_free_cache[size].push_back(addr);
- }
-}
-
-lldb::addr_t
-Process::ReservationCache::Find (size_t size)
-{
- CheckModID();
- lldb::addr_t ret = LLDB_INVALID_ADDRESS;
- FreeMap::iterator map_iter = m_free_cache.find(size);
- if (map_iter != m_free_cache.end())
- {
- if (!map_iter->second.empty())
- {
- ret = map_iter->second.back();
- map_iter->second.pop_back();
- m_reserved_cache[ret] = size;
- }
- }
-
- return ret;
-}
-
-void
-Process::ReservationCache::CheckModID()
-{
- if (m_mod_id != m_process.GetModID())
- {
- // wipe all our caches, they're invalid
- m_reserved_cache.clear();
- m_free_cache.clear();
- m_mod_id = m_process.GetModID();
- }
-}
More information about the lldb-commits
mailing list