#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;
}
循环buffer
最新推荐文章于 2023-04-18 23:25:57 发布