diff options
-rw-r--r-- | vcl/inc/vcl/printerinfomanager.hxx | 2 | ||||
-rw-r--r-- | vcl/inc/vcl/saldatabasic.hxx | 10 | ||||
-rw-r--r-- | vcl/unx/source/plugadapt/salplug.cxx | 5 | ||||
-rw-r--r-- | vcl/unx/source/printer/printerinfomanager.cxx | 36 |
4 files changed, 39 insertions, 14 deletions
diff --git a/vcl/inc/vcl/printerinfomanager.hxx b/vcl/inc/vcl/printerinfomanager.hxx index f2e0aad538c8..f03234db3268 100644 --- a/vcl/inc/vcl/printerinfomanager.hxx +++ b/vcl/inc/vcl/printerinfomanager.hxx @@ -157,6 +157,8 @@ public: // there can only be one static PrinterInfoManager& get(); + // only called by SalData destructor, frees the global instance + static void release(); // get PrinterInfoManager type Type getType() const { return m_eType; } diff --git a/vcl/inc/vcl/saldatabasic.hxx b/vcl/inc/vcl/saldatabasic.hxx index 1df2a701fd1a..a40cd045611c 100644 --- a/vcl/inc/vcl/saldatabasic.hxx +++ b/vcl/inc/vcl/saldatabasic.hxx @@ -32,11 +32,17 @@ #include <vcl/salinst.hxx> #include <osl/module.h> +namespace psp +{ + class PrinterInfoManager; +} + class VCL_DLLPUBLIC SalData { public: - SalInstance* m_pInstance; // pointer to instance - oslModule m_pPlugin; // plugin library handle + SalInstance* m_pInstance; // pointer to instance + oslModule m_pPlugin; // plugin library handle + psp::PrinterInfoManager* m_pPIManager; SalData(); virtual ~SalData(); diff --git a/vcl/unx/source/plugadapt/salplug.cxx b/vcl/unx/source/plugadapt/salplug.cxx index a438760cffba..fd49ee34f543 100644 --- a/vcl/unx/source/plugadapt/salplug.cxx +++ b/vcl/unx/source/plugadapt/salplug.cxx @@ -36,6 +36,7 @@ #include "vcl/salinst.hxx" #include "saldata.hxx" +#include "vcl/printerinfomanager.hxx" #include <cstdio> #include <unistd.h> @@ -291,10 +292,12 @@ const OUString& SalGetDesktopEnvironment() SalData::SalData() : m_pInstance(NULL), - m_pPlugin(NULL) + m_pPlugin(NULL), + m_pPIManager(NULL) { } SalData::~SalData() { + psp::PrinterInfoManager::release(); } diff --git a/vcl/unx/source/printer/printerinfomanager.cxx b/vcl/unx/source/printer/printerinfomanager.cxx index e1d499c40ca5..c534461ea95c 100644 --- a/vcl/unx/source/printer/printerinfomanager.cxx +++ b/vcl/unx/source/printer/printerinfomanager.cxx @@ -35,6 +35,7 @@ #include "cupsmgr.hxx" #include "vcl/fontmanager.hxx" #include "vcl/strhelper.hxx" +#include "saldata.hxx" #include "tools/urlobj.hxx" #include "tools/stream.hxx" @@ -92,22 +93,28 @@ namespace psp PrinterInfoManager& PrinterInfoManager::get() { - static PrinterInfoManager* pManager = NULL; + SalData* pSalData = GetSalData(); - if( ! pManager ) + if( ! pSalData->m_pPIManager ) { - pManager = CUPSManager::tryLoadCUPS(); - if( ! pManager ) - pManager = new PrinterInfoManager(); + pSalData->m_pPIManager = CUPSManager::tryLoadCUPS(); + if( ! pSalData->m_pPIManager ) + pSalData->m_pPIManager = new PrinterInfoManager(); - if( pManager ) - pManager->initialize(); + pSalData->m_pPIManager->initialize(); #if OSL_DEBUG_LEVEL > 1 - fprintf( stderr, "PrinterInfoManager::get create Manager of type %d\n", pManager->getType() ); + fprintf( stderr, "PrinterInfoManager::get create Manager of type %d\n", pSalData->m_pPIManager->getType() ); #endif } - return *pManager; + return *pSalData->m_pPIManager; +} + +void PrinterInfoManager::release() +{ + SalData* pSalData = GetSalData(); + delete pSalData->m_pPIManager; + pSalData->m_pPIManager = NULL; } // ----------------------------------------------------------------- @@ -130,6 +137,9 @@ PrinterInfoManager::PrinterInfoManager( Type eType ) : PrinterInfoManager::~PrinterInfoManager() { delete m_pQueueInfo; + #if OSL_DEBUG_LEVEL > 1 + fprintf( stderr, "PrinterInfoManager: destroyed Manager of type %d\n", getType() ); + #endif } // ----------------------------------------------------------------- @@ -324,7 +334,7 @@ void PrinterInfoManager::initialize() } } #if OSL_DEBUG_LEVEL > 1 - fprintf( stderr, "global settings: fontsubst = %s, %d substitutes\n", m_aGlobalDefaults.m_bPerformFontSubstitution ? "true" : "false", m_aGlobalDefaults.m_aFontSubstitutes.size() ); + fprintf( stderr, "global settings: fontsubst = %s, %d substitutes\n", m_aGlobalDefaults.m_bPerformFontSubstitution ? "true" : "false", (int)m_aGlobalDefaults.m_aFontSubstitutes.size() ); #endif } } @@ -1166,7 +1176,11 @@ SystemQueueInfo::SystemQueueInfo() : SystemQueueInfo::~SystemQueueInfo() { - terminate(); + static const char* pNoSyncDetection = getenv( "SAL_DISABLE_SYNCHRONOUS_PRINTER_DETECTION" ); + if( ! pNoSyncDetection || !*pNoSyncDetection ) + join(); + else + terminate(); } bool SystemQueueInfo::hasChanged() const |