10000 初次成功的代码 · home-coder/ring-buffer@26e4ee4 · GitHub
[go: up one dir, main page]

Skip to content

Commit 26e4ee4

Browse files
author
jiangxiujie
committed
初次成功的代码
1 parent 7f92a64 commit 26e4ee4

File tree

11 files changed

+277
-739
lines changed

11 files changed

+277
-739
lines changed

Makefile

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
CFLAGS = -O2 -Wall
2+
INCLUDE = -I ./include
3+
CC = gcc
4+
5+
test:test.o kfifo.o
6+
${CC} ${CFLAGS} test.o kfifo.o -o $@ ${INCLUDE} -pthread
7+
8+
test.o:
9+
$(CC) -c test.c ${INCLUDE} -pthread
10+
kfifo.o:
11+
$(CC) -c kfifo.c ${INCLUDE}
12+
clean:
13+
rm -rf *.o test

a.c

Lines changed: 0 additions & 49 deletions
This file was deleted.

a.out

-8.6 KB
Binary file not shown.

include/kfifo.h

Lines changed: 136 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,136 @@
1+
#ifndef _Linux_KFIFO_H
2+
#define _Linux_KFIFO_H
3+
4+
#define __u32 unsigned long
5+
#define __u64 unsigned long long
6+
7+
#define min(x,y) ((x) < (y) ? (x) : (y) )
8+
9+
#define max(x,y) ((x) > (y) ? (x) : (y) )
10+
/*
11+
static inline int fls(int x)
12+
{
< 8000 /code>13+
int r;
14+
15+
__asm__("bsrl %1,%0nt"
16+
"jnz 1fnt"
17+
"movl $-1,%0n"
18+
"1:" : "=r" (r) : "rm" (x));
19+
return r+1;
20+
}
21+
22+
*/
23+
static inline int fls(int x)
24+
{
25+
int r = 32;
26+
27+
if (!x)
28+
return 0;
29+
if (!(x & 0xffff0000u)) {
30+
x <<= 16;
31+
r -= 16;
32+
}
33+
if (!(x & 0xff000000u)) {
34+
x <<= 8;
35+
r -= 8;
36+
}
37+
if (!(x & 0xf0000000u)) {
38+
x <<= 4;
39+
r -= 4;
40+
}
41+
if (!(x & 0xc0000000u)) {
42+
x <<= 2;
43+
r -= 2;
44+
}
45+
if (!(x & 0x80000000u)) {
46+
x <<= 1;
47+
r -= 1;
48+
}
49+
return r;
50+
}
51+
52+
static inline int fls64(__u64 x)
53+
{
54+
__u32 h = x >> 32;
55+
if (h)
56+
return fls(h) + 32;
57+
return fls(x);
58+
}
59+
60+
static inline unsigned fls_long(unsigned long l)
61+
{
62+
if (sizeof(l) == 4)
63+
return fls(l);
64+
return fls64(l);
65+
}
66+
67+
static inline unsigned long roundup_pow_of_two(unsigned long x)
68+
{
69+
return 1UL << fls_long(x - 1);
70+
}
71+
72+
struct kfifo {
73+
unsigned char *buffer; /* the buffer holding the data */
74+
unsigned int size; /* the size of the allocated buffer */
75+
unsigned int in; /* data is added at offset (in % size) */
76+
unsigned int out; /* data is extracted from off. (out % size) */
77+
};
78+
79+
struct kfifo *kfifo_init(unsigned char *buffer, unsigned int size);
80+
struct kfifo *kfifo_alloc(unsigned int size);
81+
void kfifo_free(struct kfifo *fifo);
82+
unsigned int __kfifo_put(struct kfifo *fifo, unsigned char *buffer,
83+
unsigned int len);
84+
unsigned int __kfifo_get(struct kfifo *fifo, unsigned char *buffer,
85+
unsigned int len);
86+
87+
static inline void __kfifo_reset(struct kfifo *fifo)
88+
{
89+
fifo->in = fifo->out = 0;
90+
}
91+
92+
static inline void kfifo_reset(struct kfifo *fifo)
93+
{
94+
95+
__kfifo_reset(fifo);
96+
97+
}
98+
99+
static inline unsigned int kfifo_put(struct kfifo *fifo,
100+
unsigned char *buffer, unsigned int len)
101+
{
102+
unsigned int ret;
103+
104+
ret = __kfifo_put(fifo, buffer, len);
105+
106+
return ret;
107+
}
108+
109+
static inline unsigned int kfifo_get(struct kfifo *fifo,
110+
unsigned char *buffer, unsigned int len)
111+
{
112+
unsigned int ret;
113+
114+
ret = __kfifo_get(fifo, buffer, len);
115+
116+
if (fifo->in == fifo->out)
117+
fifo->in = fifo->out = 0;
118+
119+
return ret;
120+
}
121+
122+
static inline unsigned int __kfifo_len(struct kfifo *fifo)
123+
{
124+
return fifo->in - fifo->out;
125+
}
126+
127+
static inline unsigned int kfifo_len(struct kfifo *fifo)
128+
{
129+
unsigned int ret;
130+
131+
ret = __kfifo_len(fifo);
132+
133+
return ret;
134+
}
135+
136+
#endif

