Hi Louis,
Thanks for the report. Yes, you are right, cmsCreateTransform is not thread safe if the involved profiles are file-based. That is because files are not locked when readed. Currently, only cmsDoTransform() is thread safe, and strictly you have to turn on USE_PTHREADS toggle on lcms.h That is so because multithreading only make real sense when applying rerendering. But your point is well taken, and locking the file would be an interesting addition for next release, unfortunately not for 1.17 since I am already out of schedule. Thanks again. Marti ----- Original Message ----- From: "Louis Solomon [SteelBytes]" <[EMAIL PROTECTED]> To: "lcms-user" <lcms-user@lists.sourceforge.net> Sent: Tuesday, June 05, 2007 8:13 AM Subject: [Lcms-user] cmsCreateTransform is not thread safe Hi, cmsCreateTransform is not thread safe using 1.16 or 1.17b. Note, using cmsCreate_sRGBProfile() instead of cmsOpenProfileFromFile("AdobeRGB1998.icc","rb") does work, and so does calling the two cmsCreateTransform()'s in succession. Test env: 32bit debug target built with VS2005 on Vista64. Louis Solomon www.SteelBytes.com #include <windows.h> #include "lcms\lcms.h" static cmsHPROFILE prof_xyz,prof_rgb; static cmsHTRANSFORM trans_xyz_to_rgb,trans_rgb_to_xyz; static DWORD WINAPI make_trans_xyz_to_rgb(LPVOID lpParameter) { trans_xyz_to_rgb = cmsCreateTransform( prof_xyz,TYPE_XYZ_DBL, prof_rgb,TYPE_RGB_DBL, INTENT_ABSOLUTE_COLORIMETRIC,cmsFLAGS_NOTPRECALC); return 0; } static DWORD WINAPI make_trans_rgb_to_xyz(LPVOID lpParameter) { trans_rgb_to_xyz = cmsCreateTransform( prof_rgb,TYPE_RGB_DBL, prof_xyz,TYPE_XYZ_DBL, INTENT_ABSOLUTE_COLORIMETRIC,cmsFLAGS_NOTPRECALC); return 0; } int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow) { prof_xyz = cmsCreateXYZProfile(); prof_rgb = cmsOpenProfileFromFile("AdobeRGB1998.icc","rb"); //cmsCreate_sRGBProfile(); for (int i=0;i<10;++i) { #define try_threads #ifdef try_threads DWORD threadid; HANDLE workers[2]; workers[0] = CreateThread(NULL,0,make_trans_xyz_to_rgb,NULL,0,&threadid); workers[1] = CreateThread(NULL,0,make_trans_rgb_to_xyz,NULL,0,&threadid); WaitForMultipleObjects(2,workers,TRUE,INFINITE); for (unsigned i=0;i<2;++i) CloseHandle(workers[i]); #else make_trans_xyz_to_rgb(0); make_trans_rgb_to_xyz(0); #endif cmsDeleteTransform(trans_xyz_to_rgb); cmsDeleteTransform(trans_rgb_to_xyz); } cmsCloseProfile(prof_rgb); cmsCloseProfile(prof_xyz); } ------------------------------------------------------------------------- This SF.net email is sponsored by DB2 Express Download DB2 Express C - the FREE version of DB2 express and take control of your XML. No limits. Just data. Click to get it now. http://sourceforge.net/powerbar/db2/ _______________________________________________ Lcms-user mailing list Lcms-user@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/lcms-user ------------------------------------------------------------------------- This SF.net email is sponsored by DB2 Express Download DB2 Express C - the FREE version of DB2 express and take control of your XML. No limits. Just data. Click to get it now. http://sourceforge.net/powerbar/db2/ _______________________________________________ Lcms-user mailing list Lcms-user@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/lcms-user