Segfault closing second detail window before its done rendering, Issue 2395

This commit is contained in:
Ingo
2014-05-25 15:54:08 +02:00
parent 5ce132c177
commit d4e2a3334d
4 changed files with 14 additions and 3 deletions

View File

@@ -205,6 +205,9 @@ class ImProcCoordinator : public StagedImageProcessor {
void getSpotWB (int x, int y, int rectSize, double& temp, double& green);
void getAutoCrop (double ratio, int &x, int &y, int &w, int &h);
bool updateTryLock () {return updaterThreadStart.trylock();}
void updateUnLock () {updaterThreadStart.unlock();}
void setProgressListener (ProgressListener* pl) { plistener = pl; }
void setPreviewImageListener (PreviewImageListener* il) {imageListener = il; }
void setSizeListener (SizeListener* il) {sizeListeners.push_back (il); }

View File

@@ -330,6 +330,10 @@ namespace rtengine {
* @return the height of the preview image */
virtual int getPreviewHeight () =0;
virtual bool updateTryLock() = 0;
virtual void updateUnLock() = 0;
/** Creates and returns a Crop instance that acts as a window on the image
* @param editDataProvider pointer to the EditDataProvider that communicates with the EditSubscriber
* @return a pointer to the Crop object that handles the image data trough its own pipeline */

View File

@@ -67,7 +67,7 @@ CropWindow::CropWindow (ImageArea* parent, rtengine::StagedImageProcessor* ipc_,
backColor(options.bgcolor), decorated(true), titleHeight(30),
sideBorderWidth(3), lowerBorderWidth(3), upperBorderWidth(1), sepWidth(2),
xpos(30), ypos(30), imgX(0), imgY(0), imgW(1), imgH(1), iarea(parent),
cropZoom(0), cropgl(NULL), pmlistener(NULL), observedCropWin(NULL), isFlawnOver(false) {
cropZoom(0), cropgl(NULL), pmlistener(NULL), observedCropWin(NULL), ipc(ipc_), isFlawnOver(false) {
Glib::RefPtr<Pango::Context> context = parent->get_pango_context () ;
Pango::FontDescription fontd = context->get_font_description ();
@@ -1585,8 +1585,11 @@ void CropWindow::buttonPressed (LWButton* button, int actionCode, void* actionDa
else if (button==bZoom100) // zoom 100
zoom11 ();
else if (button==bClose) {// close
deleted = true;
iarea->cropWindowClosed (this);
if(ipc->updateTryLock()) {
deleted = true;
iarea->cropWindowClosed (this);
ipc->updateUnLock();
}
}
}

View File

@@ -84,6 +84,7 @@ class CropWindow : public LWButtonListener, public CropHandlerListener, public E
std::list<CropWindowListener*> listeners;
CropWindow* observedCropWin;
rtengine::StagedImageProcessor* ipc;
bool onArea (CursorArea a, int x, int y);
void updateCursor (int x, int y);