Fix boehmgc-coroutine-sp-fallback.diff for FreeBSD

Our FreeBSD headers have `pthread_getattr_np`, but we get a link-time
error that is missing. The good news is that there is another similar
function which does exist, and the upstream project elsewhere does just
the [fallback code] we need.

As the fallback code indicates, the two functions are not identical
however as the other one needs explicit initialization. NetBSD supports
both in fact, and its [manpage] is therefore a good
resource on what the differences are.

[fallback code]: 07a6d0ee88/os_dep.c (L1266-L1272)

[manpage]: https://man.netbsd.org/pthread_attr_get_np.3
This commit is contained in:
John Ericson 2023-08-31 00:07:49 -04:00
parent 7f76d7f038
commit c18911602e

View File

@ -59,12 +59,18 @@ index b5d71e62..aed7b0bf 100644
GC_bool found_me = FALSE; GC_bool found_me = FALSE;
size_t nthreads = 0; size_t nthreads = 0;
int i; int i;
@@ -851,6 +853,31 @@ GC_INNER void GC_push_all_stacks(void) @@ -851,6 +853,37 @@ GC_INNER void GC_push_all_stacks(void)
hi = p->altstack + p->altstack_size; hi = p->altstack + p->altstack_size;
/* FIXME: Need to scan the normal stack too, but how ? */ /* FIXME: Need to scan the normal stack too, but how ? */
/* FIXME: Assume stack grows down */ /* FIXME: Assume stack grows down */
+ } else { + } else {
+ if (pthread_getattr_np(p->id, &pattr)) { +#ifdef HAVE_PTHREAD_ATTR_GET_NP
+ if (!pthread_attr_init(&pattr)
+ || !pthread_attr_get_np(p->id, &pattr))
+#else /* HAVE_PTHREAD_GETATTR_NP */
+ if (pthread_getattr_np(p->id, &pattr))
+#endif
+ {
+ ABORT("GC_push_all_stacks: pthread_getattr_np failed!"); + ABORT("GC_push_all_stacks: pthread_getattr_np failed!");
+ } + }
+ if (pthread_attr_getstacksize(&pattr, &stack_limit)) { + if (pthread_attr_getstacksize(&pattr, &stack_limit)) {