ssize_t cavan_cache_fill(struct cavan_cache *cache, char *buff, size_t size, size_t reserved, u32 timeout) { char *buff_bak = buff; char *buff_end = buff + size; while (buff < buff_end) { ssize_t rdlen = cavan_cache_read(cache, buff, buff_end - buff, reserved, timeout); if (rdlen < 0) { pr_red_info("cavan_cache_read"); return rdlen; } if (rdlen == 0) { size = buff - buff_bak; break; } buff += rdlen; } return size; }
static void *read_thread_handler(void *data) { ssize_t rdlen; char buff[1024]; struct cavan_cache *cache = data; while (1) { rdlen = cavan_cache_read_line(cache, buff, sizeof(buff), 0, 20000); if (rdlen <= 0) { if (rdlen < 0) { pr_red_info("cavan_cache_read"); break; } else { rdlen = cavan_cache_read(cache, buff, sizeof(buff) - 1, 0, 0); if (rdlen <= 0) { break; } } } buff[rdlen] = 0; #if __WORDSIZE == 64 pr_green_info("buff[%ld] = %s", rdlen, buff); #else pr_green_info("buff[%d] = %s", rdlen, buff); #endif // msleep(500); } pr_red_info("Read thread exit!"); return NULL; }
ssize_t cavan_cache_read_line(struct cavan_cache *cache, char *buff, size_t size, size_t reserved, u32 timeout) { char *buff_bak = buff; char *buff_end = buff + size - 1; while (buff < buff_end) { char c; ssize_t rdlen; rdlen = cavan_cache_read(cache, &c, 1, reserved, timeout); if (rdlen < 0) { pr_red_info("cavan_cache_read"); return rdlen; } if (rdlen == 0) { break; } switch (c) { case '\n': if (buff > buff_bak) { goto out_return; } case '\r': break; default: *buff++ = c; } } out_return: *buff = 0; return buff - buff_bak; }