[ 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)