| 189 | } |
| 190 | |
| 191 | uint32_t cache_copy_out(TRWCache* cache, void* buff, uint32_t len) |
| 192 | { |
| 193 | if ((cache == NULL) || (cache->pool == NULL)) { |
| 194 | return 0; |
| 195 | } |
| 196 | |
| 197 | char* out_buff = (char*)buff; |
| 198 | uint32_t left = len, skip_len = 0; |
| 199 | TSkBuffer* item = NULL; |
| 200 | TSkBuffer* tmp = NULL; |
| 201 | TAILQ_FOREACH_SAFE(item, &cache->list, entry, tmp) |
| 202 | { |
| 203 | skip_len = (item->data_len > left) ? left : item->data_len; |
| 204 | if (out_buff != NULL) |
| 205 | { |
| 206 | memcpy(out_buff, item->data, skip_len); |
| 207 | out_buff += skip_len; |
| 208 | } |
| 209 | |
| 210 | left -= skip_len; |
| 211 | item->data_len -= skip_len; |
| 212 | item->data += skip_len; |
| 213 | if (item->data_len > 0) |
| 214 | { |
| 215 | break; |
| 216 | } |
| 217 | |
| 218 | if (cache->count > 0) { |
| 219 | cache->count--; |
| 220 | } |
| 221 | TAILQ_REMOVE(&cache->list, item, entry); |
| 222 | free_sk_buffer(cache->pool, item); |
| 223 | |
| 224 | if (left == 0) |
| 225 | { |
| 226 | break; |
| 227 | } |
| 228 | } |
| 229 | |
| 230 | skip_len = len - left; |
| 231 | if (cache->len > skip_len) |
| 232 | { |
| 233 | cache->len -= skip_len; |
| 234 | } |
| 235 | else |
| 236 | { |
| 237 | cache->len = 0; |
| 238 | } |
| 239 | |
| 240 | return skip_len; |
| 241 | } |
| 242 | |
| 243 | void cache_skip_data(TRWCache* cache, uint32_t len) |
| 244 | { |
no test coverage detected