activemq-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Arthur Naseef (JIRA)" <j...@apache.org>
Subject [jira] [Commented] (AMQCPP-529) Crash in Threads due to small stack size (set to 32768 bytes)
Date Thu, 02 Jan 2014 16:49:50 GMT

    [ https://issues.apache.org/jira/browse/AMQCPP-529?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13860323#comment-13860323
] 

Arthur Naseef commented on AMQCPP-529:
--------------------------------------

I see.  So, what are you looking for here?  A way to change the stack size, or a wholesale
increase in the default size?  Keep in mind that large numbers of threads with large stack
sizes can use up all available address space for the application, causing an out-of-memory
condition.

Can you use dynamic allocation with auto_ptr or unique_ptr to ensure deletion of the array
at the right time?

auto_ptr: http://www.cplusplus.com/reference/memory/auto_ptr/ 
unique_ptr: http://www.cplusplus.com/reference/memory/unique_ptr/

Something like this is what I'm proposing:

{noformat}
   void onMessage (Message *msg)
   {
     char[] data;

     data = new char[16384];
     unique_ptr  delete_data_on_leaving_scope(data);

     ...

     // Do NOT call delete on data.  It will be done by the unique_ptr under all code paths.
  }
{noformat}

Note I've never personally used unique_ptr, only auto_ptr, so test this.

> Crash in Threads due to small stack size (set to 32768 bytes)
> -------------------------------------------------------------
>
>                 Key: AMQCPP-529
>                 URL: https://issues.apache.org/jira/browse/AMQCPP-529
>             Project: ActiveMQ C++ Client
>          Issue Type: Bug
>          Components: Decaf
>    Affects Versions: 3.8.1
>         Environment: linux50
>            Reporter: omri zomet
>            Assignee: Timothy Bish
>            Priority: Critical
>
> Using version 3.8.1 of activemq-cpp (after using version 3.4.5) - we have suffered a
crash in code running in amq threads.
> Investigation shows that this happens when trying to use a char[] buffer on stack of
size > 16384 , probably due to the stack size being of size 32768.
> Thread::Thread() constructors call initializeSelf() with stackSize=(-1), which 
> in turn call createThreadInstance() with negative stackSize value (hence using PLATFORM_DEFAULT_STACK_SIZE).
> Relevant code below:
> ----------------------
>  #define PLATFORM_DEFAULT_STACK_SIZE 0x8000
> -----------------------
> void createThreadInstance(ThreadHandle* thread, long long stackSize, int  priority, bool
suspended, threadingTask threadMain, void* threadArg) {
>         if (stackSize <= 0) {
>             stackSize = PLATFORM_DEFAULT_STACK_SIZE;
>         }
> ...
> }
> ----------------------



--
This message was sent by Atlassian JIRA
(v6.1.5#6160)

Mime
View raw message