Fix PSK viewer crash

The psk ctor was calling psk::restart() which in turn called the global
pskviewer's restart(), possibly deallocating memory in use by another psk
instance.  This would happen when changing PSK modes with the Viewer window
visible, as a new modem is constructed before the old one is destroyed.

Add a psk class viewpsk member and make the global pskviewer point to it.
pull/2/head
Stelios Bounanos 2008-12-18 09:14:17 +00:00
rodzic 708ac48c3f
commit 433a3c5629
4 zmienionych plików z 21 dodań i 9 usunięć

Wyświetl plik

@ -31,6 +31,8 @@
#include "filters.h" #include "filters.h"
#include "pskcoeff.h" #include "pskcoeff.h"
#include "pskvaricode.h" #include "pskvaricode.h"
#include "viewpsk.h"
#include "pskeval.h"
//===================================================================== //=====================================================================
#define PskSampleRate (8000) #define PskSampleRate (8000)
@ -87,6 +89,9 @@ private:
complex quality; complex quality;
int acquire; int acquire;
viewpsk* pskviewer;
pskeval* evalpsk;
void rx_symbol(complex symbol); void rx_symbol(complex symbol);
void rx_bit(int bit); void rx_bit(int bit);
void rx_qpsk(int bits); void rx_qpsk(int bits);

Wyświetl plik

@ -29,6 +29,7 @@
#include "trx.h" #include "trx.h"
#include "filters.h" #include "filters.h"
#include "fldigi-config.h" #include "fldigi-config.h"
#include "pskeval.h"
//===================================================================== //=====================================================================
#define VPSKSAMPLERATE (8000) #define VPSKSAMPLERATE (8000)
@ -69,6 +70,8 @@ private:
time_t now; time_t now;
time_t timeout[MAXCHANNELS]; time_t timeout[MAXCHANNELS];
pskeval* evalpsk;
void rx_symbol(int ch, complex symbol); void rx_symbol(int ch, complex symbol);
void rx_bit(int ch, int bit); void rx_bit(int ch, int bit);
@ -76,7 +79,7 @@ private:
void afc(int); void afc(int);
public: public:
viewpsk(trx_mode mode); viewpsk(pskeval* eval, trx_mode mode);
~viewpsk(); ~viewpsk();
void init(); void init();
void restart(trx_mode mode); void restart(trx_mode mode);

Wyświetl plik

@ -60,7 +60,6 @@ extern waterfall *wf;
char pskmsg[80]; char pskmsg[80];
viewpsk *pskviewer = (viewpsk *)0; viewpsk *pskviewer = (viewpsk *)0;
pskeval *evalpsk = (pskeval *)0;
void psk::tx_init(SoundBase *sc) void psk::tx_init(SoundBase *sc)
{ {
@ -92,9 +91,7 @@ void psk::rx_init()
void psk::restart() void psk::restart()
{ {
if (!pskviewer) pskviewer = new viewpsk(mode); pskviewer->restart(mode);
else pskviewer->restart(mode);
if (!evalpsk) evalpsk = new pskeval;
evalpsk->setbw(bandwidth); evalpsk->setbw(bandwidth);
} }
@ -118,6 +115,10 @@ psk::~psk()
if (fir2) delete fir2; if (fir2) delete fir2;
if (snfilt) delete snfilt; if (snfilt) delete snfilt;
if (imdfilt) delete imdfilt; if (imdfilt) delete imdfilt;
if (::pskviewer == pskviewer)
::pskviewer = 0;
delete pskviewer;
delete evalpsk;
} }
psk::psk(trx_mode pskmode) : modem() psk::psk(trx_mode pskmode) : modem()
@ -235,7 +236,10 @@ psk::psk(trx_mode pskmode) : modem()
syncbuf[i] = 0.0; syncbuf[i] = 0.0;
E1 = E2 = E3 = 0.0; E1 = E2 = E3 = 0.0;
acquire = 0; acquire = 0;
evalpsk = new pskeval;
::pskviewer = pskviewer = new viewpsk(evalpsk, mode);
init(); init();
} }

Wyświetl plik

@ -43,20 +43,20 @@
#include "qrunner.h" #include "qrunner.h"
extern waterfall *wf; extern waterfall *wf;
extern pskeval *evalpsk;
//===================================================================== //=====================================================================
// Change the following for DCD low pass filter adjustment // Change the following for DCD low pass filter adjustment
#define SQLCOEFF 0.01 #define SQLCOEFF 0.01
//===================================================================== //=====================================================================
viewpsk::viewpsk(trx_mode pskmode) viewpsk::viewpsk(pskeval* eval, trx_mode pskmode)
{ {
for (int i = 0; i < MAXCHANNELS; i++) { for (int i = 0; i < MAXCHANNELS; i++) {
fir1[i] = (C_FIR_filter *)0; fir1[i] = (C_FIR_filter *)0;
fir2[i] = (C_FIR_filter *)0; fir2[i] = (C_FIR_filter *)0;
} }
evalpsk = eval;
viewmode = MODE_PREV; viewmode = MODE_PREV;
restart(pskmode); restart(pskmode);
} }