⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 safemalloc.c

📁 php-4.4.7学习linux时下载的源代码
💻 C
📖 第 1 页 / 共 2 页
字号:
  DBUG_PRINT("enter",("ptr: %lx",pPtr));  if (!sf_malloc_quick)    (void) _sanity (sFile, uLine);  if ((!pPtr && (myflags & MY_ALLOW_ZERO_PTR)) ||      check_ptr("Freeing",(byte*) pPtr,sFile,uLine))    DBUG_VOID_RETURN;  /* Calculate the address of the remember structure */  pRec = (struct remember *) ((byte*) pPtr-sizeof(struct irem)-			      sf_malloc_prehunc);  /* Check to make sure that we have a real remember structure	*/  /* Note: this test could fail for four reasons:		*/  /*	(1) The memory was already free'ed			*/  /*	(2) The memory was never new'ed				*/  /*	(3) There was an underrun				*/  /*	(4) A stray pointer hit this location			*/  if (*((long*) ((char*) &pRec -> lSpecialValue+sf_malloc_prehunc))      != MAGICKEY)  {    fprintf (stderr, "Freeing unallocated data at line %d, '%s'\n",	     uLine, sFile);    DBUG_PRINT("safe",("Unallocated data at line %d, '%s'",uLine,sFile));    (void) fflush(stderr);    DBUG_VOID_RETURN;  }  /* Remove this structure from the linked list */  pthread_mutex_lock(&THR_LOCK_malloc);  if (pRec -> pPrev) {    pRec -> pPrev -> pNext = pRec -> pNext;  } else {    pRememberRoot = pRec -> pNext;  }  if (pRec -> pNext) {    pRec -> pNext -> pPrev = pRec -> pPrev;  }  /* Handle the statistics */  lCurMemory -= pRec -> uDataSize;  cNewCount--;  pthread_mutex_unlock(&THR_LOCK_malloc);#ifndef HAVE_purify  /* Mark this data as free'ed */  bfill(&pRec->aData[sf_malloc_prehunc],pRec->uDataSize,(pchar) FREE_VAL);#endif  *((long*) ((char*) &pRec -> lSpecialValue+sf_malloc_prehunc)) = ~MAGICKEY;  /* Actually free the memory */  free ((my_string ) pRec);  DBUG_VOID_RETURN;}	/* Check if we have a wrong  pointer */static int check_ptr(const char *where, byte *ptr, const char *sFile,		     uint uLine){  if (!ptr)  {    fprintf (stderr, "%s NULL pointer at line %d, '%s'\n",	     where,uLine, sFile);    DBUG_PRINT("safe",("Null pointer at line %d '%s'", uLine, sFile));    (void) fflush(stderr);    return 1;  }#ifndef _MSC_VER  if ((long) ptr & (MY_ALIGN(1,sizeof(char *))-1))  {    fprintf (stderr, "%s wrong aligned pointer at line %d, '%s'\n",	     where,uLine, sFile);    DBUG_PRINT("safe",("Wrong aligned pointer at line %d, '%s'",		       uLine,sFile));    (void) fflush(stderr);    return 1;  }#endif  if (ptr < sf_min_adress || ptr > sf_max_adress)  {    fprintf (stderr, "%s pointer out of range at line %d, '%s'\n",	     where,uLine, sFile);    DBUG_PRINT("safe",("Pointer out of range at line %d '%s'",		       uLine,sFile));    (void) fflush(stderr);    return 1;  }  return 0;}/* * TERMINATE(FILE *file) *	Report on all the memory pieces that have not been *	free'ed as well as the statistics. */void TERMINATE (FILE *file){  struct remember *pPtr;  DBUG_ENTER("TERMINATE");  pthread_mutex_lock(&THR_LOCK_malloc);  /* Report the difference between number of calls to  */  /* NEW and the number of calls to FREE.  >0 means more	 */  /* NEWs than FREEs.  <0, etc.				 */  if (cNewCount)  {    if (file)    {      fprintf (file, "cNewCount: %d\n", cNewCount);      (void) fflush(file);    }    DBUG_PRINT("safe",("cNewCount: %d",cNewCount));  }  /* Report on all the memory that was allocated with NEW	 */  /* but not free'ed with FREE.				 */  if ((pPtr=pRememberRoot))  {    if (file)    {      fprintf(file, "Memory that was not free'ed (%ld bytes):\n",lCurMemory);      (void) fflush(file);    }    DBUG_PRINT("safe",("Memory that was not free'ed (%ld bytes):",lCurMemory));    while (pPtr)    {      if (file)      {	fprintf (file,		 "\t%6u bytes at 0x%09lx, allocated at line %4u in '%s'\n",		 pPtr -> uDataSize,		 (ulong) &(pPtr -> aData[sf_malloc_prehunc]),		 pPtr -> uLineNum, pPtr -> sFileName);	(void) fflush(file);      }      DBUG_PRINT("safe",		 ("%6u bytes at 0x%09lx, allocated at line %4d in '%s'",		  pPtr -> uDataSize, &(pPtr -> aData[sf_malloc_prehunc]),		  pPtr -> uLineNum, pPtr -> sFileName));      pPtr = pPtr -> pNext;    }  }  /* Report the memory usage statistics */  if (file)  {    fprintf (file, "Maximum memory usage: %ld bytes (%ldk)\n",	     lMaxMemory, (lMaxMemory + 1023L) / 1024L);    (void) fflush(file);  }  DBUG_PRINT("safe",("Maximum memory usage: %ld bytes (%ldk)",		     lMaxMemory, (lMaxMemory + 1023L) / 1024L));  pthread_mutex_unlock(&THR_LOCK_malloc);  DBUG_VOID_RETURN;}	/* Returns 0 if chunk is ok */static int _checkchunk (register struct remember *pRec, const char *sFile,			uint uLine){  reg1 uint uSize;  reg2 my_string magicp;  reg3 int flag=0;  /* Check for a possible underrun */  if (*((long*) ((char*) &pRec -> lSpecialValue+sf_malloc_prehunc))      != MAGICKEY)  {    fprintf (stderr, "Memory allocated at %s:%d was underrun,",	     pRec -> sFileName, pRec -> uLineNum);    fprintf (stderr, " discovered at %s:%d\n", sFile, uLine);    (void) fflush(stderr);    DBUG_PRINT("safe",("Underrun at %lx, allocated at %s:%d",		       &(pRec -> aData[sf_malloc_prehunc]),		       pRec -> sFileName,		       pRec -> uLineNum));    flag=1;  }  /* Check for a possible overrun */  uSize = pRec -> uDataSize;  magicp = &(pRec -> aData[uSize+sf_malloc_prehunc]);  if (*magicp++ != MAGICEND0 ||      *magicp++ != MAGICEND1 ||      *magicp++ != MAGICEND2 ||      *magicp++ != MAGICEND3)  {    fprintf (stderr, "Memory allocated at %s:%d was overrun,",	     pRec -> sFileName, pRec -> uLineNum);    fprintf (stderr, " discovered at '%s:%d'\n", sFile, uLine);    (void) fflush(stderr);    DBUG_PRINT("safe",("Overrun at %lx, allocated at %s:%d",		       &(pRec -> aData[sf_malloc_prehunc]),		       pRec -> sFileName,		       pRec -> uLineNum));    flag=1;  }  return(flag);}	/* Returns how many wrong chunks */int _sanity (const char *sFile, uint uLine){  reg1 struct remember *pTmp;  reg2 int flag=0;  uint count=0;  pthread_mutex_lock(&THR_LOCK_malloc);  count=cNewCount;  for (pTmp = pRememberRoot; pTmp != NULL && count-- ; pTmp = pTmp -> pNext)    flag+=_checkchunk (pTmp, sFile, uLine);  pthread_mutex_unlock(&THR_LOCK_malloc);  if (count || pTmp)  {    const char *format="Safemalloc link list destroyed, discovered at '%s:%d'";    fprintf (stderr, format, sFile, uLine); fputc('\n',stderr);    (void) fflush(stderr);    DBUG_PRINT("safe",(format, sFile, uLine));    flag=1;  }  return flag;} /* _sanity */	/* malloc and copy */gptr _my_memdup(const byte *from, uint length, const char *sFile, uint uLine,		myf MyFlags){  gptr ptr;  if ((ptr=_mymalloc(length,sFile,uLine,MyFlags)) != 0)    memcpy((byte*) ptr, (byte*) from,(size_t) length);  return(ptr);} /*_my_memdup */my_string _my_strdup(const char *from, const char *sFile, uint uLine,		     myf MyFlags){  gptr ptr;  uint length=(uint) strlen(from)+1;  if ((ptr=_mymalloc(length,sFile,uLine,MyFlags)) != 0)    memcpy((byte*) ptr, (byte*) from,(size_t) length);  return((my_string) ptr);} /* _my_strdup */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -