kv_do() не работает должным образом

Это в моем init.c:

server_data_t **data = (server_data_t**)get_env(argv, US_SERVER_DATA);
data[0] = (server_data_t*)calloc(1, sizeof(server_data_t));

kv_t *channels = &data[0]->channels;
kv_t *users = &data[0]->users;

kv_init(channels, "channels.dat", 10*1024, 0, 0, 0);
kv_init(users, "users.dat", 10*1024, 0, 0, 0);

Эти инициализации были только для тестирования куколок:

channel_t *channel = (channel_t*)calloc(1, sizeof(channel_t));
channel->name = strdup("Test channel");
channel->id = 1;

kv_item channel_item;
channel_item.key = (char*)&channel->id;
channel_item.klen = sizeof(u32);
channel_item.val = (char*)channel;
channel_item.in_use = 0;

kv_add(channels, &channel_item);

channel_t *channel2 = (channel_t*)calloc(1, sizeof(channel_t));
channel2->name = strdup("Test channel2");
channel2->id = 2;

kv_item channel_item2;
channel_item2.key = (char*)&channel2->id;
channel_item2.klen = sizeof(u32);
channel_item2.val = (char*)channel2;
channel_item2.in_use = 0;

kv_add(channels, &channel_item2);

kv_do(channels, NULL, sizeof(u32), test_proc, 0);

Пользовательский процесс kv_do process:

static int test_proc(const kv_item *item, const void *ctx)
{
    return 1;
}

Запуск сервера segfaults после того, как процесс тестирования kv_do запускает бесконечный цикл при попытке посетить все элементы. Он отлично работает с одним элементом в списке, затем просто посещает первый элемент и выходит. Я также могу посещать пункты по одному с идентификатором, используя kv_get.

Я обнаружил крайний случай, когда он работал с двумя элементами, если мой ключ был "Тестовый канал", длина ключа была strlen("Тестовый канал"), а затем ключом следующего канала был "Тестовый канал2", где длина ключа была равна первой длина ключа предметов. Довольно запутанно.

Ошибка в коде (указатели и тому подобное) или как процесс должен работать с возвращаемым значением 1?

Я знаю, что у gwan иногда возникают проблемы с KVM, поэтому, если это так, я использую Oracle VM VirtualBox v5.0.24 с Ubuntu.

1 ответ

Являются ли kv.c а также persistence.c G-WAN примеры работают на вас?

Если какой-либо из них дает сбой, вы, вероятно, используете рассинхронизацию. Заголовки G-WAN (gwan.h) с недавнего ./gwan исполняемый файл.

Другие вопросы по тегам