rrdfunctions-inline.c 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142
  1. // SPDX-License-Identifier: GPL-3.0-or-later
  2. #include "rrdfunctions-inline.h"
  3. struct rrd_function_inline {
  4. rrd_function_execute_inline_cb_t cb;
  5. };
  6. static int rrd_function_run_inline(struct rrd_function_execute *rfe, void *data) {
  7. // IMPORTANT: this function MUST call the result_cb even on failures
  8. struct rrd_function_inline *fi = data;
  9. int code;
  10. if(rfe->is_cancelled.cb && rfe->is_cancelled.cb(rfe->is_cancelled.data))
  11. code = HTTP_RESP_CLIENT_CLOSED_REQUEST;
  12. else
  13. code = fi->cb(rfe->result.wb, rfe->function);
  14. if(code == HTTP_RESP_CLIENT_CLOSED_REQUEST || (rfe->is_cancelled.cb && rfe->is_cancelled.cb(rfe->is_cancelled.data))) {
  15. buffer_flush(rfe->result.wb);
  16. code = HTTP_RESP_CLIENT_CLOSED_REQUEST;
  17. }
  18. if(rfe->result.cb)
  19. rfe->result.cb(rfe->result.wb, code, rfe->result.data);
  20. return code;
  21. }
  22. void rrd_function_add_inline(RRDHOST *host, RRDSET *st, const char *name, int timeout, int priority, const char *help, const char *tags,
  23. HTTP_ACCESS access, rrd_function_execute_inline_cb_t execute_cb) {
  24. rrd_collector_started(); // this creates a collector that runs for as long as netdata runs
  25. struct rrd_function_inline *fi = callocz(1, sizeof(struct rrd_function_inline));
  26. fi->cb = execute_cb;
  27. rrd_function_add(host, st, name, timeout, priority, help, tags, access, true, rrd_function_run_inline, fi);
  28. }