bugGuile - Bugs: bug #20814, Issues with multithreading (using...

 
 

bug #20814: Issues with multithreading (using pthread, libguile 1.8.2)

Submitted by:  None
Submitted on:  Sat 18 Aug 2007 05:36:39 PM UTC  
 
Category: NoneSeverity: 3 - Normal
Item Group: NoneStatus: None
Privacy: PublicAssigned to: None
Open/Closed: Closed

Add a New Comment(Rich Markup)
   

You are not logged in

Please log in, so followups can be emailed to you.

 

(Jump to the original submission Jump to the original submission)

Mon 20 Aug 2007 09:34:56 AM UTC, comment #6:

Hi,

Thanks for the reply.. now let's see...
Yes, the problem with the first example is indeed lack of guile mode in scm_test(), fixed by reworking it to call scm_init_guile() first, after which it enters a loop evaluating stuff, which just happily keeps on going. It works now, thanks.

You were right again on the second one, it works now too.

Thanks a lot for helping me out here.

Anonymous
Mon 20 Aug 2007 09:22:53 AM UTC, comment #5:

Hi,

In your first example, the thread that executes `scm_test ()' is not in Guile mode (see `scm_with_guile'), hence the segfault I suppose.

In your second example, I suspect you have two initializations going in parallel. I'd rather first call `scm_init_guile ()' and then call `guile_exec_thread ()'. Can you tell us whether that fixes the problem?

Thanks,
Ludovic.

Ludovic Courtès <civodul>
Project Administrator
Mon 20 Aug 2007 09:17:49 AM UTC, comment #4:

Hi,

I've recompiled libguile from source (the original library I was using was part of Kubuntu's guile-libs package), removing the symbol size difference problem, so I suppose that's a bug with the lib I had originally installed and not a generic guile bug. The top snippet's behavior now mirrors the behavior of the bottom one , meaning it receives SIGSEGV after a while, but otherwise seems to be able to evaluate s-expressions just fine.

Anonymous
Mon 20 Aug 2007 08:48:10 AM UTC, comment #3:

Hi

Of course, the simplest sample code that refuses to run is the following:
#include <libguile.h>
void* scm_test (void* l){
SCM_TICK;
scm_c_eval_string("(write (+ 6 5)) (newline)");
}

int main(int argc, char** argv){
pthread_t blah;
scm_init_guile();
pthread_create(&blah, 0,scm_test,0);
while(1)
{
SCM_TICK;
scm_c_primitive_load("test.scm");
}
}
This is running on Kubuntu GNU/Linux, here's the output of uname -a:
Linux zero-desktop 2.6.20-16-generic #2 SMP Thu Jun 7 20:19:32 UTC 2007 i686 GNU/Linux
Interestingly, the above sample code has a different problem, namely:
./a.out:
Symbol `scm_i_thread_key' has different size in shared object, consider re-linking
Segmentatiefout (core dumped)

The above might be a specific problem with my guile installation.

The other code with its amount of thread-safety issues (i.e. my original program with some guile additions), has a rather large amount of non-guile related code in it, so I'll omit that in the sample code for now, but, condensed, it'd come down to roughly:

void* guile_main(void* arglet){
scm_shell(0,0);
}

void* run_guile(void* func){
scm_with_guile(func,0);
}

pthread_t guile_exec_thread(void* func){
pthread_t thread;
pthread_create(&thread,NULL,run_guile,func);
}

int
main (int argc, char **argv)
{
//misc initialization
guile_exec_thread(guile_main);
scm_init_guile();
while (1)
{
SCM_TICK;
//the body of a game's drawing loop (uses loads of OpenGL and other non-guile calls)
scm_c_primitive_load("test.scm");
//sleep until the next frame
}
return 0;
}

I'll provide more information if necessary and for now, I'll recompile guile to see if that would fix my first problem.

Thanks for taking the time to discuss this.

Anonymous
Mon 20 Aug 2007 07:47:39 AM UTC, comment #2:

Hi,

Can you please post sample code so that we have a clear idea of what you're doing?

Also, what platform is this on?

Thanks,
Ludovic.

Ludovic Courtès <civodul>
Project Administrator
Sat 18 Aug 2007 08:15:59 PM UTC, comment #1:

Just to clarify, the scm_* functions are called in a function called with scm_with_guile, so the threads calling scm_* functions are in guile mode.

Anonymous
Sat 18 Aug 2007 05:36:39 PM UTC, original submission:

Hello,
I hope I haven't misinterpreted the Guile Reference Manual, Edition 1.1, but as I understand section 4.3.5 on using Guile with a multi-threaded C application, it would be possible to execute a program's main loop, written entirely in C, in one thread while running a Guile REPL in another thread while interpreting Guile scripts in another.

If I do try to do this or execute any scm_* functions in 2 threads at the same time, the result apparently is a segmentation fault, a stack overflow or, in case of attempting to use scm_spawn_thread in one thread to spawn the others, an error message stating "Function not implemented".

The latter error message seems to be exclusively related to use of scm_spawn_thread, whereas any of the rest of the list of errors accompanies any usage of scm functions in two threads simultaneously, even if such usage is merely "scm_c_eval_string("(+ 5 6)");".

I'd like to ask you if any of this is related to a bug with guile 1.8.2 or if what I'd like to do is as of yet impossible. If necessary, I'll clarify anything that needs clarification and if I'm wasting your time and misunderstood the manual, I apologize in advance.

Anonymous

 

(Note: upload size limit is set to 16384 kB, after insertion of the required escape characters.)

Attach File(s):
   
   
Comment:
   

No files currently attached

 

Depends on the following items: None found

Items that depend on this one: None found

 

Carbon-Copy List
  • -unavailable- added by civodul (Posted a comment)
  •  

    Do you think this task is very important?
    If so, you can click here to add your encouragement to it.
    This task has 0 encouragements so far.

    Only logged-in users can vote.

     

    Please enter the title of George Orwell's famous dystopian book (it's a date):

     

     

    Follows 1 latest change.

    Date Changed By Updated Field Previous Value => Replaced By
    Mon 20 Aug 2007 09:48:11 AM UTCcivodulOpen/ClosedOpen=>Closed

    Back to the top


    Powered by Savane 3.1-cleanup1