Skip to content
Snippets Groups Projects

Compare revisions

Changes are shown as if the source revision was being merged into the target revision. Learn more about comparing revisions.

Source

Select target project
No results found

Target

Select target project
  • dap/dap-sdk
1 result
Show changes
Commits on Source (5)
......@@ -54,11 +54,14 @@
static dap_server_t *s_cli_server = NULL;
static bool s_debug_cli = false;
static atomic_int_fast64_t s_cmd_thread_count = 0;
static dap_cli_cmd_t *cli_commands = NULL;
static dap_cli_cmd_aliases_t *s_command_alias = NULL;
static inline dap_cli_cmd_t *s_cmd_add_ex(const char *a_name, dap_cli_server_cmd_callback_ex_t a_func, void *a_arg_func, const char *a_doc, const char *a_doc_ex);
static dap_cli_server_cmd_stat_callback_t s_stat_callback = NULL;
static inline dap_cli_cmd_t *s_cmd_add_ex(const char *a_name, dap_cli_server_cmd_callback_ex_t a_func, void *a_arg_func, const char *a_doc, const char *a_doc_ex, int16_t a_id);
typedef struct cli_cmd_arg {
dap_worker_t *worker;
......@@ -191,9 +194,9 @@ void dap_cli_server_deinit()
* @param a_doc
* @param a_doc_ex
*/
dap_cli_cmd_t *dap_cli_server_cmd_add(const char * a_name, dap_cli_server_cmd_callback_t a_func, const char *a_doc, const char *a_doc_ex)
dap_cli_cmd_t *dap_cli_server_cmd_add(const char * a_name, dap_cli_server_cmd_callback_t a_func, const char *a_doc, int16_t a_id, const char *a_doc_ex)
{
return s_cmd_add_ex(a_name, (dap_cli_server_cmd_callback_ex_t)(void *)a_func, NULL, a_doc, a_doc_ex);
return s_cmd_add_ex(a_name, (dap_cli_server_cmd_callback_ex_t)(void *)a_func, NULL, a_doc, a_doc_ex, a_id);
}
/**
......@@ -204,7 +207,7 @@ dap_cli_cmd_t *dap_cli_server_cmd_add(const char * a_name, dap_cli_server_cmd_ca
* @param a_doc
* @param a_doc_ex
*/
static inline dap_cli_cmd_t *s_cmd_add_ex(const char * a_name, dap_cli_server_cmd_callback_ex_t a_func, void *a_arg_func, const char *a_doc, const char *a_doc_ex)
static inline dap_cli_cmd_t *s_cmd_add_ex(const char * a_name, dap_cli_server_cmd_callback_ex_t a_func, void *a_arg_func, const char *a_doc, const char *a_doc_ex, int16_t a_id)
{
dap_cli_cmd_t *l_cmd_item = DAP_NEW_Z(dap_cli_cmd_t);
if (!l_cmd_item) {
......@@ -220,6 +223,7 @@ static inline dap_cli_cmd_t *s_cmd_add_ex(const char * a_name, dap_cli_server_cm
} else {
l_cmd_item->func = (dap_cli_server_cmd_callback_t )(void *)a_func;
}
l_cmd_item->id = a_id;
HASH_ADD_STR(cli_commands,name,l_cmd_item);
log_it(L_DEBUG,"Added command %s",l_cmd_item->name);
return l_cmd_item;
......@@ -240,7 +244,6 @@ int json_commands(const char * a_name) {
"chain_ca_copy",
"dag",
"block",
"dag",
"token",
"esbocs",
"global_db",
......@@ -429,6 +432,7 @@ dap_cli_cmd_t *dap_cli_server_cmd_find_by_alias(const char *a_alias, char **a_ap
}
static void *s_cli_cmd_exec(void *a_arg) {
atomic_fetch_add(&s_cmd_thread_count, 1);
cli_cmd_arg_t *l_arg = (cli_cmd_arg_t*)a_arg;
char *l_ret = dap_cli_cmd_exec(l_arg->buf),
*l_full_ret = dap_strdup_printf("HTTP/1.1 200 OK\r\n"
......@@ -438,6 +442,7 @@ static void *s_cli_cmd_exec(void *a_arg) {
dap_events_socket_write_mt(l_arg->worker, l_arg->es_uid, l_full_ret, dap_strlen(l_full_ret));
// TODO: pagination
DAP_DEL_MULTY(l_arg->buf, /* l_full_ret, */ l_arg);
atomic_fetch_sub(&s_cmd_thread_count, 1);
return NULL;
}
......@@ -505,6 +510,10 @@ char *dap_cli_cmd_exec(char *a_req_str) {
}
// Call the command function
if(l_cmd && l_argv && l_cmd->func) {
dap_time_t l_call_time = 0;
if (s_stat_callback) {
l_call_time = dap_nanotime_now();
}
if (json_commands(cmd_name)) {
res = l_cmd->func(l_argc, l_argv, (void *)&l_json_arr_reply);
} else if (l_cmd->arg_func) {
......@@ -512,6 +521,9 @@ char *dap_cli_cmd_exec(char *a_req_str) {
} else {
res = l_cmd->func(l_argc, l_argv, (void *)&str_reply);
}
if (s_stat_callback) {
s_stat_callback(l_cmd->id, (dap_nanotime_now() - l_call_time) / 1000000);
}
} else if (l_cmd) {
log_it(L_WARNING,"NULL arguments for input for command \"%s\"", str_cmd);
dap_json_rpc_error_add(l_json_arr_reply, -1, "NULL arguments for input for command \"%s\"", str_cmd);
......@@ -550,3 +562,20 @@ char *dap_cli_cmd_exec(char *a_req_str) {
dap_json_rpc_request_free(request);
return response_string;
}
DAP_INLINE int64_t dap_cli_get_cmd_thread_count()
{
return atomic_load(&s_cmd_thread_count);
}
/**
* @brief dap_cli_server_cmd_add
* @param a_callback callback to statistic collect
*/
void dap_cli_server_statistic_callback_add(dap_cli_server_cmd_stat_callback_t a_callback)
{
if (a_callback && s_stat_callback)
log_it(L_ERROR, "Dap cli server statistic callback already added");
else
s_stat_callback = a_callback;
}
\ No newline at end of file
......@@ -32,6 +32,7 @@
typedef int (*dap_cli_server_cmd_callback_ex_t)(int argc, char ** argv, void *arg_func, void **a_str_reply);
typedef int (*dap_cli_server_cmd_callback_t)(int argc, char ** argv, void **a_str_reply);
typedef void (*dap_cli_server_cmd_stat_callback_t)(int16_t a_cmd_num, int64_t a_call_time); // use to statistic collect
typedef void (*dap_cli_server_override_log_cmd_callback_t)(const char*);
......@@ -50,6 +51,7 @@ typedef struct dap_cli_cmd{
char *doc; /* Documentation for this function. */
char *doc_ex; /* Full documentation for this function. */
dap_cli_server_cmd_override_t overrides; /* Used to change default behaviour */
int16_t id;
UT_hash_handle hh;
} dap_cli_cmd_t;
......@@ -64,7 +66,7 @@ typedef struct dap_cli_cmd_aliases{
int dap_cli_server_init(bool a_debug_more, const char *a_cfg_section);
void dap_cli_server_deinit();
dap_cli_cmd_t *dap_cli_server_cmd_add(const char * a_name, dap_cli_server_cmd_callback_t a_func, const char *a_doc, const char *a_doc_ex);
dap_cli_cmd_t *dap_cli_server_cmd_add(const char * a_name, dap_cli_server_cmd_callback_t a_func, const char *a_doc, int16_t a_id, const char *a_doc_ex);
DAP_PRINTF_ATTR(2, 3) void dap_cli_server_cmd_set_reply_text(void **a_str_reply, const char *str, ...);
int dap_cli_server_cmd_find_option_val( char** argv, int arg_start, int arg_end, const char *opt_name, const char **opt_value);
int dap_cli_server_cmd_check_option( char** argv, int arg_start, int arg_end, const char *opt_name);
......@@ -75,7 +77,9 @@ dap_cli_cmd_t* dap_cli_server_cmd_find(const char *a_name);
dap_cli_cmd_aliases_t *dap_cli_server_alias_add(dap_cli_cmd_t *a_cmd, const char *a_pre_cmd, const char *a_alias);
dap_cli_cmd_t *dap_cli_server_cmd_find_by_alias(const char *a_cli, char **a_append, char **a_ncmd);
int64_t dap_cli_get_cmd_thread_count();
//for json
int json_commands(const char * a_name);
char *dap_cli_cmd_exec(char *a_req_str);
void dap_cli_server_statistic_callback_add(dap_cli_server_cmd_stat_callback_t a_callback);
......@@ -77,6 +77,7 @@ static dap_cluster_t *s_global_links_cluster = NULL;
static pthread_rwlock_t s_streams_lock = PTHREAD_RWLOCK_INITIALIZER; // Lock for all tables and list under
static dap_stream_t *s_authorized_streams = NULL; // Authorized streams hashtable by addr
static dap_stream_t *s_streams = NULL; // Double-linked list
static int32_t s_streams_count = 0; // Stream count
static dap_enc_key_type_t s_stream_get_preferred_encryption_type = DAP_ENC_KEY_TYPE_IAES;
static int s_add_stream_info(authorized_stream_t **a_hash_table, authorized_stream_t *a_item, dap_stream_t *a_stream);
......@@ -966,8 +967,10 @@ void s_stream_delete_from_list(dap_stream_t *a_stream)
return log_it(L_CRITICAL, "! Attempt to aquire streams lock recursively !");
dap_stream_t *l_stream = NULL;
if (a_stream->prev)
if (a_stream->prev) {
DL_DELETE(s_streams, a_stream);
--s_streams_count;
}
if (a_stream->authorized) {
// It's an authorized stream, try to replace it in hastable
if (a_stream->primary)
......@@ -995,6 +998,7 @@ int dap_stream_add_to_list(dap_stream_t *a_stream)
if ( lock == EDEADLK )
return log_it(L_CRITICAL, "! Attempt to aquire streams lock recursively !"), -666;
DL_APPEND(s_streams, a_stream);
++s_streams_count;
if (a_stream->authorized)
l_ret = s_stream_add_to_hashtable(a_stream);
pthread_rwlock_unlock(&s_streams_lock);
......@@ -1158,6 +1162,12 @@ dap_stream_info_t *dap_stream_get_links_info(dap_cluster_t *a_cluster, size_t *a
return l_ret;
}
inline int32_t dap_stream_get_links_count()
{
return s_streams_count;
}
void dap_stream_delete_links_info(dap_stream_info_t *a_info, size_t a_count)
{
dap_return_if_fail(a_info && a_count);
......
......@@ -160,3 +160,4 @@ dap_stream_node_addr_t dap_stream_node_addr_from_cert(dap_cert_t *a_cert);
dap_stream_node_addr_t dap_stream_node_addr_from_pkey(dap_pkey_t *a_pkey);
dap_stream_info_t *dap_stream_get_links_info(dap_cluster_t *a_cluster, size_t *a_count);
void dap_stream_delete_links_info(dap_stream_info_t *a_info, size_t a_count);
int32_t dap_stream_get_links_count();
......@@ -22,7 +22,7 @@ void dap_plugin_command_init(void)
{
if (!s_l_restart_plugins){
dap_cli_server_cmd_add("plugin", s_command_handler,
"Commands for working with plugins:\n",
"Commands for working with plugins:\n", -1,
"plugin list\n"
"\tShow plugins list\n"
"plugin show <plugin name>\n"
......