ip phone日志5

类别:编程语言 点击:0 评论:0 推荐:

今天一口气把监控模块框架写了.
监控模块设计步骤如下:

建立一个定时器:(用于定时监控每模块是否活着)
建立一个队列:(用于接收各模块的回应消息)

while(recv(queue))
{
    switch(msg)
        timer:
            if(is_all_alive)
                发送监控消息给所有模块                
            else
                发送消息给主控
        other module:
                此模块活着
        .....:
                此模块活着
                

}

timer
{
    发送定时消息给自己模块
}
再接着把内存管理的代码也写了:
设计要求:
        可查询当前内存的申请情况(长度,种类和种类的大小,及申请的文件名,行数)
        限制申请长度超过内存最大长度
#define NUM_BLOCKS 128//申请次数
#define NUM_SIZES  64//申请的种类
#define MAX_MEM_SIZES 1024*1024 // 1M 内存
static BlockEntry blocks[NUM_BLOCKS];
static Counter counters[NUM_SIZES];

static void incrementCountForSize(size_t size);
static void decrementCountForSize(size_t size);

static long FS_totalAllocated = 0;
 
void *mMallocLineFile(size_t size, int line, char *file)
{
 int i;
 if((FS_totalAllocated+size)>MAX_MEM_SIZES)
  return;
 void *newAllocation = malloc(size);

 for (i = 0; i < NUM_BLOCKS; i++)
 {
  if (blocks[i].addr == 0)
  {
   // found empty entry; use it
   blocks[i].addr = newAllocation;
   blocks[i].size = size;
   blocks[i].line = line;
   blocks[i].file = file;
   incrementCountForSize(size);
   break;
  }
 }
 assert(i < NUM_BLOCKS);

 FS_totalAllocated += size;
 return newAllocation;
}


void mFree(void *blockToFree)
{
 int i;
 for (i = 0; i < NUM_BLOCKS; i++)
 {
  if (blocks[i].addr = = blockToFree)
  {
   // found block being released
   decrementCountForSize(blocks[i].size);
   FS_totalAllocated -= blocks[i].size;
   blocks[i].addr = 0;
   blocks[i].size = 0;
   break;
  }
 }
 assert(i < NUM_BLOCKS);

 free(blockToFree);
}


void mDisplayTable(void)
{
 printf("%s", "\nSize\tFreq.");
 for (int i = 0; i < NUM_SIZES; i++)
 {
  if (counters[i].size = = 0) break;
  printf("\n%d\t\t%d", counters[i].size, counters[i].count);
 }
}

void mClearTable(void)
{
 for (int i = 0; i < NUM_SIZES; i++)
 {
  counters[i].size = 0;
  counters[i].count = 0;
 }
}    

本文地址:http://com.8s8s.com/it/it25564.htm