11
11
#include "ard_utils.h"
12
12
#include "debug.h"
13
13
14
- #define MAX_PBUF_STORED 50
14
+ #define MAX_PBUF_STORED 30
15
15
16
16
tData pBufStore [MAX_PBUF_STORED ][MAX_SOCK_NUM ];
17
17
@@ -31,12 +31,20 @@ void insert_pBuf(struct pbuf* q, uint8_t sock, void* _pcb)
31
31
if (q == NULL )
32
32
return ;
33
33
34
+ if (pBufStore [headBuf ][sock ].data != NULL )
35
+ {
36
+ WARN ("Overwriting buffer %p idx:%d!\n" , pBufStore [headBuf ][sock ].data , headBuf );
37
+ // to avoid memory leak free the oldest buffer
38
+ freetDataIdx (headBuf , sock );
39
+ }
40
+
34
41
u8_t * p = (u8_t * )calloc (q -> tot_len ,sizeof (u8_t ));
35
42
if (p != NULL ) {
36
43
if (pbuf_copy_partial (q , p , q -> tot_len ,0 ) != q -> tot_len ) {
37
- free (p );
38
- p = NULL ;
39
- return ;
44
+ WARN ("pbuf_copy_partial failed: src:%p, dst:%p, len:%d\n" , q , p , q -> tot_len );
45
+ free (p );
46
+ p = NULL ;
47
+ return ;
40
48
}
41
49
42
50
pBufStore [headBuf ][sock ].data = p ;
@@ -48,7 +56,7 @@ void insert_pBuf(struct pbuf* q, uint8_t sock, void* _pcb)
48
56
if (headBuf == MAX_PBUF_STORED )
49
57
headBuf = 0 ;
50
58
if (headBuf == tailBuf )
51
- WARN ("Overwriting data!" );
59
+ WARN ("Overwriting data [%d-%d]!\n" , headBuf , tailBuf );
52
60
INFO_UTIL ("Insert: %p:%d-%d [%d,%d]\n" , p , q -> tot_len , p [0 ], headBuf , tailBuf );
53
61
}
54
62
}
@@ -61,22 +69,52 @@ tData* get_pBuf(uint8_t sock)
61
69
if (IS_BUF_AVAIL ())
62
70
{
63
71
tData * p = & (pBufStore [tailBuf ][sock ]);
64
- INFO_UTIL ("%p [%d,%d]\n" , p , headBuf , tailBuf );
72
+ INFO_UTIL_VER ("%p [%d,%d]\n" , p , headBuf , tailBuf );
65
73
return p ;
66
74
}
67
75
return NULL ;
68
76
}
69
77
70
- void freetData (void * buf )
78
+ void freetData (void * buf , uint8_t sock )
71
79
{
72
80
if (buf == NULL )
81
+ {
82
+ WARN ("Buf == NULL!" );
73
83
return ;
84
+ }
85
+
86
+ pBufStore [tailBuf ][sock ].data = NULL ;
87
+ pBufStore [tailBuf ][sock ].len = 0 ;
88
+ pBufStore [tailBuf ][sock ].idx = 0 ;
89
+ pBufStore [tailBuf ][sock ].pcb = 0 ;
74
90
75
91
if (++ tailBuf == MAX_PBUF_STORED )
76
92
tailBuf = 0 ;
93
+ INFO_UTIL ("%p [%d,%d]\n" , buf , headBuf , tailBuf );
94
+ free (buf );
95
+ }
96
+
97
+ void freetDataIdx (uint8_t idxBuf , uint8_t sock )
98
+ {
99
+ if (idxBuf >=MAX_PBUF_STORED )
100
+ {
101
+ WARN ("idxBuf out of range: %d\n" , idxBuf );
102
+ return ;
103
+ }
104
+
105
+ void * buf = pBufStore [idxBuf ][sock ].data ;
106
+
107
+ INFO_UTIL ("%p idx:%d\n" , buf , idxBuf );
108
+
77
109
free (buf );
110
+
111
+ pBufStore [idxBuf ][sock ].data = 0 ;
112
+ pBufStore [idxBuf ][sock ].len = 0 ;
113
+ pBufStore [idxBuf ][sock ].idx = 0 ;
114
+ pBufStore [idxBuf ][sock ].pcb = 0 ;
78
115
}
79
116
117
+
80
118
void ack_recved (void * pcb , int len );
81
119
82
120
bool isAvailTcpDataByte (uint8_t sock )
@@ -85,10 +123,10 @@ bool isAvailTcpDataByte(uint8_t sock)
85
123
86
124
if (p != NULL )
87
125
{
88
- INFO_UTIL ("check:%d %d %p\n" ,p -> idx , p -> len , p -> data );
126
+ INFO_UTIL_VER ("check:%d %d %p\n" ,p -> idx , p -> len , p -> data );
89
127
if (p -> idx == p -> len )
90
128
{
91
- freetData (p -> data );
129
+ freetData (p -> data , sock );
92
130
ack_recved (p -> pcb , p -> len );
93
131
INFO_UTIL ("Free %p other buf %d tail:%d head:%d\n" ,
94
132
p -> data , IS_BUF_AVAIL (), tailBuf , headBuf );
@@ -116,12 +154,12 @@ bool getTcpDataByte(uint8_t sock, uint8_t* payload, uint8_t peek)
116
154
* payload = buf [p -> idx ];
117
155
else
118
156
* payload = buf [p -> idx ++ ];
119
- INFO_UTIL ("get:%d %p %d\n" ,p -> idx , p -> data , * payload );
157
+ INFO_UTIL_VER ("get:%d %p %d\n" ,p -> idx , p -> data , * payload );
120
158
return true;
121
159
}else {
122
160
//dealloc current buffer
123
161
INFO_UTIL ("Free %p\n" , p -> data );
124
- freetData (p -> data );
162
+ freetData (p -> data , sock );
125
163
ack_recved (p -> pcb , p -> len );
126
164
}
127
165
}
@@ -147,7 +185,7 @@ bool freeTcpData(uint8_t sock)
147
185
p = get_pBuf (sock );
148
186
if (p != NULL )
149
187
{
150
- freetData (p -> data );
188
+ freetData (p -> data , sock );
151
189
ack_recved (p -> pcb , p -> len );
152
190
return true;
153
191
}
0 commit comments