kfifo.c

Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
#include <kfifo.h>
2+
#include <stdio.h>
3+
#include <stdlib.h>
4+
#include <string.h>
5+
struct kfifo *kfifo_init(unsigned char *buffer, unsigned int size)
6+
{
7+
struct kfifo *fifo;
8+
9+
fifo = (struct kfifo *)malloc(sizeof(struct kfifo));
10+
if (!fifo)
11+
return NULL;
12+
13+
fifo->buffer = buffer;
14+
fifo->size = size;
15+
fifo->in = fifo->out = 0;
16+
17+
return fifo;
18+
}
19+
20+
struct kfifo *kfifo_alloc(unsigned int size)
21+
{
22+
unsigned char *buffer;
23+
struct kfifo *ret;
24+
if (size & (size - 1)) {
25+
fprintf(stderr, "size > 0x80000000n");
26+
size = roundup_pow_of_two(size);
27+
}
28+
29+
buffer = (unsigned char *)malloc(size);
30+
if (!buffer)
31+
return NULL;
32+
33+
ret = kfifo_init(buffer, size);
34+
35+
if ((unsigned long)ret <= 0) {
36+
free(buffer);
37+
}
38+
39+
return ret;
40+
}
41+
42+
void kfifo_free(struct kfifo *fifo)
43+
{
44+
free(fifo->buffer);
45+
free(fifo);
46+
}
47+
48+
unsigned int __kfifo_put(struct kfifo *fifo, unsigned char *buffer,
49+
unsigned int len)
50+
{
51+
unsigned int l;
52+
53+
len = min(len, fifo->size - fifo->in + fifo->out);
54+
55+
l = min(len, fifo->size - (fifo->in & (fifo->size - 1)));
56+
memcpy(fifo->buffer + (fifo->in & (fifo->size - 1)), buffer, l);
57+
memcpy(fifo->buffer, buffer + l, len - l);
58+
59+
fifo->in += len;
60+
61+
return len;
62+
}
63+
64+
unsigned int __kfifo_get(struct kfifo *fifo,
65+
unsigned char *buffer, unsigned int len)
66+
{
67+
unsigned int l;
68+
69+
len = min(len, fifo->in - fifo->out);
70+
71+
l = min(len, fifo->size - (fifo->out & (fifo->size - 1)));
72+
memcpy(buffer, fifo->buffer + (fifo->out & (fifo->size - 1)), l);
73+
74+
fifo->out += len;
75+
return len;
76+
}

0 commit comments

Comments
 (0)
0