@@ -63,7 +63,7 @@ char* rplSymbolStorage_storeLibname(const char* libName)
6363 return libEntry->libName ;
6464}
6565
66- RPLStoredSymbol* rplSymbolStorage_store (const char * libName, const char * symbolName, MPTR address)
66+ RPLStoredSymbol* rplSymbolStorage_store (const char * libName, const char * symbolName, MPTR address, uint32 type )
6767{
6868 std::unique_lock<std::mutex> lck (rplSymbolStorage.m_symbolStorageMutex );
6969 char * libNameStorage = rplSymbolStorage_storeLibname (libName);
@@ -72,7 +72,7 @@ RPLStoredSymbol* rplSymbolStorage_store(const char* libName, const char* symbolN
7272 storedSymbol->address = address;
7373 storedSymbol->libName = libNameStorage;
7474 storedSymbol->symbolName = symbolNameStorage;
75- storedSymbol->flags = 0 ;
75+ storedSymbol->flags = type ;
7676 storedSymbol->previous = nullptr ;
7777 auto it = rplSymbolStorage.map_symbolByAddress .find (address);
7878 if (it != rplSymbolStorage.map_symbolByAddress .end ())
@@ -130,13 +130,41 @@ void rplSymbolStorage_remove(RPLStoredSymbol* storedSymbol)
130130 delete storedSymbol;
131131}
132132
133- void rplSymbolStorage_removeRange (MPTR address, sint32 length)
133+
134+ void rplSymbolStorage_removeRange (MPTR address, sint32 length, uint32 type)
134135{
136+ std::unique_lock<std::mutex> lck (rplSymbolStorage.m_symbolStorageMutex );
135137 while (length > 0 )
136138 {
137- RPLStoredSymbol* symbol = rplSymbolStorage_getByAddress (address);
138- if (symbol)
139- rplSymbolStorage_remove (symbol);
139+ auto it = rplSymbolStorage.map_symbolByAddress .find (address);
140+ if (it != rplSymbolStorage.map_symbolByAddress .end ())
141+ {
142+ RPLStoredSymbol* current = it->second ;
143+ RPLStoredSymbol* newHead = current;
144+ RPLStoredSymbol* previousKept = nullptr ;
145+ while (current)
146+ {
147+ RPLStoredSymbol* next = current->previous ;
148+ if ((current->flags & type) == type)
149+ {
150+ if (previousKept)
151+ previousKept->previous = next;
152+ else
153+ newHead = next;
154+ delete current;
155+ }
156+ else
157+ {
158+ previousKept = current;
159+ }
160+ current = next;
161+ }
162+
163+ if (newHead)
164+ it->second = newHead;
165+ else
166+ rplSymbolStorage.map_symbolByAddress .erase (it);
167+ }
140168 address += 4 ;
141169 length -= 4 ;
142170 }
0 commit comments