* guile 2.0.1 fluid *current-language* failed to initialize in multi-thread app
@ 2011-05-29 17:16 亚光唐
2011-05-30 8:57 ` Andy Wingo
2011-06-17 17:57 ` Andy Wingo
0 siblings, 2 replies; 3+ messages in thread
From: 亚光唐 @ 2011-05-29 17:16 UTC (permalink / raw)
To: bug-guile
I intend to use two thread eval some string in my app, but I found the
the child thread
will throw an exception when execute 'scm_eval_string' function.
I print out the call stack and check the source code, I found that the
*current-language*
variable is '#f" in the child thread. I think there must be something wrong.
Test environment:
Linux tyg-THINK 2.6.37 #7 SMP Tue Feb 22 11:25:54 CST 2011 x86_64
Intel(R) Core(TM) i3 CPU M 370 @ 2.40GHz GenuineIntel GNU/Linux
x86_64-unknown-linux-gnu (slackware 13.2)
gcc 4.4.4
guile 2.0.1 build with '--prefix=/usr/local/stow/guile-2.0.1'
'BDW_GC_CFLAGS=-I/usr/local/include' 'BDW_GC_LIBS=-L/usr/local/libs
-lgc'
BWD gc 7.1 with default config
Following code will reproduce the bug.
g++ -g -Wall -pipe -pthread
-I/usr/local/stow/guile-2.0.1/include/guile/2.0 -lguile-2.0
bug_repro.cpp -o bug_repro
// ---------------------------------------------------------------------------------------------------------------------------------------------------
#include <libguile.h>
#include <pthread.h>
#include <stdio.h>
#define MAXLINE 1024
static SCM catch_body(void *data)
{
char buf[MAXLINE];
char *s = (char*)data;
snprintf(buf, MAXLINE, "%s", s);
SCM ret_val = scm_eval_string(scm_from_locale_string(buf));
return ret_val;
}
static SCM catch_handler(void *data, SCM tag, SCM throw_args)
{
char *stag = scm_to_locale_string(scm_symbol_to_string(tag));
printf("--- catch %s: %s\n", stag, (char*)data);
free(stag);
return SCM_BOOL_T;
}
static SCM preunwind_handler(void *data, SCM key, SCM parameters)
{
/* Capture the stack here: */
*(SCM *)data = scm_make_stack (SCM_BOOL_T, SCM_EOL);
return SCM_BOOL_T;
}
static const char * const str1 = "(display \"This is string A\") (newline)";
static const char * const str2 = "(display \"This is string B\") (newline)";
void *eval_string(void *argp)
{
char *str = (char*)argp;
SCM captured_stack = SCM_BOOL_F;
// eval string.
scm_c_catch (SCM_BOOL_T, catch_body, str, catch_handler, str,
preunwind_handler, &captured_stack);
// print call stack on error.
SCM port = scm_open_output_string ();
if (captured_stack != SCM_BOOL_F) {
scm_display_backtrace (captured_stack, port, SCM_BOOL_F, SCM_BOOL_F);
SCM scm_str = scm_get_output_string (port);
char *stack_str = scm_to_locale_string(scm_str);
printf("%s", stack_str);
scm_close_output_port(port);
}
return 0;
}
static void* run_thread(void * arg)
{
scm_with_guile(eval_string, (void*)str2);
return 0;
}
static void
inner_main (void *closure, int argc, char **argv)
{
// eval string A
eval_string((void*)str1);
pthread_t tid;
// create new thread and eval string B
if (pthread_create(&tid, 0, run_thread, 0) < 0) {
exit(1);
}
pthread_join(tid, 0);
exit(0);
}
int main(int argc, char** argv)
{
scm_boot_guile(argc, argv, inner_main, 0);
}
// -----------------------------------------------------------------------------------------------------------------------------------------------------------------------
^ permalink raw reply [flat|nested] 3+ messages in thread
* Re: guile 2.0.1 fluid *current-language* failed to initialize in multi-thread app
2011-05-29 17:16 guile 2.0.1 fluid *current-language* failed to initialize in multi-thread app 亚光唐
@ 2011-05-30 8:57 ` Andy Wingo
2011-06-17 17:57 ` Andy Wingo
1 sibling, 0 replies; 3+ messages in thread
From: Andy Wingo @ 2011-05-30 8:57 UTC (permalink / raw)
To: 亚光唐; +Cc: bug-guile
On Sun 29 May 2011 19:16, 亚光唐 <texnician@gmail.com> writes:
> I print out the call stack and check the source code, I found that the
> *current-language*
> variable is '#f" in the child thread. I think there must be something wrong.
You're right, the initial value of fluids in threads that are not
spawned from a Guile thread is #f. I think this is a bug, but it's
longstanding behavior, so we can't change it in 2.0 I think (or can
we?).
But anyway, the rest of the code is usually careful to provide a default
value if a fluid is #f, but not so in this case it seems. Thanks for
the report; will fix.
Cheers,
Andy
--
http://wingolog.org/
^ permalink raw reply [flat|nested] 3+ messages in thread
* Re: guile 2.0.1 fluid *current-language* failed to initialize in multi-thread app
2011-05-29 17:16 guile 2.0.1 fluid *current-language* failed to initialize in multi-thread app 亚光唐
2011-05-30 8:57 ` Andy Wingo
@ 2011-06-17 17:57 ` Andy Wingo
1 sibling, 0 replies; 3+ messages in thread
From: Andy Wingo @ 2011-06-17 17:57 UTC (permalink / raw)
To: 亚光唐; +Cc: bug-guile
On Sun 29 May 2011 19:16, 亚光唐 <texnician@gmail.com> writes:
> I intend to use two thread eval some string in my app, but I found the
> the child thread
> will throw an exception when execute 'scm_eval_string' function.
I believe I have fixed this in git. Thanks for the report!
Andy
--
http://wingolog.org/
^ permalink raw reply [flat|nested] 3+ messages in thread
end of thread, other threads:[~2011-06-17 17:57 UTC | newest]
Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2011-05-29 17:16 guile 2.0.1 fluid *current-language* failed to initialize in multi-thread app 亚光唐
2011-05-30 8:57 ` Andy Wingo
2011-06-17 17:57 ` Andy Wingo
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).