about summary refs log tree commit homepage
path: root/t/watch_filter_rubylang.t
diff options
context:
space:
mode:
authorEric Wong <e@80x24.org>2023-09-06 00:08:26 +0000
committerEric Wong <e@80x24.org>2023-09-07 00:48:40 +0000
commit50c7179e5ed4c6c9d0d1e7b23592669e4b3dcd01 (patch)
treec67285fe3c2317bf2374803b0f8c27dd0c04d918 /t/watch_filter_rubylang.t
parent49898510175f0e9ea62bea83fb333c85b8278362 (diff)
downloadpublic-inbox-50c7179e5ed4c6c9d0d1e7b23592669e4b3dcd01.tar.gz
t/watch_filter_rubylang.t: DS->Reset to avoid segfault
Object destruction order needs to be managed manually here to
avoid an occasional segfault at _rthread_mutex_timedlock() with
the following callstack:

	XS_DBI_dispatch()
	XS_DBD__SQLite__st_DESTROY()
	sqlite_st_destroy()
	sqlite3_finalize()
	_rthread_mutex_timedlock()

...on OpenBSD 7.3 (Perl 5.36, DBD::SQLite 1.70v0, DBI 1.643p0,
sqlite 3.41.0).  I'm not sure exactly where the bug is, but I
suspect it's something inherent in Perl's unpredictable
destruction order at process teardown (something I've had to
workaround in the past when dealing with XS extensions).

There's no downloadable debug-* OpenBSD packages to ease
debugging for these components, either.
Diffstat (limited to 't/watch_filter_rubylang.t')
-rw-r--r--t/watch_filter_rubylang.t3
1 files changed, 3 insertions, 0 deletions
diff --git a/t/watch_filter_rubylang.t b/t/watch_filter_rubylang.t
index 004e794e..643dbb8a 100644
--- a/t/watch_filter_rubylang.t
+++ b/t/watch_filter_rubylang.t
@@ -99,6 +99,9 @@ EOF
         }
         $w->scan('full');
 
+        # ensure orderly destruction to avoid SQLite segfault:
+        PublicInbox::DS->Reset;
+
         $cfg = PublicInbox::Config->new(\$orig);
         $ibx = $cfg->lookup_name($v);
         $ibx->{-no_fsync} = 1;