[
https://issues.apache.org/jira/browse/AMQCPP-564?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
Timothy Bish updated AMQCPP-564:
--------------------------------
Fix Version/s: 3.9.0
> 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
> Fix For: 3.9.0
>
> 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)