Hi Corinna and Achim, On Sat, 20 Jan 2024 13:18:25 +0900 Takashi Yano wrote: > 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...
I might find the culprit in gcc's libstdc++ code such as: libstdc++-v3/include/ext/concurrentce.h: class __mutex { private: #if __GTHREADS && defined __GTHREAD_MUTEX_INIT __gthread_mutex_t _M_mutex = __GTHREAD_MUTEX_INIT; #else __gthread_mutex_t _M_mutex; #endif __GTHREAD_MUTEX_INIT here is PTHREAD_MUTEX_INITIALIZER and __gthread_mutex_t is pthread_mutex_t. I think this code vaiolates the POSIX statement. -- 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