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

📄 buf.c

📁 石器时代2.0完整版源代码.已经加入新功能. 在REDHAT9下GCC3.4编译成功.
💻 C
字号:
#define __BUF_C__#include "version.h"#include <stdio.h>#include <stdlib.h>#include <string.h>#include "buf.h"#include "handletime.h"static int UNIT;static int UNITNUMBER;static int memconfig;static int readblock;static int NowMemory;static struct timeval AllocOldTime;typedef struct tagMemory{    char*   pointer;    BOOL    used;    unsigned int     nsize;}Memory;static Memory *mem;void memEnd( void ){  if( mem != NULL && mem[0].pointer != NULL ){    free(mem[0].pointer);    free(mem);  }}BOOL configmem( int unit , int unitnumber ){    if( memconfig == TRUE )        return FALSE;    UNIT = unit;    UNITNUMBER = unitnumber;    if( UNIT <= 0 || UNITNUMBER <= 0 )        return memconfig = FALSE;    return memconfig = TRUE;}BOOL memInit( void ){    int i;    if( memconfig == FALSE )        return FALSE;    mem = calloc( 1, sizeof( Memory ) * UNITNUMBER );    if( mem == NULL ){        print( "memInit: Can't alloc memory: %d\n" ,               sizeof(Memory)*UNITNUMBER );        return FALSE;    }    memset( mem , 0 , sizeof( Memory )* UNITNUMBER );    for( i = 0 ; i < UNITNUMBER ; i ++ ){        mem[i].pointer  =   NULL;        mem[i].used     =   FALSE;        mem[i].nsize    =   0;    }    mem[0].pointer = calloc( 1, UNIT*UNITNUMBER );    if( mem[0].pointer == NULL ){        print( "不可分配 %d byte\n" , UNIT*UNITNUMBER );        free( mem );        return FALSE;    }    memset( mem[0].pointer , 0 , sizeof( UNIT*UNITNUMBER ));		print( "内存已分配 %.2f MB..." ,UNIT*UNITNUMBER/1024.0/1024.0);#ifdef DEBUG    print( "Allocate %d byte( %.2fK byte %.2fM byte )\n" ,           UNIT*UNITNUMBER,           UNIT*UNITNUMBER/1024.0,           UNIT*UNITNUMBER/1024.0/1024.0        );#endif	readblock = 0;    for( i = 0 ; i < UNITNUMBER ; i ++ )        mem[i].pointer = mem[0].pointer + i * UNIT;	NowMemory = 0;	AllocOldTime.tv_sec = NowTime.tv_sec;	AllocOldTime.tv_usec = NowTime.tv_usec;	  return TRUE;}void* allocateMemory( const unsigned int nbyte ){    int i;    int arrayAllocSize;	BOOL flg = FALSE;    void *ret;	int first = 0;     arrayAllocSize = nbyte/UNIT + ( nbyte%UNIT ? 1 : 0 );    if( arrayAllocSize == 0 )return NULL;#ifdef DEBUG    debug( arrayAllocSize , d );    printf("(%.2f KB)\n",nbyte/1024.0);#endif	i = readblock;	while( 1 ) {		if( i > UNITNUMBER - arrayAllocSize) {			i = 0;		}		if( mem[i].used != FALSE ){			i += mem[i].nsize;		}else{            int	j;            BOOL	found = TRUE;            for( j = i; j < i + arrayAllocSize; j ++ ) {			 	if( mem[j].used != FALSE ){			 		i = j + mem[j].nsize;					found = FALSE;					if( first == 0 ) first = 1;			 		break;			 	}            }            if( found ) {                mem[i].used=TRUE;                mem[i].nsize = arrayAllocSize;			    readblock = i + arrayAllocSize;		        ret = mem[i].pointer;				break;			 }		}		if( ( i >= readblock || i > UNITNUMBER - arrayAllocSize )            && flg == TRUE ) {			ret = NULL;			break;		}		if( i > UNITNUMBER - arrayAllocSize) {			i = 0;			flg = TRUE;		}			}	if( ret == NULL ) {	    print( "Can't Allocate %d byte .remnants:%4.2f\n" , nbyte, (float)(NowMemory/UNITNUMBER));	}else {		NowMemory += arrayAllocSize;		if( NowTime.tv_sec > AllocOldTime.tv_sec +10 ) {			print( "\n");			if( NowMemory > (double)UNITNUMBER * 0.9) {				print( "Warning!! Memory use rate exceeded 90%% .remnants:%d\n", UNITNUMBER-NowMemory);			}else if( NowMemory > (double)UNITNUMBER * 0.8) {				print( "Warning!! Memory use rate exceeded 80%% .remnants:%d\n", UNITNUMBER-NowMemory);			}else if( NowMemory > (double)UNITNUMBER * 0.7) {				print( "Memory use rate exceeded 70%% .remnants:%d\n", UNITNUMBER-NowMemory);			}			memcpy( &AllocOldTime, &NowTime, sizeof( AllocOldTime));		}		//print( "NowMemory.remnants:%4.2f\n", (float)(UNITNUMBER-NowMemory)/UNITNUMBER);	}	return ret;}/*------------------------------------------------------------ * 娄醒 * 忒曰袄 *  卅仄 ------------------------------------------------------------*/void freeMemory( void* freepointer ){    int   arrayindex;    char* toppointer;    toppointer = mem[0].pointer;    if( freepointer == NULL )return;    arrayindex = ((int)freepointer-(int)toppointer)/UNIT;	if( arrayindex < readblock) {		readblock = arrayindex;	}    mem[arrayindex].used = FALSE;		NowMemory -= mem[arrayindex].nsize;}void showMem( char *buf){	sprintf( buf, "NowMemory.remnants:%d%%", ((UNITNUMBER-NowMemory)*100)/UNITNUMBER);	printf( "\n" );	printf( buf );}

⌨️ 快捷键说明

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