Обсуждение: Needs Suggestion
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.
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
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
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
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 >
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.
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