mirror of
https://git.proxmox.com/git/mirror_frr
synced 2025-06-15 02:00:24 +00:00
Merge pull request #793 from opensourcerouting/hash-double-init
lib: init & cleanup fixes
This commit is contained in:
commit
991ae35b17
@ -50,6 +50,12 @@ init_cmdgraph (struct vty *, struct graph **);
|
|||||||
/** shim interface commands **/
|
/** shim interface commands **/
|
||||||
struct graph *nodegraph = NULL, *nodegraph_free = NULL;
|
struct graph *nodegraph = NULL, *nodegraph_free = NULL;
|
||||||
|
|
||||||
|
#define check_nodegraph() \
|
||||||
|
do { if (!nodegraph) { \
|
||||||
|
vty_outln(vty, "nodegraph not initialized"); \
|
||||||
|
return CMD_WARNING; \
|
||||||
|
} } while (0)
|
||||||
|
|
||||||
DEFUN (grammar_test,
|
DEFUN (grammar_test,
|
||||||
grammar_test_cmd,
|
grammar_test_cmd,
|
||||||
"grammar parse LINE...",
|
"grammar parse LINE...",
|
||||||
@ -57,6 +63,8 @@ DEFUN (grammar_test,
|
|||||||
"parse a command\n"
|
"parse a command\n"
|
||||||
"command to pass to new parser\n")
|
"command to pass to new parser\n")
|
||||||
{
|
{
|
||||||
|
check_nodegraph();
|
||||||
|
|
||||||
int idx_command = 2;
|
int idx_command = 2;
|
||||||
// make a string from tokenized command line
|
// make a string from tokenized command line
|
||||||
char *command = argv_concat (argv, argc, idx_command);
|
char *command = argv_concat (argv, argc, idx_command);
|
||||||
@ -85,6 +93,8 @@ DEFUN (grammar_test_complete,
|
|||||||
"attempt to complete input on DFA\n"
|
"attempt to complete input on DFA\n"
|
||||||
"command to complete\n")
|
"command to complete\n")
|
||||||
{
|
{
|
||||||
|
check_nodegraph();
|
||||||
|
|
||||||
int idx_command = 2;
|
int idx_command = 2;
|
||||||
char *cmdstr = argv_concat (argv, argc, idx_command);
|
char *cmdstr = argv_concat (argv, argc, idx_command);
|
||||||
if (!cmdstr)
|
if (!cmdstr)
|
||||||
@ -143,6 +153,8 @@ DEFUN (grammar_test_match,
|
|||||||
"attempt to match input on DFA\n"
|
"attempt to match input on DFA\n"
|
||||||
"command to match\n")
|
"command to match\n")
|
||||||
{
|
{
|
||||||
|
check_nodegraph();
|
||||||
|
|
||||||
int idx_command = 2;
|
int idx_command = 2;
|
||||||
if (argv[2]->arg[0] == '#')
|
if (argv[2]->arg[0] == '#')
|
||||||
return CMD_SUCCESS;
|
return CMD_SUCCESS;
|
||||||
@ -209,6 +221,8 @@ DEFUN (grammar_test_doc,
|
|||||||
"Test function for docstring\n"
|
"Test function for docstring\n"
|
||||||
"Command end\n")
|
"Command end\n")
|
||||||
{
|
{
|
||||||
|
check_nodegraph();
|
||||||
|
|
||||||
// create cmd_element with docstring
|
// create cmd_element with docstring
|
||||||
struct cmd_element *cmd = XCALLOC (MTYPE_CMD_TOKENS, sizeof (struct cmd_element));
|
struct cmd_element *cmd = XCALLOC (MTYPE_CMD_TOKENS, sizeof (struct cmd_element));
|
||||||
cmd->string = XSTRDUP (MTYPE_CMD_TOKENS, "test docstring <example|selector follow> (1-255) end VARIABLE [OPTION|set lol] . VARARG");
|
cmd->string = XSTRDUP (MTYPE_CMD_TOKENS, "test docstring <example|selector follow> (1-255) end VARIABLE [OPTION|set lol] . VARARG");
|
||||||
@ -243,12 +257,10 @@ DEFUN (grammar_test_show,
|
|||||||
"print current accumulated DFA\n"
|
"print current accumulated DFA\n"
|
||||||
"include docstrings\n")
|
"include docstrings\n")
|
||||||
{
|
{
|
||||||
struct graph_node *stack[MAXDEPTH];
|
check_nodegraph();
|
||||||
|
|
||||||
if (!nodegraph)
|
struct graph_node *stack[MAXDEPTH];
|
||||||
vty_out(vty, "nodegraph uninitialized\r\n");
|
pretty_print_graph (vty, vector_slot (nodegraph->nodes, 0), 0, argc >= 3, stack, 0);
|
||||||
else
|
|
||||||
pretty_print_graph (vty, vector_slot (nodegraph->nodes, 0), 0, argc >= 3, stack, 0);
|
|
||||||
return CMD_SUCCESS;
|
return CMD_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -259,14 +271,12 @@ DEFUN (grammar_test_dot,
|
|||||||
"print current graph for dot\n"
|
"print current graph for dot\n"
|
||||||
".dot filename\n")
|
".dot filename\n")
|
||||||
{
|
{
|
||||||
|
check_nodegraph();
|
||||||
|
|
||||||
struct graph_node *stack[MAXDEPTH];
|
struct graph_node *stack[MAXDEPTH];
|
||||||
struct graph_node *visited[MAXDEPTH*MAXDEPTH];
|
struct graph_node *visited[MAXDEPTH*MAXDEPTH];
|
||||||
size_t vpos = 0;
|
size_t vpos = 0;
|
||||||
|
|
||||||
if (!nodegraph) {
|
|
||||||
vty_out(vty, "nodegraph uninitialized\r\n");
|
|
||||||
return CMD_SUCCESS;
|
|
||||||
}
|
|
||||||
FILE *ofd = fopen(argv[2]->arg, "w");
|
FILE *ofd = fopen(argv[2]->arg, "w");
|
||||||
if (!ofd) {
|
if (!ofd) {
|
||||||
vty_out(vty, "%s: %s\r\n", argv[2]->arg, strerror(errno));
|
vty_out(vty, "%s: %s\r\n", argv[2]->arg, strerror(errno));
|
||||||
@ -476,8 +486,6 @@ DEFUN (grammar_access,
|
|||||||
|
|
||||||
/* this is called in vtysh.c to set up the testing shim */
|
/* this is called in vtysh.c to set up the testing shim */
|
||||||
void grammar_sandbox_init(void) {
|
void grammar_sandbox_init(void) {
|
||||||
init_cmdgraph (NULL, &nodegraph);
|
|
||||||
|
|
||||||
// install all enable elements
|
// install all enable elements
|
||||||
install_element (ENABLE_NODE, &grammar_test_cmd);
|
install_element (ENABLE_NODE, &grammar_test_cmd);
|
||||||
install_element (ENABLE_NODE, &grammar_test_show_cmd);
|
install_element (ENABLE_NODE, &grammar_test_show_cmd);
|
||||||
|
@ -428,6 +428,13 @@ DEFUN(show_hash_stats,
|
|||||||
long double ssq; // ssq casted to long double
|
long double ssq; // ssq casted to long double
|
||||||
|
|
||||||
pthread_mutex_lock (&_hashes_mtx);
|
pthread_mutex_lock (&_hashes_mtx);
|
||||||
|
if (!_hashes)
|
||||||
|
{
|
||||||
|
pthread_mutex_unlock (&_hashes_mtx);
|
||||||
|
vty_outln (vty, "No hash tables in use.");
|
||||||
|
return CMD_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
for (ALL_LIST_ELEMENTS_RO (_hashes, ln, h))
|
for (ALL_LIST_ELEMENTS_RO (_hashes, ln, h))
|
||||||
{
|
{
|
||||||
if (!h->name)
|
if (!h->name)
|
||||||
@ -482,6 +489,5 @@ DEFUN(show_hash_stats,
|
|||||||
void
|
void
|
||||||
hash_cmd_init ()
|
hash_cmd_init ()
|
||||||
{
|
{
|
||||||
_hashes = list_new();
|
|
||||||
install_element (ENABLE_NODE, &show_hash_stats_cmd);
|
install_element (ENABLE_NODE, &show_hash_stats_cmd);
|
||||||
}
|
}
|
||||||
|
@ -564,6 +564,12 @@ thread_master_free_unused (struct thread_master *m)
|
|||||||
void
|
void
|
||||||
thread_master_free (struct thread_master *m)
|
thread_master_free (struct thread_master *m)
|
||||||
{
|
{
|
||||||
|
pthread_mutex_lock (&masters_mtx);
|
||||||
|
{
|
||||||
|
listnode_delete (masters, m);
|
||||||
|
}
|
||||||
|
pthread_mutex_unlock (&masters_mtx);
|
||||||
|
|
||||||
thread_array_free (m, m->read);
|
thread_array_free (m, m->read);
|
||||||
thread_array_free (m, m->write);
|
thread_array_free (m, m->write);
|
||||||
thread_queue_free (m, m->timer);
|
thread_queue_free (m, m->timer);
|
||||||
|
Loading…
Reference in New Issue
Block a user