[prev in list] [next in list] [prev in thread] [next in thread] 

List:       activemq-dev
Subject:    [jira] [Updated] (AMQCPP-564) OS thread handles are kept forever
From:       "Dusan Kutnik (JIRA)" <jira () apache ! org>
Date:       2015-02-27 12:36:04
Message-ID: JIRA.12774907.1423837640000.33416.1425040564496 () Atlassian ! JIRA
[Download RAW message or body]


     [ https://issues.apache.org/jira/browse/AMQCPP-564?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel \
]

Dusan Kutnik updated AMQCPP-564:
--------------------------------
    Attachment: Threading.h.diff
                Threading.cpp.diff

In the attachment are diff files that seems to work correctly. It would be nice to \
have it in a future release of the AMQ CPP.

> OS thread handles are kept forever
> ----------------------------------
> 
> Key: AMQCPP-564
> URL: https://issues.apache.org/jira/browse/AMQCPP-564
> Project: ActiveMQ C++ Client
> Issue Type: Improvement
> Components: Decaf
> Affects Versions: 3.8.3
> Environment: All
> Reporter: Dusan Kutnik
> Assignee: Timothy Bish
> Attachments: Threading.cpp.diff, Threading.h.diff
> 
> 
> The method decaf::internal::util::concurrent::Threading::attachToCurrentThread() \
> creates a proxy thread object for a new OS thread and keeps it in a vector: \
> //////////////////////////////////////////////////////////////////////////////// \
> ThreadHandle* Threading::attachToCurrentThread() { Pointer<ThreadHandle> \
> thread(initThreadHandle(new ThreadHandle())); thread->handle = \
> PlatformThread::getCurrentThread(); thread->state = Thread::RUNNABLE;
> thread->stackSize = PlatformThread::getStackSize(thread->handle);
> thread->name = ::strdup(
> std::string(std::string("OS-Thread") + \
> Integer::toString(library->osThreadId.getAndIncrement())).c_str()); \
> thread->threadId = PlatformThread::getCurrentThreadId(); // An OS Thread doesn't \
> have a running thread, this is only a proxy to only one ref. thread->references = \
> 1; // Now create a Decaf Thread as a proxy to the OS thread.
> Pointer<Thread> osThread(new Thread(thread.get()));
> thread->parent = osThread.get();
> thread->osThread = true;
> PlatformThread::setTlsValue(library->threadKey, osThread.get());
> PlatformThread::setTlsValue(library->selfKey, thread.get());
> // Store the Thread that wraps this OS thread for later deletion since
> // no other owners exist.
> PlatformThread::lockMutex(library->globalLock);
> library->osThreads.push_back(osThread.release());
> PlatformThread::unlockMutex(library->globalLock);
> return thread.release();
> }
> This method is part of the mutex machinery in the AMQ CPP. The only way how to free \
> this memory is to invoke the method \
> decaf::internal::util::concurrent::Threading::shutdown(). In our scenario we create \
> continuously new worker threads that communicate with ActiveMQ broker. This leads \
> to the situation that new OS thread handles are still being created and never \
> freed. The consumed RAM is rapidly growing since the size of the thread object is \
> on our platform (Win 64bit) 1632 Bytes. We would need to have possibility to \
> explicitly free this OS thread object before it terminates, for instance something \
> like: void decaf::internal::util::concurrent::Threading::detachFromCurrentThread()
> Is there a reasonable workaround or another way how to free this OS thread?



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic