Bastien ROUCARIES a écrit :
On Sun, Mar 8, 2009 at 3:32 PM, Guillaume Gimenez <[email protected]> wrote:
Package: libmagickcore1
Version: 7:6.4.5.4.dfsg1-1
Severity: normal
ImageMagick hangs on gomp_team_end()
at futex_wait
source:
/build/buildd/gcc-4.3-4.3.3/build/x86_64-linux-gnu/libgomp/../../../src/libgomp/config/linux/x86/futex.h:44
at gomp_team_end
source:
/build/buildd/gcc-4.3-4.3.3/build/x86_64-linux-gnu/libgomp/../../../src/libgomp/team.c:332
at AcquireImageColormap
binary: /usr/lib/libMagickCore.so.1
at RegisterXPMImage
binary: /usr/lib/ImageMagick-6.4.5/modules-Q16/coders/xpm.so
at ReadImage
binary: /usr/lib/libMagickCore.so.1
at Magick::Image::read(std::string const&)
binary: /usr/lib/libMagick++.so.1
Could you send us a test case please ?
Regards
Bastien
Something like that ?
Best regards
/*
$ g++ -I/usr/include/ImageMagick testcase.C -o testcase -lMagick++
$ ldd testcase
linux-vdso.so.1 => (0x00007fffb39ff000)
libMagick++.so.1 => /usr/lib/libMagick++.so.1 (0x00007f1dab392000)
libstdc++.so.6 => /usr/lib/libstdc++.so.6 (0x00007f1dab086000)
libm.so.6 => /lib/libm.so.6 (0x00007f1daae03000)
libgcc_s.so.1 => /lib/libgcc_s.so.1 (0x00007f1daabec000)
libc.so.6 => /lib/libc.so.6 (0x00007f1daa899000)
libpthread.so.0 => /lib/libpthread.so.0 (0x00007f1daa67d000)
libMagickWand.so.1 => /usr/lib/libMagickWand.so.1 (0x00007f1daa377000)
libMagickCore.so.1 => /usr/lib/libMagickCore.so.1 (0x00007f1da9f4d000)
liblcms.so.1 => /usr/lib/liblcms.so.1 (0x00007f1da9d15000)
libtiff.so.4 => /usr/lib/libtiff.so.4 (0x00007f1da9ab9000)
libjpeg.so.62 => /usr/lib/libjpeg.so.62 (0x00007f1da9897000)
libfontconfig.so.1 => /usr/lib/libfontconfig.so.1 (0x00007f1da9666000)
libXext.so.6 => /usr/lib/libXext.so.6 (0x00007f1da9455000)
libXt.so.6 => /usr/lib/libXt.so.6 (0x00007f1da91f4000)
libbz2.so.1.0 => /lib/libbz2.so.1.0 (0x00007f1da8fe4000)
libfreetype.so.6 => /usr/lib/libfreetype.so.6 (0x00007f1da8d60000)
libz.so.1 => /usr/lib/libz.so.1 (0x00007f1da8b49000)
libdl.so.2 => /lib/libdl.so.2 (0x00007f1da8945000)
libSM.so.6 => /usr/lib/libSM.so.6 (0x00007f1da873d000)
libICE.so.6 => /usr/lib/libICE.so.6 (0x00007f1da8522000)
libX11.so.6 => /usr/lib/libX11.so.6 (0x00007f1da8216000)
libgomp.so.1 => /usr/lib/libgomp.so.1 (0x00007f1da800e000)
/lib64/ld-linux-x86-64.so.2 (0x00007f1dab60c000)
libexpat.so.1 => /usr/lib/libexpat.so.1 (0x00007f1da7de5000)
libXau.so.6 => /usr/lib/libXau.so.6 (0x00007f1da7be3000)
libxcb-xlib.so.0 => /usr/lib/libxcb-xlib.so.0 (0x00007f1da79e2000)
libxcb.so.1 => /usr/lib/libxcb.so.1 (0x00007f1da77c6000)
librt.so.1 => /lib/librt.so.1 (0x00007f1da75bd000)
libXdmcp.so.6 => /usr/lib/libXdmcp.so.6 (0x00007f1da73b8000)
ii libmagick++-dev 7:6.4.5.4.dfsg1-1 object-oriented C++ interface to ImageMagick - developm
ii libmagick++1 7:6.4.5.4.dfsg1-1 object-oriented C++ interface to ImageMagick
ii libmagick++10 7:6.3.7.9.dfsg1-3 C++ API to the ImageMagick library
ii libmagick10 7:6.3.7.9.dfsg1-3 image manipulation library
ii libmagickcore-dev 7:6.4.5.4.dfsg1-1 low-level image manipulation library - development file
ii libmagickcore1 7:6.4.5.4.dfsg1-1 low-level image manipulation library
ii libmagickwand-dev 7:6.4.5.4.dfsg1-1 image manipulation library - development files
ii libmagickwand1 7:6.4.5.4.dfsg1-1 image manipulation library
*/
#include <string>
#include <iostream>
#include <Magick++.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <cstring>
#include <unistd.h>
#include <cstdio>
using namespace std;
using namespace Magick;
class Thread {
pthread_t thread;
bool running;
friend void startThread(Thread *thread);
void runService();
Thread(const Thread& thread); //forbidden
Thread& operator=(const Thread& thread); //forbidden
protected:
volatile bool notCanceled;
virtual void run()=0;
public:
Thread();
bool isRunning();
bool start();
void cancel();
void join();
virtual ~Thread();
};
extern "C" {
void * startThread_C(void *arg) {
Thread *thread = reinterpret_cast<Thread*>(arg);
startThread(thread);
return NULL;
}
}
void startThread(Thread* thread) {
thread->runService();
return;
}
void Thread::runService() {
pthread_setcancelstate(PTHREAD_CANCEL_DISABLE,NULL);
notCanceled=true;
running=true;
this->run();
running=false;
return;
}
Thread::Thread() : thread(0), running(false), notCanceled(true) {}
bool Thread::isRunning() { return running; }
bool Thread::start() {
return pthread_create(&thread,NULL,startThread_C,reinterpret_cast<void*>(this));
}
void Thread::cancel() {
notCanceled=false;
}
void Thread::join() {
pthread_join(thread,NULL);
}
Thread::~Thread() {
cancel();
if ( running )
join();
}
class Worker : public Thread {
int max;
string id;
string file;
string out;
public:
Worker (int m, const string& i, const string& f, const string& o) : max(m), id(i), file(f), out(o) {
}
void run() {
while ( max-- && notCanceled ) {
cout << id << endl ;
Image image;
try {
image.read( file );
}
catch (...) {
break;
}
const double kernel[]={0,-1,0,-1,8,-1,0,-1,0};
image.convolve(3,kernel);
try {
image.write( out );
}
catch (...) {
break;
}
}
cout << "stop:" << id << endl;
}
};
int main( int argc, char **argv) {
Worker w1(5,"1","/usr/share/pixmaps/splash/gnome-splash.png","/tmp/plop1.jpg"),
w2(5,"2","/usr/share/pixmaps/splash/gnome-debian-splash.png","/tmp/plop2.jpg");
w1.start();
w2.start();
w1.join();
w2.join();
}