Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 15 Mar 2005 09:48:01 -0800
From:      "Michael C. Shultz" <ringworm01@gmail.com>
To:        Daniel Eischen <deischen@freebsd.org>, freebsd-hackers@freebsd.org
Subject:   Re: threads question
Message-ID:  <200503150948.01624.ringworm01@gmail.com>
In-Reply-To: <Pine.GSO.4.43.0503142350110.9058-100000@sea.ntplx.net>
References:  <Pine.GSO.4.43.0503142350110.9058-100000@sea.ntplx.net>

next in thread | previous in thread | raw e-mail | index | archive | help
On Monday 14 March 2005 08:57 pm, Daniel Eischen wrote:
> On Mon, 14 Mar 2005, Michael C. Shultz wrote:
> > Hi, I've just reached a point in a program I'm writing where I'd
> > like to do threading.
> >
> > When I try to start a thread like this:
> >
> > pthread_create(&thread, &attr, MGPMrUpgrade, property );
>
>                                                ^^^^^^^^  &property
>
> You should compile with -Wall and get rid of any warnings.
>
> > where property is a structure of many variables it doesn't get
> > passed to the function.  If I do this:
> >
> > pthread_create(&thread, &attr, MGPMrUpgrade( &property ), NULL );
>
> That looks like it will actuall call MGPMrUpgrade() and use its
> return value as the function pointer.
>
> > It works, but just seems wrong.
> >
> > Can anyone point me to a source file, preferably in /usr/src
> > somewhere that passes a structure to a function being run as a
> > thread so I may study the proper way to do this?
>
>   src/lib/libpthread/test/sem_d.c
>   src/lib/libpthread/test/mutex_d.c
>   src/lib/libpthread/test/sigwait_d.c
>
> I'd suggest getting Butenhof's "Programming with POSIX Threads" book.

Daniel, sorry to bother you again but I ran into something that is 
either a bug or I am missing a vital piece of information somewhere.
Here is the situation:

this works perfectly because I moved MGPMrUpgrade into
the same .c file so it would be a static function:

structProperty*	property;
pthread_t		threads[NTHREADS];
pthread_create( &threads[0], NULL, zzMGPMrUpgrade, property );

When I use MGPMrUpgrade from a shared library the function runs
yet property isn't being passed!

 I remember from assembly days that there were some stack tricks to be 
done when making calls to a shared library in order to pass the 
parameters, I forget what they are (been ages since I did assembly 
programming) but anyways it seems like with gcc passing the args 
through the stack to a function in a shared library isn't being handled 
correctly.  Am I missing something obvious?

-Mike








Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200503150948.01624.ringworm01>