循环buffer

#include <stdio.h>
#include <string.h>

#include <PROCESS.H>
#include <Windows.h>

#define  MIN_BLOCK_LEN  2//32
#define  MAX_BUFFER_LEN  2*5//10*1024

struct node
{
	unsigned short  from_block_id;
	unsigned short  use_block_num;
	int use_len;
	char  is_back;
};

struct ctrl
{
    char   buf[MAX_BUFFER_LEN];
	struct node  node[MAX_BUFFER_LEN/MIN_BLOCK_LEN];
	int  get_index;
	int  put_index;
    int  puted_num;
}ctrl_info;

CRITICAL_SECTION g_lock;

void init()
{
    memset(&ctrl_info, 0, sizeof(ctrl_info));
}

int put_info(char *buf, unsigned int len)
{
    //
	int i= ctrl_info.get_index;
	int j=0;
	int not_use_size;
	int sum_block = 0;

	int ret = 0;

	EnterCriticalSection( &(g_lock) );
	for(; j<ctrl_info.puted_num; j++)
	{
        sum_block += ctrl_info.node[i].use_block_num;
		i++;
		i = i%(MAX_BUFFER_LEN/MIN_BLOCK_LEN);
	}
	not_use_size = (MAX_BUFFER_LEN/MIN_BLOCK_LEN - sum_block) *MIN_BLOCK_LEN ;
	if(not_use_size < len)
	{
		printf("put info error , no enough space \n");
		ret =1;
	}
	else
	{
		j = len/MIN_BLOCK_LEN;
		if(len % MIN_BLOCK_LEN)
			j += 1;
		//if(ctrl_info.puted_num > 0)
		{
			if(ctrl_info.put_index > 0)
                ctrl_info.node[ctrl_info.put_index].from_block_id = 
				ctrl_info.node[ctrl_info.put_index -1].from_block_id + 
				ctrl_info.node[ctrl_info.put_index-1].use_block_num;
			else
				ctrl_info.node[ctrl_info.put_index].from_block_id = 
				ctrl_info.node[MAX_BUFFER_LEN/MIN_BLOCK_LEN  -1].from_block_id + 
				ctrl_info.node[MAX_BUFFER_LEN/MIN_BLOCK_LEN  -1].use_block_num;
		}
#if 0
		else
		{
			if(ctrl_info.put_index > 0)
                ctrl_info.node[ctrl_info.put_index].from_block_id = 
				ctrl_info.node[ctrl_info.put_index -1].from_block_id + 
				ctrl_info.node[ctrl_info.put_index-1].use_block_num;
			else
				ctrl_info.node[ctrl_info.put_index].from_block_id = 0;

		}
#endif
		ctrl_info.node[ctrl_info.put_index].from_block_id = (ctrl_info.node[ctrl_info.put_index].from_block_id)%(MAX_BUFFER_LEN/MIN_BLOCK_LEN);
		ctrl_info.node[ctrl_info.put_index].use_block_num = j;
        ctrl_info.node[ctrl_info.put_index].use_len = len;
		if(ctrl_info.node[ctrl_info.put_index].from_block_id + 
			ctrl_info.node[ctrl_info.put_index].use_block_num <= MAX_BUFFER_LEN/MIN_BLOCK_LEN)
		{
			ctrl_info.node[ctrl_info.put_index].is_back = 0;
			memcpy(ctrl_info.buf + ctrl_info.node[ctrl_info.put_index].from_block_id * MIN_BLOCK_LEN,
				buf, len);
		}
		else
		{
			int  len1 = (MAX_BUFFER_LEN/MIN_BLOCK_LEN - ctrl_info.node[ctrl_info.put_index].from_block_id)* MIN_BLOCK_LEN;
			ctrl_info.node[ctrl_info.put_index].is_back = 1;
			memcpy(ctrl_info.buf + ctrl_info.node[ctrl_info.put_index].from_block_id * MIN_BLOCK_LEN,
				buf, 
				len1);
			memcpy(ctrl_info.buf, buf+len1, len-len1);
		}
		ctrl_info.puted_num++;
		ctrl_info.put_index = (ctrl_info.put_index+1)%(MAX_BUFFER_LEN/MIN_BLOCK_LEN);
	}
	LeaveCriticalSection( &(g_lock) );
	return ret;
}

int get_info(char *buf, int *len)
{
	int info_len =0;

    EnterCriticalSection( &(g_lock) );
	if(ctrl_info.puted_num < 1)
	{
		printf("not  info \n");
		LeaveCriticalSection( &(g_lock) );
		return 1;
	}

	//cmp  len
	info_len = ctrl_info.node[ctrl_info.get_index].use_len;
	if(info_len > *len)
	{
		printf("buf len too small \n");
		LeaveCriticalSection( &(g_lock) );
		return 2;
	}

	//cpy info
	if(ctrl_info.node[ctrl_info.get_index].from_block_id + 
		ctrl_info.node[ctrl_info.get_index].use_block_num <= MAX_BUFFER_LEN/MIN_BLOCK_LEN)
	{
		memcpy(buf, ctrl_info.buf + ctrl_info.node[ctrl_info.get_index].from_block_id * MIN_BLOCK_LEN, info_len);
	}
	else
	{
		int  len1 = (MAX_BUFFER_LEN/MIN_BLOCK_LEN - ctrl_info.node[ctrl_info.get_index].from_block_id)* MIN_BLOCK_LEN;
		memcpy(buf, ctrl_info.buf + ctrl_info.node[ctrl_info.get_index].from_block_id * MIN_BLOCK_LEN, len1);
		memcpy(buf+len1, ctrl_info.buf, info_len - len1);	
	}
	ctrl_info.get_index = (ctrl_info.get_index + 1)%(MAX_BUFFER_LEN/MIN_BLOCK_LEN);
	ctrl_info.puted_num--;
	*len = info_len;
	LeaveCriticalSection( &(g_lock) );
	return 0;
}

void thread_proc_put(void* arg)
{
	int i=1;
	int ret;
	char buf[] = "0123456789";
	char  tmp[16];
	int log_num=10000;
	int close_flag =1;
	FILE *fp;
	fp = fopen("put.txt", "w");

	while(1)
	{	
		//memset(buf, 0, sizeof(buf));
		//i = sizeof(buf);
        //while(1)
		{
			ret = put_info(buf, i);
			if(0 == ret)
			{
				memset(tmp, 0, sizeof(tmp));
				memcpy(tmp, buf, i);
				printf("put: [%s] \n", tmp);
				if(log_num >0)
					fprintf(fp, "%s \n", tmp);
				else if(close_flag == 1)
				{
					fclose(fp);
					close_flag = 0;
				}
				log_num --;
				//break;
			}
			//Sleep(2);
		}
		
		Sleep(8);
		i++;
		if(i > strlen(buf))
			i=1;
		
	}
}

void thread_proc_get(void* arg)
{
	int i=1;
	int ret;
	char buf[16] = {0};

	int log_num = 10000;
	int close_flag =1;
	FILE *fp;
	fp = fopen("get.txt", "w");
    
	
	while(1)
	{	
		memset(buf, 0, sizeof(buf));
		i = sizeof(buf);
		ret = get_info(buf, &i);
		if(0 == ret)
		{
		     printf("get: [%s] \n", buf);
			 if(log_num > 0)
			     fprintf(fp, "%s \n", buf);
			 else if(1 == close_flag)
			 {
				 fclose(fp);
				 close_flag = 0;
			 }
			 log_num--;
		}
		Sleep(12);
	
	}
}

int main()
{
	char buf[] = "1234";
	char get_buf[8] = {0};
	int len = 0;
	int i = 0;
	int ret;

	init();
	InitializeCriticalSection(&(g_lock));
	_beginthread(thread_proc_put, 0, NULL);  
	_beginthread(thread_proc_get, 0, NULL); 
#if 0
	put_info(buf, 3);
	put_info(buf, 3);
	//put_info(buf, 2);
    
	for(i=0; i<8;i++)
	{
		len = sizeof(get_buf);
		memset(get_buf, 0, len);
		ret = get_info(get_buf, &len);
		if(0 == ret)
		    printf("[%s]\n", get_buf);
		else
			break;
	}
	printf("---------------------\n");
	put_info(buf, 4);
	put_info(buf, 4);
	put_info(buf, 3);
#if 1
	for(i=0; i<8;i++)
	{
		len = sizeof(get_buf);
		memset(get_buf, 0, len);
		ret = get_info(get_buf, &len);
		if(0 == ret)
			printf("[%s]\n", get_buf);
		else
			break;
	}
#endif
#endif
	getchar();
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值