Обсуждение: Needs Suggestion

Поиск
Список
Период
Сортировка

Needs Suggestion

От
subham@cse.iitb.ac.in
Дата:
How can I increase the stack depth limit ? Is it only by modifying the
postgres.conf file, but there I cannot increase the stack depth beyond 4
MB.

Actually, my problem is that, when I set the stack base address of the
child thread using the POSIX library function "pthread_setstackaddr()", I
am unable to access the memory contents of its parent. The data-structures
in the parent are either getting destroyed or unaccessible when moving to
the context of the child thread.
But when I create the child thread without setting its stack base address
then it is able to access the parent's memory contents. But if the child
thread's code size is large then it is getting stack fault and displaying
the message "MAX stack depth limit reached ...".
Can anyone give any reason why is that so ?
OR
If I cannot set the child thread's stack base address. Then How can I
increase the stack depth limit to a large value ?

-- 

Thank You,
Subham Roy.



Re: Needs Suggestion

От
Heikki Linnakangas
Дата:
On 22/09/10 11:14, subham@cse.iitb.ac.in wrote:
>
> How can I increase the stack depth limit ? Is it only by modifying the
> postgres.conf file, but there I cannot increase the stack depth beyond 4
> MB.
>
> Actually, my problem is that, when I set the stack base address of the
> child thread using the POSIX library function "pthread_setstackaddr()", I
> am unable to access the memory contents of its parent. The data-structures
> in the parent are either getting destroyed or unaccessible when moving to
> the context of the child thread.

It is not a good idea to use threads in server code. PostgreSQL server 
code is not thread-safe, things will break.

Assuming that you're not actually doing that but using threads in the 
client instead, max_stack_depth should have no effect on you as it only 
affects the server.

But you really should find another way to communicate between threads. 
Stacks should be treated as thread-private. Use malloc() or something 
and global variables.

--   Heikki Linnakangas  EnterpriseDB   http://www.enterprisedb.com


Re: Needs Suggestion

От
Heikki Linnakangas
Дата:
On 22/09/10 12:03, subham@cse.iitb.ac.in wrote:
> Actually, I used palloc() to set the stack base address.
> And I am trying to create only a single thread, then also it is causing
> problem.
> Actually, I created all the data-structures using palloc(), then I am
> passing these to the child thread. Even if I make these variables global
> then also it is not working.
> But if I don't set its stack address then it is working. But I need to do
> that because when my thread body is big then it is causing stack fault.
> So if I cannot set its stack address then Can I increase the stack depth
> limit to a large value ?

It's not clear what you're trying to do, but it's just not going to 
work. The backend code is not thread-safe, so you can't safely create 
any threads in server code. Not even a single one. And even if you 
could, you should not mess with stack base addresses.

--   Heikki Linnakangas  EnterpriseDB   http://www.enterprisedb.com


Re: Needs Suggestion

От
Tom Lane
Дата:
subham@cse.iitb.ac.in writes:
> How can I increase the stack depth limit ? Is it only by modifying the
> postgres.conf file, but there I cannot increase the stack depth beyond 4
> MB.

> Actually, my problem is that, when I set the stack base address of the
> child thread using the POSIX library function "pthread_setstackaddr()", I
> am unable to access the memory contents of its parent.

You've got worse problems than the stack depth limit.  Creating multiple
threads inside a backend process is entirely unsupported and just about
guaranteed to result in massive breakage.  Don't do it.
        regards, tom lane


Re: Needs Suggestion

От
subham@cse.iitb.ac.in
Дата:

Actually, I used palloc() to set the stack base address.
And I am trying to create only a single thread, then also it is causing
problem.
Actually, I created all the data-structures using palloc(), then I am
passing these to the child thread. Even if I make these variables global
then also it is not working.
But if I don't set its stack address then it is working. But I need to do
that because when my thread body is big then it is causing stack fault.
So if I cannot set its stack address then Can I increase the stack depth
limit to a large value ?

-- 

Thank You,
Subham Roy.

> On 22/09/10 11:14, subham@cse.iitb.ac.in wrote:
>>
>> How can I increase the stack depth limit ? Is it only by modifying the
>> postgres.conf file, but there I cannot increase the stack depth beyond 4
>> MB.
>>
>> Actually, my problem is that, when I set the stack base address of the
>> child thread using the POSIX library function "pthread_setstackaddr()",
>> I
>> am unable to access the memory contents of its parent. The
>> data-structures
>> in the parent are either getting destroyed or unaccessible when moving
>> to
>> the context of the child thread.
>
> It is not a good idea to use threads in server code. PostgreSQL server
> code is not thread-safe, things will break.
>
> Assuming that you're not actually doing that but using threads in the
> client instead, max_stack_depth should have no effect on you as it only
> affects the server.
>
> But you really should find another way to communicate between threads.
> Stacks should be treated as thread-private. Use malloc() or something
> and global variables.
>
> --
>    Heikki Linnakangas
>    EnterpriseDB   http://www.enterprisedb.com
>






Re: Needs Suggestion

От
subham@cse.iitb.ac.in
Дата:
So, Can I increase the stack depth limit to a large value ?


> On 22/09/10 12:03, subham@cse.iitb.ac.in wrote:
>> Actually, I used palloc() to set the stack base address.
>> And I am trying to create only a single thread, then also it is causing
>> problem.
>> Actually, I created all the data-structures using palloc(), then I am
>> passing these to the child thread. Even if I make these variables global
>> then also it is not working.
>> But if I don't set its stack address then it is working. But I need to
>> do
>> that because when my thread body is big then it is causing stack fault.
>> So if I cannot set its stack address then Can I increase the stack depth
>> limit to a large value ?
>
> It's not clear what you're trying to do, but it's just not going to
> work. The backend code is not thread-safe, so you can't safely create
> any threads in server code. Not even a single one. And even if you
> could, you should not mess with stack base addresses.
>
> --
>    Heikki Linnakangas
>    EnterpriseDB   http://www.enterprisedb.com
>


-- 

Thank You,
Subham Roy.



Re: Needs Suggestion

От
Andrew Dunstan
Дата:


On 09/22/2010 05:03 AM, subham@cse.iitb.ac.in wrote:
>
> Actually, I used palloc() to set the stack base address.
> And I am trying to create only a single thread, then also it is causing
> problem.     

Did you not understand when people told you this wasn't going to work? 
Don't create any threads.

cheers

andrew