mirror of
https://github.com/alliedmodders/amxmodx.git
synced 2024-12-25 06:15:37 +03:00
fixed some corruption bugs, hopefully improved memory management
This commit is contained in:
parent
58ed3067ed
commit
eba3f39d88
@ -330,6 +330,10 @@ AtomicResult::AtomicResult()
|
|||||||
{
|
{
|
||||||
m_IsFree = true;
|
m_IsFree = true;
|
||||||
m_CurRow = 0;
|
m_CurRow = 0;
|
||||||
|
m_AllocFields = 0;
|
||||||
|
m_AllocRows = 0;
|
||||||
|
m_Rows = NULL;
|
||||||
|
m_Fields = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
AtomicResult::~AtomicResult()
|
AtomicResult::~AtomicResult()
|
||||||
@ -338,6 +342,21 @@ AtomicResult::~AtomicResult()
|
|||||||
{
|
{
|
||||||
FreeHandle();
|
FreeHandle();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (m_AllocFields)
|
||||||
|
{
|
||||||
|
delete [] m_Fields;
|
||||||
|
m_AllocFields = 0;
|
||||||
|
m_Fields = NULL;
|
||||||
|
}
|
||||||
|
if (m_AllocRows)
|
||||||
|
{
|
||||||
|
for (unsigned int i=0; i<m_AllocRows; i++)
|
||||||
|
delete [] m_Rows[i];
|
||||||
|
delete [] m_Rows;
|
||||||
|
m_Rows = NULL;
|
||||||
|
m_AllocRows = NULL;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
unsigned int AtomicResult::RowCount()
|
unsigned int AtomicResult::RowCount()
|
||||||
@ -442,13 +461,12 @@ void AtomicResult::_InternalClear()
|
|||||||
|
|
||||||
g_StringPool.StartHardLock();
|
g_StringPool.StartHardLock();
|
||||||
|
|
||||||
for (size_t i=0; i<m_Fields.size(); i++)
|
for (unsigned int i=0; i<m_FieldCount; i++)
|
||||||
g_StringPool.FreeString(m_Fields[i]);
|
g_StringPool.FreeString(m_Fields[i]);
|
||||||
|
|
||||||
for (size_t i=0; i<m_Rows.size(); i++)
|
for (unsigned int i=0; i<m_RowCount; i++)
|
||||||
{
|
{
|
||||||
size_t maxi = m_Rows[i].size();
|
for (unsigned int j=0; j<m_FieldCount; j++)
|
||||||
for (size_t j=0; j<maxi; j++)
|
|
||||||
g_StringPool.FreeString(m_Rows[i][j]);
|
g_StringPool.FreeString(m_Rows[i][j]);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -471,8 +489,37 @@ void AtomicResult::CopyFrom(IResultSet *rs)
|
|||||||
|
|
||||||
m_FieldCount = rs->FieldCount();
|
m_FieldCount = rs->FieldCount();
|
||||||
m_RowCount = rs->RowCount();
|
m_RowCount = rs->RowCount();
|
||||||
m_Fields.resize(m_FieldCount);
|
if (m_RowCount > m_AllocRows)
|
||||||
m_Rows.resize(m_RowCount);
|
{
|
||||||
|
/** allocate new array, zero it */
|
||||||
|
stridx_t **newRows = new stridx_t *[m_RowCount];
|
||||||
|
memset(newRows, 0, m_RowCount * sizeof(stridx_t *));
|
||||||
|
/** if we have a new field count, just delete all the old stuff. */
|
||||||
|
if (m_FieldCount > m_AllocFields)
|
||||||
|
{
|
||||||
|
for (unsigned int i=0; i<m_AllocRows; i++)
|
||||||
|
{
|
||||||
|
delete [] m_Rows[i];
|
||||||
|
newRows[i] = new stridx_t[m_FieldCount];
|
||||||
|
}
|
||||||
|
for (unsigned int i=m_AllocRows; i<m_RowCount; i++)
|
||||||
|
newRows[i] = new stridx_t[m_FieldCount];
|
||||||
|
} else {
|
||||||
|
/** copy the old pointers */
|
||||||
|
memcpy(newRows, m_Rows, m_AllocRows * sizeof(stridx_t *));
|
||||||
|
for (unsigned int i=m_AllocRows; i<m_RowCount; i++)
|
||||||
|
newRows[i] = new stridx_t[m_AllocFields];
|
||||||
|
}
|
||||||
|
delete [] m_Rows;
|
||||||
|
m_Rows = newRows;
|
||||||
|
m_AllocRows = m_RowCount;
|
||||||
|
}
|
||||||
|
if (m_FieldCount > m_AllocFields)
|
||||||
|
{
|
||||||
|
delete [] m_Fields;
|
||||||
|
m_Fields = new stridx_t[m_FieldCount];
|
||||||
|
m_AllocFields = m_FieldCount;
|
||||||
|
}
|
||||||
m_CurRow = 0;
|
m_CurRow = 0;
|
||||||
|
|
||||||
g_StringPool.StartHardLock();
|
g_StringPool.StartHardLock();
|
||||||
@ -482,7 +529,6 @@ void AtomicResult::CopyFrom(IResultSet *rs)
|
|||||||
while (!rs->IsDone())
|
while (!rs->IsDone())
|
||||||
{
|
{
|
||||||
row = rs->GetRow();
|
row = rs->GetRow();
|
||||||
m_Rows[idx].resize(m_FieldCount);
|
|
||||||
for (size_t i=0; i<m_FieldCount; i++)
|
for (size_t i=0; i<m_FieldCount; i++)
|
||||||
m_Rows[idx][i] = g_StringPool.MakeString(row->GetString(i));
|
m_Rows[idx][i] = g_StringPool.MakeString(row->GetString(i));
|
||||||
rs->NextRow();
|
rs->NextRow();
|
||||||
|
@ -25,11 +25,11 @@ public:
|
|||||||
void UnsetMutex();
|
void UnsetMutex();
|
||||||
bool IsThreadable();
|
bool IsThreadable();
|
||||||
public:
|
public:
|
||||||
virtual stridx_t MakeString(const char *str);
|
stridx_t MakeString(const char *str);
|
||||||
virtual void FreeString(stridx_t idx);
|
void FreeString(stridx_t idx);
|
||||||
virtual const char *GetString(stridx_t idx);
|
const char *GetString(stridx_t idx);
|
||||||
virtual void StartHardLock();
|
void StartHardLock();
|
||||||
virtual void StopHardLock();
|
void StopHardLock();
|
||||||
public:
|
public:
|
||||||
static const int NullString = -1;
|
static const int NullString = -1;
|
||||||
private:
|
private:
|
||||||
@ -73,8 +73,10 @@ private:
|
|||||||
private:
|
private:
|
||||||
unsigned int m_RowCount;
|
unsigned int m_RowCount;
|
||||||
unsigned int m_FieldCount;
|
unsigned int m_FieldCount;
|
||||||
CVector<stridx_t> m_Fields;
|
unsigned int m_AllocFields;
|
||||||
CVector<CVector<stridx_t> > m_Rows;
|
unsigned int m_AllocRows;
|
||||||
|
stridx_t *m_Fields;
|
||||||
|
stridx_t **m_Rows;
|
||||||
unsigned int m_CurRow;
|
unsigned int m_CurRow;
|
||||||
bool m_IsFree;
|
bool m_IsFree;
|
||||||
};
|
};
|
||||||
|
Loading…
Reference in New Issue
Block a user