kv_do()没有按预期工作

时间:2016-09-05 20:04:06

标签: g-wan

这是在我的 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进程:

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

在尝试访问所有项目后,kv_do测试进程启动无限循环后启动服务器段错误。它适用于列表中的一个项目,然后它只访问第一个项目并退出。我还可以使用kv_get逐个访问ID。

我发现了一个边缘情况,如果我的密钥是"测试频道"它可以使用两个项目。密钥长度是strlen(" Test Channel")然后下一个频道密钥是" Test Channel2"密钥长度与第一项密钥长度一样长。很混乱。

代码中的错误(指针等)或进程应该如何处理返回值1?

我知道gwan有时会遇到KVM问题,所以如果可能的话,我会用Ubuntu运行Oracle VM VirtualBox v5.0.24。

1 个答案:

答案 0 :(得分:0)

kv.cpersistence.c G-WAN示例是否适合您?

如果其中任何一个崩溃,那么您可能正在使用不同步。带有最新gwan.h可执行文件的G-WAN标头(./gwan)。