Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

regex-morph.c: Add alloc_key() under #if HAVE_THREADS_H #1505

Merged
merged 1 commit into from
Apr 24, 2024

Conversation

ampli
Copy link
Member

@ampli ampli commented Apr 23, 2024

See PR #1504.
This PR solves the rest of the errors that appear when configuring with `CPPFLAGS="-DHAVE_THREADS_H=0".

@ryandesign
Copy link
Contributor

Thank you, it does compile on macOS with pcre2 with that change, however in make check the multi-dict and multi-thread tests crash with a segmentation fault, which doesn't happen if I disable pcre2 with the --with-regexlib=c configure argument. From the crash log, multi-dict crashed here:

Thread 6 Crashed:
0   libpcre2-8.0.dylib            	       0x1029e08a7 match + 49451
1   libpcre2-8.0.dylib            	       0x1029d4324 pcre2_match_8 + 4536
2   liblink-grammar.5.dylib       	       0x102886fbf reg_match + 39 (regex-morph.c:239) [inlined]
3   liblink-grammar.5.dylib       	       0x102886fbf match_regex + 207 (regex-morph.c:428)
4   liblink-grammar.5.dylib       	       0x1028b4b06 regex_guess + 12 (tokenize.c:377) [inlined]
5   liblink-grammar.5.dylib       	       0x1028b4b06 separate_word + 886 (tokenize.c:2681)
6   liblink-grammar.5.dylib       	       0x1028b4489 separate_sentence + 1257 (tokenize.c:3090)
7   liblink-grammar.5.dylib       	       0x1028ae13a sentence_split + 74 (sentence.c:93)
8   multi-dict                    	       0x1026fd5ba parse_one_sent(char const*) + 31 (multi-dict.cc:40) [inlined]
9   multi-dict                    	       0x1026fd5ba parse_sents(int, int) + 122 (multi-dict.cc:82)
10  multi-dict                    	       0x1026fd7e0 decltype(static_cast<void (*>(fp)(static_cast<int>(fp0), static_cast<int>(fp0))) std::__1::__invoke<void (*)(int, int), int, int>(void (*&&)(int, int), int&&, int&&) + 4 (type_traits:3918) [inlined]
11  multi-dict                    	       0x1026fd7e0 void std::__1::__thread_execute<std::__1::unique_ptr<std::__1::__thread_struct, std::__1::default_delete<std::__1::__thread_struct> >, void (*)(int, int), int, int, 2ul, 3ul>(std::__1::tuple<std::__1::unique_ptr<std::__1::__thread_struct, std::__1::default_delete<std::__1::__thread_struct> >, void (*)(int, int), int, int>&, std::__1::__tuple_indices<2ul, 3ul>) + 4 (thread:287) [inlined]
12  multi-dict                    	       0x1026fd7e0 void* std::__1::__thread_proxy<std::__1::tuple<std::__1::unique_ptr<std::__1::__thread_struct, std::__1::default_delete<std::__1::__thread_struct> >, void (*)(int, int), int, int> >(void*) + 48 (thread:298)
13  libsystem_pthread.dylib       	    0x7ff800d7b4e1 _pthread_start + 125
14  libsystem_pthread.dylib       	    0x7ff800d76f6b thread_start + 15

while multi-thread crashed here:

Thread 3 Crashed:
0   libpcre2-8.0.dylib            	       0x10da218e6 match + 362
1   libpcre2-8.0.dylib            	       0x10da21324 pcre2_match_8 + 4536
2   liblink-grammar.5.dylib       	       0x10d8d3fbf reg_match + 39 (regex-morph.c:239) [inlined]
3   liblink-grammar.5.dylib       	       0x10d8d3fbf match_regex + 207 (regex-morph.c:428)
4   liblink-grammar.5.dylib       	       0x10d901b06 regex_guess + 12 (tokenize.c:377) [inlined]
5   liblink-grammar.5.dylib       	       0x10d901b06 separate_word + 886 (tokenize.c:2681)
6   liblink-grammar.5.dylib       	       0x10d901489 separate_sentence + 1257 (tokenize.c:3090)
7   liblink-grammar.5.dylib       	       0x10d8fb13a sentence_split + 74 (sentence.c:93)
8   multi-thread                  	       0x10d74a233 parse_one_sent(Dictionary_s*, Parse_Options_s*, char const*) + 51 (multi-thread.cc:34)
9   multi-thread                  	       0x10d74a042 parse_sents(Dictionary_s*, Parse_Options_s*, int, int) + 1378 (multi-thread.cc:125)
10  multi-thread                  	       0x10d74a445 decltype(static_cast<void (*>(fp)(static_cast<Dictionary_s*>(fp0), static_cast<Parse_Options_s*>(fp0), static_cast<int>(fp0), static_cast<int>(fp0))) std::__1::__invoke<void (*)(Dictionary_s*, Parse_Options_s*, int, int), Dictionary_s*, Parse_Options_s*, int, int>(void (*&&)(Dictionary_s*, Parse_Options_s*, int, int), Dictionary_s*&&, Parse_Options_s*&&, int&&, int&&) + 3 (type_traits:3918) [inlined]
11  multi-thread                  	       0x10d74a445 void std::__1::__thread_execute<std::__1::unique_ptr<std::__1::__thread_struct, std::__1::default_delete<std::__1::__thread_struct> >, void (*)(Dictionary_s*, Parse_Options_s*, int, int), Dictionary_s*, Parse_Options_s*, int, int, 2ul, 3ul, 4ul, 5ul>(std::__1::tuple<std::__1::unique_ptr<std::__1::__thread_struct, std::__1::default_delete<std::__1::__thread_struct> >, void (*)(Dictionary_s*, Parse_Options_s*, int, int), Dictionary_s*, Parse_Options_s*, int, int>&, std::__1::__tuple_indices<2ul, 3ul, 4ul, 5ul>) + 17 (thread:287) [inlined]
12  multi-thread                  	       0x10d74a445 void* std::__1::__thread_proxy<std::__1::tuple<std::__1::unique_ptr<std::__1::__thread_struct, std::__1::default_delete<std::__1::__thread_struct> >, void (*)(Dictionary_s*, Parse_Options_s*, int, int), Dictionary_s*, Parse_Options_s*, int, int> >(void*) + 53 (thread:298)
13  libsystem_pthread.dylib       	    0x7ff800d7b4e1 _pthread_start + 125
14  libsystem_pthread.dylib       	    0x7ff800d76f6b thread_start + 15

#1495 should be mentioned in the commit message.

@ampli
Copy link
Member Author

ampli commented Apr 24, 2024

The current regex-morph.c PCRE2 code doesn't support using multi-threading without threads.h.

Possible solutions:

  1. Document that, maybe add a warning in configure, and modify the multi-threading tests to print a warning and exit.
  2. Modify the regex-morph.c PCRE2 code to use C++ threads, and modify configure.ac and link-grammar/Makefile.am accordingly.
  3. Modify the regex-morph.c PCRE2 code to use Pthreads.

Copy link
Contributor

@ryandesign ryandesign left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ok, I agree this change is correct since alloc_key is only used in other code that is already bracketed by the #if HAVE_THREADS_H && !__EMSCRIPTEN__ condition:

#if HAVE_THREADS_H && !__EMSCRIPTEN__
call_once(&call_once_flag, alloc_key);

I can file a separate bug report about the crash later.

@linas linas merged commit 77254ab into opencog:master Apr 24, 2024
1 check passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants