| Bill Allombert on Sun, 16 Apr 2017 15:33:41 +0200 |
[Date Prev] [Date Next] [Thread Prev] [Thread Next] [Date Index] [Thread Index]
| Re: libpari: threads and argument passing |
On Sun, Apr 16, 2017 at 03:01:38PM +0200, Jan Jancar wrote:
> Hello PARI developers,
> looking at the "PARI and threads" part of the libpari
Hello Jan,
Thanks for for reviewing the documentation!
> manual suggests that the only way to pass an argument
> to a PARI thread is if it is a GEN.
I assume you speak of pari_thread_alloc/pari_thread_start ?
> However it could be quite useful to be able to pass an
> arbitrary void* as the pthread API allows. A void* is
> guaranteed to be able to hold a pointer to any type,
> so passing a GEN is still possible, while a long*
> (what a GEN really is) is not guaranteed to be able to
> hold a pointer to any type. This generally makes passing
> a pointer to a custom structure and casting it to a GEN
> risky business on architectures where it doesn't fit
> (are there any?).
Maybe I am wrong but as I understand it, the C standard only
differentiate pointers to data and pointers to functions.
So as far as I am concerned, you are welcome to cast your void*
to a GEN and pass it to pari_thread_alloc.
> Is there some reason I'm not seeing as to why the
> argument is restricted to a GEN type?
I did it that way because it saves a lot of casts in the common case when
the argument is a GEN.
But actually, the API does not require pthread_create() to be called with
the output of pari_thread_alloc().
You can create a struct:
struct my_pari_thread
{
struct pari_thread pth;
void * args; /* Or whatever */
} my_pth;
pari_thread_alloc(&my_pth.pth,4000000,NULL);
pthread_create(&th,NULL,&myfun,(void*)&my_pth);
and then do
void *
myfun(void *arg)
{
GEN F, M;
struct my_pari_thread *marg = (struct my_pari_thread) arg;
/* Set up thread stack and get thread parameter */
(void) pari_thread_start(&marg.pth);
... do something with marg.args ...
}
Cheers,
Bill.