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