Hi Corinna, On Fri, 19 Jan 2024 15:28:40 +0100 Corinna Vinschen wrote: > On Jan 19 22:44, Takashi Yano via Cygwin wrote: > > Hi, > > > > I might find the bug of cygwin1.dll (including 3.4.x, 3.5.0 (TEST)). > > The following test case (c++ code) causes handle leak. > > > > This issue is reproducible with both g++ and clang++. > > However, it does not happen in Linux environment. > > So I guess this is the cygwin1.dlll bug. > > > > I looked into this problem a bit, and found number of event handle > > increases every loop. > > > > I doubt pthread_mutex_xxx functions. > > > > #include <future> > > int func() { return 0; } > > int main() > > { > > for (;;) { > > std::future<int> f = std::async(std::launch::async, func); > > f.get(); > > } > > return 0; > > } > > Can you create a plain C testcase from there? It's much easier to > debug.
I could symplify the test case: #include <mutex> int main() { for (;;) { std::mutex *m = new std::mutex; m->lock(); m->unlock(); delete m; } return 0; } And I tried to observe the pthread_mutex_xxx() call. Then found the test case does like: #include <pthread.h> int main() { for (;;) { pthread_mutex_t m = PTHREAD_MUTEX_INITIALIZER; pthread_mutex_lock(&m); pthread_mutex_unlock(&m); } return 0; } POSIX states pthread_mutex_t can be initialized with PTREAD_MUTEX_INITIALZER when it is STATICALLY allocated. In this case, m is not static. So it seems that this is a bug of libstdc++. However, the plain c code above works in Linux without problems even with non-static mutex m. I guess it is very difficult to make the plain c code above work in cygwin, because cygwin can not know when cygwin can discard the mutex resources... -- Takashi Yano <takashi.y...@nifty.ne.jp> -- Problem reports: https://cygwin.com/problems.html FAQ: https://cygwin.com/faq/ Documentation: https://cygwin.com/docs.html Unsubscribe info: https://cygwin.com/ml/#unsubscribe-simple