вожусь с одним стендовым проектом,
- по ряду причин пришлось добавить класс Мютекс ( и прочего многопоточного);
- возможно в будущем на полную замену в проекте стандартного QMutex,etc из Qtкасаемо UNIX-like - все работает нармально(со всеми штатными ср-вами) на платформах: Debian 5,6,7; Ubuntu 10, 14 (all LTS); CentOS 6.x и др.
на десятой фряхе траблы(см. дальше), кто подскажет в чем может быть проблема и направление копания ???
инфа по фряхе, все штатно через pkg и без возни с портами:
- FreeBSD 10.0-RELEASE r260789 Fri Jan 17 01:46:25 UTC 2014 ... i386
- libpthread-stubs-0.3_6
- cmake-3.4.2
- clang-3.3 (tag/RELEASE/final 183502) 20130610
- qt5-{*}-5.5.1
- gdb-6.1.1
>>>>
main() проекта, больше никаких глобальных переменных не объявлено:
$cat fake-project.cpp
...
/* */
//FMemDebugger memDebugger;
/* */
int main(
int argc,
char *argv[])
{
int ret = 0;
FMemDebugger memDebugger;
...
};
>>>>
Выжимка из объявления класса FMemDebugger
$ cat fake-mem-debugger.h
...
class FMemDebugger
{
...
private:
//QMutex mutex;
FMutex mutex;
};
>>>>
Интерфeйсная часть класса FMutex:
$ cat fake-mutex.cpp
...
FMutex::FMutex(
bool recursive)
{
NEW_OP(df, FMutexPrivate(recursive));
};
FMutex::~FMutex()
{
DELETE_OP(df);
};
...
>>>>
Функционал класса FMutex:
$ cat fake-mutex-unix.cpp
...
FMutexPrivate::FMutexPrivate(
bool recursive)
:
modeRecursive(recursive)
{
wakeup = false;
count = 0;
owner = 0;
report_error(pthread_mutex_init(&handle, NULL), "FMutex", "mutex init");
#if !defined(Q_OS_ANDROID)
report_error(pthread_cond_init(&cond, NULL), "FMutex", "cv init");
#else
priv_initialize_pthread_cond(&cond, "FMutex");
#endif
};
FMutexPrivate::~FMutexPrivate()
{
report_error(pthread_cond_destroy(&cond), "FMutex", "cv destroy");
report_error(pthread_mutex_destroy(&handle), "FMutex", "mutex destroy");
};
...
>>>>
Segmentation fault, выхлоп gdb, memDebugger до main():
...
#0 0x2946519e in pthread_mutex_unlock () from /lib/libthr.so.3
[New Thread 2c003080 (LWP 100388/test-imm-0.1.1)]
(gdb) bt
#0 0x2946519e in pthread_mutex_unlock () from /lib/libthr.so.3
#1 0x294685b0 in _pthread_cond_wait () from /lib/libthr.so.3
#2 0x294689dd in pthread_cond_wait () from /lib/libthr.so.3
#3 0x281d4d1a in FMutexPrivate::wait ()
from /usr/home/user/git/dev/net/qth/src/.build/srcs/libtest-fakelib.so.0
>>
#4 0x281d4b82 in FMutexPrivate::lock ()
from /usr/home/user/git/dev/net/qth/src/.build/srcs/libtest-fakelib.so.0
здесь в лог падает "FMutex::lock: failure: Invalid argument"
$ cat fake-mutex-priv.cpp
...
void FMutexPrivate::lock()
{
...
int code = pthread_mutex_lock(&handle);
if (code != 0) {
LOG_WRN(QString(I18N_NOOP("FMutex::lock: failure: ")) + strerror(code));
bool isLocked = wait();
...
};
...
>>
#5 0x281d41d9 in FMutex::lock ()
from /usr/home/user/git/dev/net/qth/src/.build/srcs/libtest-fakelib.so.0
#6 0x2818bcb9 in FmemDebugger::Remove ()
from /usr/home/user/git/dev/net/qth/src/.build/srcs/libtest-fakelib.so.0
#7 0x2822706a in exp_mem_holder_remove ()
from /usr/home/user/git/dev/net/qth/src/.build/srcs/libtest-fakelib.so.0
#8 0x2818acd6 in exp_rmv_new ()
from /usr/home/user/git/dev/net/qth/src/.build/srcs/libtest-fakelib.so.0
#9 0x281d4141 in FMutex::~FMutex ()
from /usr/home/user/git/dev/net/qth/src/.build/srcs/libtest-fakelib.so.0
#10 0x2818b2e1 in FmemDebugger::~FmemDebugger ()
from /usr/home/user/git/dev/net/qth/src/.build/srcs/libtest-fakelib.so.0
#11 0x2957bca9 in __cxa_finalize () from /lib/libc.so.7
#12 0x280fc525 in __do_global_dtors_aux ()
from /usr/home/user/git/dev/net/qth/src/.build/srcs/libtest-fakelib.so.0
#13 0x2825d528 in _fini () from /usr/home/user/git/dev/net/qth/src/.build/srcs/libtest-fakelib.so.0
#14 0x2bafb5c0 in ?? ()
#15 0x280612b0 in ?? () from /libexec/ld-elf.so.1
#16 0xbfbfd9d8 in ?? ()
#17 0x2804f1d1 in dlclose () from /libexec/ld-elf.so.1
#18 0x2804e4bb in r_debug_state () from /libexec/ld-elf.so.1
#19 0x2957bca9 in __cxa_finalize () from /lib/libc.so.7
#20 0x2952182a in exit () from /lib/libc.so.7
#21 0x08049522 in _start1 ()
...
>>>>
Segmentation fault, выхлоп gdb, memDebugger в main():
...
#0 0x2946519e in pthread_mutex_unlock () from /lib/libthr.so.3
[New Thread 2c003080 (LWP 100388/test-imm-0.1.1)]
(gdb) bt
#0 0x2946519e in pthread_mutex_unlock () from /lib/libthr.so.3
#1 0x294685b0 in _pthread_cond_wait () from /lib/libthr.so.3
#2 0x294689dd in pthread_cond_wait () from /lib/libthr.so.3
#3 0x281d4d1a in FMutexPrivate::wait ()
from /usr/home/user/git/dev/net/qth/src/.build/srcs/libtest-fakelib.so.0
>>
#4 0x281d4b82 in FMutexPrivate::lock ()
from /usr/home/user/git/dev/net/qth/src/.build/srcs/libtest-fakelib.so.0
Таже хрень - в лог падает "FMutex::lock: failure: Invalid argument"
$ cat fake-mutex-priv.cpp
...
void FMutexPrivate::lock()
{
...
int code = pthread_mutex_lock(&handle);
if (code != 0) {
LOG_WRN(QString(I18N_NOOP("FMutex::lock: failure: ")) + strerror(code));
bool isLocked = wait();
...
};
...
>>
#5 0x281d41d9 in FMutex::lock ()
from /usr/home/user/git/dev/net/qth/src/.build/srcs/libtest-fakelib.so.0
#6 0x2818bcb9 in FmemDebugger::Remove ()
from /usr/home/user/git/dev/net/qth/src/.build/srcs/libtest-fakelib.so.0
#7 0x2822706a in exp_mem_holder_remove ()
from /usr/home/user/git/dev/net/qth/src/.build/srcs/libtest-fakelib.so.0
#8 0x2818acd6 in exp_rmv_new ()
from /usr/home/user/git/dev/net/qth/src/.build/srcs/libtest-fakelib.so.0
#9 0x281d4141 in FMutex::~FMutex ()
from /usr/home/user/git/dev/net/qth/src/.build/srcs/libtest-fakelib.so.0
#10 0x2818b2e1 in FmemDebugger::~FmemDebugger ()
from /usr/home/user/git/dev/net/qth/src/.build/srcs/libtest-fakelib.so.0
#11 0x080498bf in main ()
...