Как вызвать threadsafe функцию rrd_update_r Round Robin Database с C API? - PullRequest
1 голос
/ 13 июля 2011

Может кто-нибудь помочь мне узнать, как вызвать функцию rrd_update_r API-интерфейса rrdtool из http://oss.oetiker.ch/rrdtool/index.en.html?

Было довольно легко вызвать не-поточную версию rrd_update, но этасложнее ...

обычный rrd_update:

  char *updateparams[] = {
        "rrdupdate",
        rrd_file,
        values,
        NULL
    };

    rrd_clear_error();
    result = rrd_update(3, updateparams); //argc is first arg

Поскольку программа должна работать в многопоточной среде, я получил несколько ошибок, не используя поточно-безопасные функции!Но использовать rrd_update_r не так просто, потому что для этого тоже нужен шаблон ...

 int    rrd_update_r(const char *filename, const char *_template,
            int argc, const char **argv);

и я действительно не знаю, как его создать ...

    char *updateparams[] = {
        "rrdupdate",
        rrd_file,
        values,
        NULL
    };


    rrd_clear_error();
   result = rrd_update_r(rrd_file, NULL,3, updateparams);

не работает и выдает следующую ошибку при его выполнении ...

error: /var/tmp/rrds/1.rrd: expected timestamp not found in data source from rrdupdate

Надеюсь, кто-нибудь может мне помочь!

thx and br, roegi

Ответы [ 2 ]

1 голос
/ 13 июля 2011

Ну, глядя на исходный код ...

Похоже, что rrd_update_r не хочет видеть аргумент "rrupdate". Поэтому попробуйте просто передать rrd_file и values как 2-элементный argv.

На самом деле источник для rrd_update не трудно прочитать; вы можете найти его в src / rrd_update.c. И rrd_update_r представляется гораздо более низкоуровневой функцией, которую вызывает сама rrd_update. Так что это может на самом деле не решить вашу основную проблему.

0 голосов
/ 14 июля 2011

Теперь это работает!Nemo - спасибо за вашу помощь!Это было не совсем ваше решение, но это был намек в правильном направлении!

Он работает с:

/*
rrd_file is a char * to "/var/tmp/1.rrd"
NULL says not to use a template
1 --> argc 
values is a char * to "N:value-1:value-2:.....:value-n"
*/

result = rrd_update_r(rrd_file, NULL, 1, (void *) &values); 
...