Package: libc6 Version: 2.19-9 Severity: important Tags: jessie Source: glibc
After manual rebuilding libmzq3 package tests/test_conflate doesnt pass with error "Device or resource busy (mutex.hpp:94)" on jessie amd64 installation. Manual building from sources from http://zeromq.org/ gave the same result. Succesfull test running has been achieved only through using libpthread-2.19.so manually built http://ftp.gnu.org/gnu/glibc/glibc-2.19.tar.xz going with LD_LIBRARY_PATH setting to temporary path. Same positive result was achieved with libpthread-2.13.so from ftp://ftp.ru.debian.org/debian/pool/main/e/eglibc/libc6_2.13-38+deb7u2_amd64.deb. At the same time test_conflate failed with libpthread-2.19.so built by dpkg-buildpackage retrieved by "apt-get source" from debian.org repository. Here's example where i've used for better visual custom test_conflate.cpp and mutex.hpp: kif@nto-202:~/wrk/zmq/root/lib/x86_64-linux-gnu$ ln -s libpthread-2.19.so libpthread.so.0kif@nto-202:~/wrk/zmq/root/lib/x86_64-linux-gnu$ ls -l total 4492 -rwxr-xr-x 1 kif kif 131107 May 27 01:24 libpthread-2.13.so ---- from libc6_2.13-38+deb7u2_amd64.deb -rwxr-xr-x 1 kif kif 137439 Aug 25 11:43 libpthread-2.19p.so ---- from package built by dpkg-buildpackage from repository sources -rwxr-xr-x 1 kif kif 137439 Aug 22 17:41 libpthread-2.19.so ---- from /lib/x86_64-linux-gnu from libc6 -rwxr-xr-x 1 kif kif 792677 Aug 25 09:07 libpthread-2.19s.so ---- manually built from sources from gnu.org lrwxrwxrwx 1 kif kif 18 Aug 25 13:06 libpthread.so.0 -> libpthread-2.19.so lrwxrwxrwx 1 kif kif 15 Aug 25 11:56 libzmq.so -> libzmq.so.3.1.0 lrwxrwxrwx 1 kif kif 15 Aug 25 11:56 libzmq.so.3 -> libzmq.so.3.1.0 -rwxr-xr-x 1 kif kif 3390068 Aug 25 11:56 libzmq.so.3.1.0 ---- built with custom mutex.hpp for better visual kif@nto-202:~/wrk/zmq/zeromq-4.0.4/tests/.libs$ export LD_LIBRARY_PATH=/home/kif/wrk/zmq/root/lib/x86_64-linux-gnu/ ; ldd test_conflate ; unset LD_LIBRARY_PATH linux-vdso.so.1 (0x00007fff09dfe000) libzmq.so.3 => /home/kif/wrk/zmq/root/lib/x86_64-linux-gnu/libzmq.so.3 (0x00007f96be047000) librt.so.1 => /lib/x86_64-linux-gnu/librt.so.1 (0x00007f96bde2b000) libpthread.so.0 => /home/kif/wrk/zmq/root/lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f96bdc0d000) libstdc++.so.6 => /usr/lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007f96bd902000) libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f96bd601000) libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007f96bd3ea000) libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f96bd041000) /lib64/ld-linux-x86-64.so.2 (0x00007f96be29a000) kif@nto-202:~/wrk/zmq/zeromq-4.0.4/tests/.libs$ export LD_LIBRARY_PATH=/home/kif/wrk/zmq/root/lib/x86_64-linux-gnu/ ; ./test_conflate ; unset LD_LIBRARY_PATH sent sent sent sent sent sent sent sent sent sent sent sent sent sent sent sent sent sent sent sent recieved closed inbound closed outbound ------- pthread_mutex_destroy (&mutex) returned 16, errno: 156384765 Device or resource busy (mutex.hpp:94) -------Aborted kif@nto-202:~/wrk/zmq/zeromq-4.0.4/tests/.libs$ Changing sy kif@nto-202:~/wrk/zmq/root/lib/x86_64-linux-gnu$ ls -l total 4492 -rwxr-xr-x 1 kif kif 131107 May 27 01:24 libpthread-2.13.so -rwxr-xr-x 1 kif kif 137439 Aug 25 11:43 libpthread-2.19p.so -rwxr-xr-x 1 kif kif 137439 Aug 22 17:41 libpthread-2.19.so -rwxr-xr-x 1 kif kif 792677 Aug 25 09:07 libpthread-2.19s.so lrwxrwxrwx 1 kif kif 18 Aug 25 13:06 libpthread.so.0 -> libpthread-2.19.so lrwxrwxrwx 1 kif kif 15 Aug 25 11:56 libzmq.so -> libzmq.so.3.1.0 lrwxrwxrwx 1 kif kif 15 Aug 25 11:56 libzmq.so.3 -> libzmq.so.3.1.0 -rwxr-xr-x 1 kif kif 3390068 Aug 25 11:56 libzmq.so.3.1.0 kif@nto-202:~/wrk/zmq/root/lib/x86_64-linux-gnu$ rm libpthread.so.0 kif@nto-202:~/wrk/zmq/root/lib/x86_64-linux-gnu$ ln -s libpthread-2.19s.so libpthread.so.0 kif@nto-202:~/wrk/zmq/zeromq-4.0.4/tests/.libs$ export LD_LIBRARY_PATH=/home/kif/wrk/zmq/root/lib/x86_64-linux-gnu/ ; ldd test_conflate ; unset LD_LIBRARY_PATH linux-vdso.so.1 (0x00007fff409fe000) libzmq.so.3 => /home/kif/wrk/zmq/root/lib/x86_64-linux-gnu/libzmq.so.3 (0x00007f1acc521000) librt.so.1 => /lib/x86_64-linux-gnu/librt.so.1 (0x00007f1acc305000) libpthread.so.0 => /home/kif/wrk/zmq/root/lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f1acc0e6000) libstdc++.so.6 => /usr/lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007f1acbddb000) libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f1acbada000) libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007f1acb8c3000) libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f1acb51a000) /lib64/ld-linux-x86-64.so.2 (0x00007f1acc774000) kif@nto-202:~/wrk/zmq/zeromq-4.0.4/tests/.libs$ kif@nto-202:~/wrk/zmq/zeromq-4.0.4/tests/.libs$ export LD_LIBRARY_PATH=/home/kif/wrk/zmq/root/lib/x86_64-linux-gnu/ ; ./test_conflate ; unset LD_LIBRARY_PATH sent sent sent sent sent sent sent sent sent sent sent sent sent sent sent sent sent sent sent sent recieved closed inbound closed outbound class destroyed kif@nto-202:~/wrk/zmq/zeromq-4.0.4/tests/.libs$ And so on: with symlink set on libpthread-2.13.so it works too, but with libpthread-2.19p.so package built from debian repository doesn't. mutex.hpp and test_comflate applied. -- ildar. OAO NPP "Polygon" http://www.plgn.ru
/* Copyright (c) 2007-2013 Contributors as noted in the AUTHORS file This file is part of 0MQ. 0MQ is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version. 0MQ is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this program. If not, see <http://www.gnu.org/licenses/>. */ #ifndef __ZMQ_MUTEX_HPP_INCLUDED__ #define __ZMQ_MUTEX_HPP_INCLUDED__ #include "platform.hpp" #include "err.hpp" // Mutex class encapsulates OS mutex in a platform-independent way. #ifdef ZMQ_HAVE_WINDOWS #include "windows.hpp" namespace zmq { class mutex_t { public: inline mutex_t () { InitializeCriticalSection (&cs); } inline ~mutex_t () { DeleteCriticalSection (&cs); } inline void lock () { EnterCriticalSection (&cs); } inline bool try_lock () { return (TryEnterCriticalSection (&cs)) ? true : false; } inline void unlock () { LeaveCriticalSection (&cs); } private: CRITICAL_SECTION cs; // Disable copy construction and assignment. mutex_t (const mutex_t&); void operator = (const mutex_t&); }; } #else #include <pthread.h> namespace zmq { class mutex_t { public: inline mutex_t () { int rc = pthread_mutex_init (&mutex, NULL); posix_assert (rc); } inline ~mutex_t () { int rc = pthread_mutex_destroy (&mutex); if (rc) printf("-------\npthread_mutex_destroy (&mutex) returned %d, errno: %d\n-------", rc, errno); posix_assert (rc); } inline void lock () { int rc = pthread_mutex_lock (&mutex); posix_assert (rc); } inline bool try_lock () { int rc = pthread_mutex_trylock (&mutex); if (rc == EBUSY) return false; posix_assert (rc); return true; } inline void unlock () { int rc = pthread_mutex_unlock (&mutex); posix_assert (rc); } private: pthread_mutex_t mutex; // Disable copy construction and assignment. mutex_t (const mutex_t&); const mutex_t &operator = (const mutex_t&); }; } #endif namespace zmq { struct scoped_lock_t { scoped_lock_t (mutex_t& mutex_) : mutex (mutex_) { mutex.lock (); } ~scoped_lock_t () { mutex.unlock (); } private: mutex_t& mutex; // Disable copy construction and assignment. scoped_lock_t (const scoped_lock_t&); const scoped_lock_t &operator = (const scoped_lock_t&); }; } #endif
/* Copyright (c) 2007-2013 Contributors as noted in the AUTHORS file This file is part of 0MQ. 0MQ is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version. 0MQ is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this program. If not, see <http://www.gnu.org/licenses/>. */ #include "testutil.hpp" int main (int argc, char *argv []) { const char *bind_to = "tcp://127.0.0.1:5555"; int rc; void* ctx = zmq_init (1); assert (ctx); void* s_in = zmq_socket (ctx, ZMQ_PULL); assert (s_in); int conflate = 1; rc = zmq_setsockopt (s_in, ZMQ_CONFLATE, &conflate, sizeof(conflate)); assert (rc == 0); rc = zmq_bind (s_in, bind_to); assert (rc == 0); void* s_out = zmq_socket (ctx, ZMQ_PUSH); assert (s_out); rc = zmq_connect (s_out, bind_to); assert (rc == 0); int message_count = 20; for (int j = 0; j < message_count; ++j) { rc = zmq_send(s_out, (void*)&j, sizeof(int), 0); if (rc < 0) { printf ("error in zmq_sendmsg: %s\n", zmq_strerror (errno)); return -1; } puts("sent"); } msleep (SETTLE_TIME); int payload_recved = 0; rc = zmq_recv (s_in, (void*)&payload_recved, sizeof(int), 0); puts("recieved"); assert (rc > 0); assert (payload_recved == message_count - 1); rc = zmq_close (s_in); assert (rc == 0); puts("closed inbound"); rc = zmq_close (s_out); assert (rc == 0); puts("closed outbound"); rc = zmq_term (ctx); assert (rc == 0); puts("class destroyed"); return 0; }