我想在持久模式下记录键值,但是当我想使用两个或更多不同的商店时,它就不工作了。
这是我的剧本:
...
typedef struct{
kv_t *kv;
char *name;
} kv_data;
int main(int argc, char *argv[])
{
kv_data **data = (kv_data**)get_env(argv, US_SERVER_DATA);
if(!data[0]){
data[0] = (kv_data*)calloc(1, sizeof(kv_data));
if(!data[0]){
return 500;
}
kv_t users;
kv_init(&users, "users", 10, 0, 0, 0);
data[0]->kv = &users;
kv_item item;
item.key = "pierre";
item.klen = sizeof("pierre") - 1;
item.val = "pierre@example.com";
item.flags = 0;
kv_add(data[0]->kv, &item);
data[0]->name = strdup("users");
}
...
这个错误在第15行中使用kv_init()函数。
例如,我希望使用data->kv在“ use ”存储中读取和记录值,并使用data 1->kv在其他存储中读取和记录值.
发布于 2014-04-27 11:01:56
我只是附加了一个kv存储,其中包含了我需要的所有kv存储到持久性指针。G-广域网kv速度快,加上记录次数少,不应损害性能.
xbuf_t *reply = get_reply(argv);
kv_t **kv_db = (kv_t **)get_env(argv, US_VHOST_DATA);
if (!kv_db[0])
{
kv_db[0] = (kv_t*) malloc(sizeof(kv_t));
if (!kv_db[0])
{
puts("Could not allocate memory for the v-host kv store");
return 500;
}
kv_init(kv_db[0], "kv_db", 10, 0, 0, 0);
}
kv_t *blog_db = (kv_t *) kv_get(kv_db[0], "blog_db", 7);
if (blog_db)
{
xbuf_cat(reply, "Blog already installed. GTFO.");
return 200;
}
blog_db = (kv_t *) malloc(sizeof(kv_t));
kv_init(blog_db, "blog_db", 0, 0, 0, 0);
if (!blog_db)
{
puts("Could not allocate memory for the blog kv store");
return 500;
}
_KV_ADD(kv_db[0], item, blog_db->name, blog_db, 0);
(_KV_ADD是一个自定义宏)
发布于 2014-04-26 11:54:07
约翰,
你的问题来自于在指针上玩指针的困难。我们可以修复这段代码,但由于它的复杂性,它可能会在稍后的脚本中中断。
从长远来看,应该使用更简单的解决方案来避免bug。
附加在US_SERVER_DATA
上的结构可以变得更简单:
typedef struct
{
char *name;
kv_t *kv_1;
kv_t *kv_2;
void *callback;
u32 current_time;
}
这就是方法:使用calloc(sizeof(my_struct));
分配内存,并将此结构附加到您的US_SERVER_DATA
指针。
然后,如果您在G处理程序init()
调用(或在gwan/main.c
维护脚本中,甚至在最近添加的gwan/init.c
脚本中)中完成所有这些操作,您将拥有独占访问(一个线程正在进行初始化),并且您将能够根据需要攻击G存储(和其他对象)。
如果以后G或处理程序正在修改这些结构指针,那么您必须为指针本身使用锁、自旋锁等或原子变量。
希望这能有所帮助。
https://stackoverflow.com/questions/23305661
复制相似问题