fix: fixed issue #82: Deadlock when reading files larger that 4 KByte
parent
e1128fe3cd
commit
ef1022a084
@ -0,0 +1,64 @@
|
||||
#include "webfuse/impl/util/buffer.h"
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
void
|
||||
wf_impl_buffer_init(
|
||||
struct wf_buffer * buffer,
|
||||
size_t initial_capacity)
|
||||
{
|
||||
buffer->data = malloc(initial_capacity);
|
||||
buffer->size = 0;
|
||||
buffer->capacity = initial_capacity;
|
||||
}
|
||||
|
||||
void
|
||||
wf_impl_buffer_cleanup(
|
||||
struct wf_buffer * buffer)
|
||||
{
|
||||
free(buffer->data);
|
||||
}
|
||||
|
||||
bool
|
||||
wf_impl_buffer_is_empty(
|
||||
struct wf_buffer * buffer)
|
||||
{
|
||||
return (0 == buffer->size);
|
||||
}
|
||||
|
||||
void
|
||||
wf_impl_buffer_clear(
|
||||
struct wf_buffer * buffer)
|
||||
{
|
||||
buffer->size = 0;
|
||||
}
|
||||
|
||||
void
|
||||
wf_impl_buffer_append(
|
||||
struct wf_buffer * buffer,
|
||||
char const * data,
|
||||
size_t length)
|
||||
{
|
||||
while (length > (buffer->capacity - buffer->size))
|
||||
{
|
||||
buffer->capacity *= 2;
|
||||
buffer->data = realloc(buffer->data, buffer->capacity);
|
||||
}
|
||||
|
||||
memcpy(&(buffer->data[buffer->size]), data, length);
|
||||
buffer->size += length;
|
||||
}
|
||||
|
||||
char *
|
||||
wf_impl_buffer_data(
|
||||
struct wf_buffer * buffer)
|
||||
{
|
||||
return buffer->data;
|
||||
}
|
||||
|
||||
size_t
|
||||
wf_impl_buffer_size(
|
||||
struct wf_buffer * buffer)
|
||||
{
|
||||
return buffer->size;
|
||||
}
|
@ -0,0 +1,59 @@
|
||||
#ifndef WF_IMPL_UTIL_BUFFER_H
|
||||
#define WF_IMPL_UTIL_BUFFER_H
|
||||
|
||||
#ifndef __cplusplus
|
||||
#include <stddef.h>
|
||||
#include <stdbool.h>
|
||||
#else
|
||||
#include <cstddef>
|
||||
#endif
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C"
|
||||
{
|
||||
#endif
|
||||
|
||||
struct wf_buffer
|
||||
{
|
||||
char * data;
|
||||
size_t size;
|
||||
size_t capacity;
|
||||
};
|
||||
|
||||
extern void
|
||||
wf_impl_buffer_init(
|
||||
struct wf_buffer * buffer,
|
||||
size_t initial_capacity);
|
||||
|
||||
extern void
|
||||
wf_impl_buffer_cleanup(
|
||||
struct wf_buffer * buffer);
|
||||
|
||||
extern bool
|
||||
wf_impl_buffer_is_empty(
|
||||
struct wf_buffer * buffer);
|
||||
|
||||
extern void
|
||||
wf_impl_buffer_clear(
|
||||
struct wf_buffer * buffer);
|
||||
|
||||
extern void
|
||||
wf_impl_buffer_append(
|
||||
struct wf_buffer * buffer,
|
||||
char const * data,
|
||||
size_t lenght);
|
||||
|
||||
extern char *
|
||||
wf_impl_buffer_data(
|
||||
struct wf_buffer * buffer);
|
||||
|
||||
extern size_t
|
||||
wf_impl_buffer_size(
|
||||
struct wf_buffer * buffer);
|
||||
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif
|
@ -0,0 +1,46 @@
|
||||
#include "webfuse/impl/util/buffer.h"
|
||||
#include <gtest/gtest.h>
|
||||
|
||||
TEST(wf_buffer, append)
|
||||
{
|
||||
wf_buffer buffer;
|
||||
wf_impl_buffer_init(&buffer, 2);
|
||||
|
||||
wf_impl_buffer_append(&buffer, "Hello", 5);
|
||||
wf_impl_buffer_append(&buffer, ", " , 2);
|
||||
wf_impl_buffer_append(&buffer, "World", 6);
|
||||
|
||||
ASSERT_STREQ("Hello, World", wf_impl_buffer_data(&buffer));
|
||||
ASSERT_EQ(13, wf_impl_buffer_size(&buffer));
|
||||
|
||||
wf_impl_buffer_cleanup(&buffer);
|
||||
}
|
||||
|
||||
TEST(wf_buffer, is_empty)
|
||||
{
|
||||
wf_buffer buffer;
|
||||
wf_impl_buffer_init(&buffer, 20);
|
||||
|
||||
ASSERT_TRUE(wf_impl_buffer_is_empty(&buffer));
|
||||
|
||||
wf_impl_buffer_append(&buffer, "Hi!", 4);
|
||||
ASSERT_FALSE(wf_impl_buffer_is_empty(&buffer));
|
||||
|
||||
wf_impl_buffer_cleanup(&buffer);
|
||||
}
|
||||
|
||||
TEST(wf_buffer, clear)
|
||||
{
|
||||
wf_buffer buffer;
|
||||
wf_impl_buffer_init(&buffer, 2);
|
||||
|
||||
ASSERT_TRUE(wf_impl_buffer_is_empty(&buffer));
|
||||
|
||||
wf_impl_buffer_append(&buffer, "Hi!", 4);
|
||||
ASSERT_FALSE(wf_impl_buffer_is_empty(&buffer));
|
||||
|
||||
wf_impl_buffer_clear(&buffer);
|
||||
ASSERT_TRUE(wf_impl_buffer_is_empty(&buffer));
|
||||
|
||||
wf_impl_buffer_cleanup(&buffer);
|
||||
}
|
Loading…
Reference in new issue