summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIgor Ryzhov <iryzhov@nfware.com>2021-10-20 19:44:45 +0300
committerGitHub <noreply@github.com>2021-10-20 19:44:45 +0300
commit5db95752c063a46a6ee8cdf5e65d45c68a8de77f (patch)
tree51fc37290262fc671c053bbd88406df8782a8595
parent16e2b641fa8d97dd315e8ff30426527bfd32bc07 (diff)
parente13f12a7d147a993a0aefd0b2b0ba947746071b4 (diff)
Merge pull request #9811 from donaldsharp/rib_update_fix
Various thread functional fixes
-rw-r--r--lib/thread.c8
-rw-r--r--lib/thread.h1
-rw-r--r--zebra/zebra_rib.c12
3 files changed, 16 insertions, 5 deletions
diff --git a/lib/thread.c b/lib/thread.c
index 835aa38115..71d7798af5 100644
--- a/lib/thread.c
+++ b/lib/thread.c
@@ -2059,3 +2059,11 @@ void debug_signals(const sigset_t *sigs)
zlog_debug("%s: %s", __func__, buf);
}
+
+bool thread_is_scheduled(struct thread *thread)
+{
+ if (thread == NULL)
+ return false;
+
+ return true;
+}
diff --git a/lib/thread.h b/lib/thread.h
index abd94ff4f0..c5f0ffbf77 100644
--- a/lib/thread.h
+++ b/lib/thread.h
@@ -273,6 +273,7 @@ extern pthread_key_t thread_current;
extern char *thread_timer_to_hhmmss(char *buf, int buf_size,
struct thread *t_timer);
+extern bool thread_is_scheduled(struct thread *thread);
/* Debug signal mask */
void debug_signals(const sigset_t *sigs);
diff --git a/zebra/zebra_rib.c b/zebra/zebra_rib.c
index 12e82dde94..fcac3328c9 100644
--- a/zebra/zebra_rib.c
+++ b/zebra/zebra_rib.c
@@ -3890,14 +3890,16 @@ void rib_update(enum rib_update_event event)
{
struct rib_update_ctx *ctx;
- ctx = rib_update_ctx_init(0, event);
+ if (thread_is_scheduled(t_rib_update_threads[event]))
+ return;
+ ctx = rib_update_ctx_init(0, event);
ctx->vrf_all = true;
- if (!thread_add_event(zrouter.master, rib_update_handler, ctx, 0,
- &t_rib_update_threads[event]))
- rib_update_ctx_fini(&ctx); /* Already scheduled */
- else if (IS_ZEBRA_DEBUG_EVENT)
+ thread_add_event(zrouter.master, rib_update_handler, ctx, 0,
+ &t_rib_update_threads[event]);
+
+ if (IS_ZEBRA_DEBUG_EVENT)
zlog_debug("%s: Scheduled VRF (ALL), event %s", __func__,
rib_update_event2str(event));
}