自主协议库编译通过
This commit is contained in:
166
mmslib/slog/qmem.c
Normal file
166
mmslib/slog/qmem.c
Normal file
@@ -0,0 +1,166 @@
|
||||
/************************************************************************/
|
||||
/* SISCO SOFTWARE MODULE HEADER *****************************************/
|
||||
/************************************************************************/
|
||||
/* (c) Copyright Systems Integration Specialists Company, Inc., */
|
||||
/* 1993-2007, All Rights Reserved */
|
||||
/* */
|
||||
/* MODULE NAME : qmem.c */
|
||||
/* PRODUCT(S) : Quick Memory Allocator */
|
||||
/* */
|
||||
/* MODULE DESCRIPTION : */
|
||||
/* */
|
||||
/* GLOBAL FUNCTIONS DEFINED IN THIS MODULE : */
|
||||
/* */
|
||||
/* MODIFICATION LOG : */
|
||||
/* Date Who Rev Comments */
|
||||
/* -------- --- ------ ------------------------------------------- */
|
||||
/* 01/15/07 EJV 08 Chg S_LOCK_RESOURCES to S_LOCK_UTIL_RESOURCES*/
|
||||
/* 03/11/04 GLB 07 Remove "thisFileName" */
|
||||
/* 06/06/03 JRB 06 Use S_LOCK_RESOURCES (new util mutex). */
|
||||
/* 04/14/03 JRB 05 Eliminate compiler warnings. */
|
||||
/* 05/24/01 JRB 04 Chg chk_calloc to calloc. This always compiled*/
|
||||
/* with !DEBUG_SISCO, screws up link. */
|
||||
/* 09/24/99 JRB 03 added: #include "sysincs.h" */
|
||||
/* 09/13/99 MDE 02 Added SD_CONST modifiers */
|
||||
/* 04/14/99 MDE 01 Removed unnecessary include files */
|
||||
/* 04/02/97 DTL 7.00 MMSEASE 7.0 release. See MODL70.DOC for */
|
||||
/* history. */
|
||||
/************************************************************************/
|
||||
|
||||
#include "glbtypes.h"
|
||||
#include "sysincs.h"
|
||||
#include "glbsem.h"
|
||||
|
||||
#include "mem_chk.h"
|
||||
#include "qmem.h"
|
||||
|
||||
#if defined(MSDOS)
|
||||
#define HUGE _huge
|
||||
#else
|
||||
#define HUGE
|
||||
#define halloc(a,b) calloc(a,b)
|
||||
#endif
|
||||
|
||||
ST_INT qMemElemSize; /* should be ((power of 2)-2) */
|
||||
|
||||
static ST_INT initialized;
|
||||
static ST_CHAR HUGE *qMemBuf;
|
||||
static ST_CHAR *qMemUsed;
|
||||
static ST_INT16 qMemIndex;
|
||||
static ST_INT qNumElem;
|
||||
static ST_INT qShift;
|
||||
|
||||
/************************************************************************/
|
||||
/* qMemInit */
|
||||
/* Initialization function */
|
||||
/************************************************************************/
|
||||
|
||||
ST_RET qMemInit (ST_INT NumElem)
|
||||
{
|
||||
ST_INT size;
|
||||
ST_RET ret;
|
||||
|
||||
S_LOCK_UTIL_RESOURCES ();
|
||||
if (!initialized)
|
||||
{
|
||||
if (qMemElemSize == 0)
|
||||
qMemElemSize = 126;
|
||||
qMemBuf = (ST_CHAR HUGE *) halloc ((ST_INT32) NumElem, qMemElemSize + 2);
|
||||
qMemUsed = (ST_CHAR *) calloc (NumElem, 1);
|
||||
qMemIndex = 0;
|
||||
qNumElem = NumElem;
|
||||
|
||||
qShift = -1;
|
||||
size = qMemElemSize + 2; /* 2 for the header! */
|
||||
while (size) /* determine the size of the buffer (power of 2)*/
|
||||
{
|
||||
size >>= 1; /* size = (size/2) */
|
||||
qShift++; /* Need to multiply buffer index by 2 later */
|
||||
}
|
||||
initialized = SD_TRUE;
|
||||
}
|
||||
|
||||
if (!qMemBuf || !qMemUsed)
|
||||
ret = SD_FAILURE;
|
||||
else
|
||||
ret = SD_SUCCESS;
|
||||
|
||||
S_UNLOCK_UTIL_RESOURCES ();
|
||||
return (ret);
|
||||
}
|
||||
|
||||
/************************************************************************/
|
||||
/* qMemAlloc */
|
||||
/* Allocation function */
|
||||
/************************************************************************/
|
||||
|
||||
ST_VOID *qMemAlloc (ST_INT size)
|
||||
{
|
||||
ST_INT32 offset;
|
||||
ST_CHAR HUGE *ptr;
|
||||
register ST_INT i;
|
||||
|
||||
S_LOCK_UTIL_RESOURCES ();
|
||||
if (!initialized)
|
||||
qMemInit (qNumElem == 0 ? 1024 : qNumElem);
|
||||
|
||||
if (qMemIndex == -1 || size > qMemElemSize)
|
||||
{
|
||||
S_UNLOCK_UTIL_RESOURCES ();
|
||||
return (NULL);
|
||||
}
|
||||
|
||||
/* qMemIndex is the index into the array of buffers to the one that */
|
||||
/* we will return this time */
|
||||
|
||||
offset = ((ST_INT32) qMemIndex) << qShift; /* multiply by buffer size */
|
||||
ptr = qMemBuf + offset;
|
||||
* (ST_INT16 *) ptr = qMemIndex; /* save index into used array */
|
||||
|
||||
qMemUsed[qMemIndex] = SD_TRUE; /* mark used */
|
||||
|
||||
/* Now get ready for next time */
|
||||
qMemIndex++;
|
||||
if (qMemIndex == qNumElem)
|
||||
qMemIndex = 0;
|
||||
|
||||
for (i = 0; i < qNumElem; i++) /* find available buffer */
|
||||
{
|
||||
if (qMemUsed[qMemIndex] == SD_FALSE)
|
||||
break;
|
||||
else
|
||||
{
|
||||
qMemIndex++;
|
||||
if (qMemIndex == qNumElem)
|
||||
qMemIndex = 0;
|
||||
}
|
||||
}
|
||||
if (i == qNumElem) /* no more buffers */
|
||||
qMemIndex = -1;
|
||||
|
||||
S_UNLOCK_UTIL_RESOURCES ();
|
||||
return ((ST_VOID *) (ptr + 2));
|
||||
}
|
||||
|
||||
|
||||
/************************************************************************/
|
||||
/* qMemFree */
|
||||
/* Free function */
|
||||
/************************************************************************/
|
||||
|
||||
ST_VOID qMemFree (ST_VOID *vp)
|
||||
{
|
||||
ST_INT16 index;
|
||||
ST_CHAR *ptr;
|
||||
|
||||
/* recover the index into the 'used' flag array & set SD_FALSE */
|
||||
S_LOCK_UTIL_RESOURCES ();
|
||||
ptr = (ST_CHAR *) vp;
|
||||
ptr -= 2;
|
||||
index = * (ST_INT16 *) ptr;
|
||||
qMemUsed[index] = SD_FALSE;
|
||||
|
||||
qMemIndex = index;
|
||||
S_UNLOCK_UTIL_RESOURCES ();
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user