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();

}

Reply via email to