From 09806d757675912cebfb0789296343552fc4b7c0 Mon Sep 17 00:00:00 2001 From: Geza Lore Date: Mon, 29 Jun 2020 17:27:43 +0100 Subject: [PATCH] Update fstapi.c to latest (fix undefined thread behaviour) --- include/gtkwave/fstapi.c | 21 +++++++++++++++++++-- test_regress/driver.pl | 9 --------- 2 files changed, 19 insertions(+), 11 deletions(-) diff --git a/include/gtkwave/fstapi.c b/include/gtkwave/fstapi.c index 8540587bb..8c95f7bfe 100644 --- a/include/gtkwave/fstapi.c +++ b/include/gtkwave/fstapi.c @@ -794,6 +794,7 @@ pthread_t thread; pthread_attr_t thread_attr; struct fstWriterContext *xc_parent; #endif +unsigned in_pthread : 1; size_t fst_orig_break_size; size_t fst_orig_break_add_size; @@ -1806,10 +1807,9 @@ static void *fstWriterFlushContextPrivate1(void *ctx) { struct fstWriterContext *xc = (struct fstWriterContext *)ctx; +pthread_mutex_lock(&(xc->xc_parent->mutex)); fstWriterFlushContextPrivate2(xc); -pthread_mutex_unlock(&(xc->xc_parent->mutex)); - #ifdef FST_REMOVE_DUPLICATE_VC free(xc->curval_mem); #endif @@ -1818,6 +1818,9 @@ free(xc->vchg_mem); tmpfile_close(&xc->tchn_handle, &xc->tchn_handle_nam); free(xc); +xc->xc_parent->in_pthread = 0; +pthread_mutex_unlock(&(xc->xc_parent->mutex)); + return(NULL); } @@ -1865,7 +1868,15 @@ if(xc->parallel_enabled) xc->section_header_only = 0; xc->secnum++; + while (xc->in_pthread) + { + pthread_mutex_lock(&xc->mutex); + pthread_mutex_unlock(&xc->mutex); + }; + pthread_mutex_lock(&xc->mutex); + xc->in_pthread = 1; + pthread_mutex_unlock(&xc->mutex); pthread_create(&xc->thread, &xc->thread_attr, fstWriterFlushContextPrivate1, xc2); } @@ -1947,6 +1958,12 @@ if(xc && !xc->already_in_close && !xc->already_in_flush) #ifdef FST_WRITER_PARALLEL pthread_mutex_lock(&xc->mutex); pthread_mutex_unlock(&xc->mutex); + + while (xc->in_pthread) + { + pthread_mutex_lock(&xc->mutex); + pthread_mutex_unlock(&xc->mutex); + }; #endif } } diff --git a/test_regress/driver.pl b/test_regress/driver.pl index 0c5dc3851..d4b12ddb5 100755 --- a/test_regress/driver.pl +++ b/test_regress/driver.pl @@ -1076,15 +1076,6 @@ sub compile { return 1; } - if ($^O eq "freebsd") { - my $flags = join(' ', $self->compile_vlt_flags(%param)); - if ($flags =~ /--trace-fst/ && $flags =~ /--trace-threads/) { - # See https://github.com/gtkwave/gtkwave/issues/24 - $self->skip("Known fstapi.c threading issue on FreeBSD"); - return 1; - } - } - if (!$param{fails} && $param{make_main}) { $self->_make_main(); }