Compare commits
2
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
9936f9c740 | ||
|
|
bee5c8e5ed |
No files matched your search
@@ -149,6 +149,30 @@ void PoolAllocator::release()
|
|||||||
allocated_blocks_ = 0;
|
allocated_blocks_ = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool PoolAllocator::ptrcheck(const void* p) const
|
||||||
|
{
|
||||||
|
const uintptr_t paddr = reinterpret_cast<uintptr_t>(p);
|
||||||
|
|
||||||
|
ChunkFooter* next = nullptr;
|
||||||
|
for (ChunkFooter* chunk = first_chunk_; chunk != nullptr; chunk = next)
|
||||||
|
{
|
||||||
|
const uintptr_t blockstart = reinterpret_cast<uintptr_t>(chunk->start);
|
||||||
|
const uintptr_t blockend = blockstart + blocks_ * block_size_;
|
||||||
|
|
||||||
|
//CONS_Printf("mobj ptr %lu, block start %lu end %lu\n", paddr, blockstart, blockend);
|
||||||
|
|
||||||
|
if (paddr >= blockstart && paddr < blockend)
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
next = chunk->next;
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
static LinearMemory g_frame_memory {4 * 1024 * 1024};
|
static LinearMemory g_frame_memory {4 * 1024 * 1024};
|
||||||
|
|
||||||
void* Z_Frame_Alloc(size_t size)
|
void* Z_Frame_Alloc(size_t size)
|
||||||
|
|||||||
@@ -65,6 +65,7 @@ public:
|
|||||||
constexpr size_t allocated_bytes() const noexcept { return allocated_blocks_ * block_size_; };
|
constexpr size_t allocated_bytes() const noexcept { return allocated_blocks_ * block_size_; };
|
||||||
|
|
||||||
void release();
|
void release();
|
||||||
|
bool ptrcheck(const void* p) const;
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace srb2
|
} // namespace srb2
|
||||||
|
|||||||
@@ -804,6 +804,27 @@ void* Z_LevelPoolMalloc(size_t size)
|
|||||||
return p;
|
return p;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
boolean Z_IsMobjValid2(void *p, const char *file, INT32 line)
|
||||||
|
{
|
||||||
|
//(void)file;
|
||||||
|
//(void)line;
|
||||||
|
|
||||||
|
// mobj was removed
|
||||||
|
// no need to worry here
|
||||||
|
if (p == NULL)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
// mobjs reside in the large pool
|
||||||
|
if (!g_level_large_pool.ptrcheck(p))
|
||||||
|
{
|
||||||
|
//I_Error("invalid mobj! at %s:%d", file, line);
|
||||||
|
CONS_Alert(CONS_ERROR, "invalid mobj! at %s:%d", file, line);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
void* Z_LevelPoolCalloc(size_t size)
|
void* Z_LevelPoolCalloc(size_t size)
|
||||||
{
|
{
|
||||||
void* p = Z_LevelPoolMalloc(size);
|
void* p = Z_LevelPoolMalloc(size);
|
||||||
|
|||||||
@@ -173,6 +173,8 @@ char *Z_StrDup(const char *in);
|
|||||||
size_t Z_LevelPoolUsage(void);
|
size_t Z_LevelPoolUsage(void);
|
||||||
void *Z_LevelPoolMalloc(size_t size);
|
void *Z_LevelPoolMalloc(size_t size);
|
||||||
void *Z_LevelPoolCalloc(size_t size);
|
void *Z_LevelPoolCalloc(size_t size);
|
||||||
|
#define Z_IsMobjValid(p) Z_IsMobjValid2(p, __FILE__, __LINE__)
|
||||||
|
boolean Z_IsMobjValid2(void *p, const char *file, INT32 line);
|
||||||
void Z_LevelPoolFree(void *p, size_t size);
|
void Z_LevelPoolFree(void *p, size_t size);
|
||||||
|
|
||||||
// for use with CLEANUP macro
|
// for use with CLEANUP macro
|
||||||
|
|||||||
Reference in new issue
Block a user