aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorThomas Tsou <tom@tsou.cc>2013-10-15 16:18:58 -0400
committerThomas Tsou <tom@tsou.cc>2013-10-18 13:10:18 -0400
commitde1648ca6b21118eb947cd33e643e93a4c56542e (patch)
treea89da0f05ee861e493305c4e8b3d840d89441640
parent3952d80d057eb3c8c63c4661489581405cf0c87c (diff)
Transceiver52M: Deallocate high level resources on shutdown
This primarily addresses the error case at initialization. In the event that the transceiver fails to start, we should be able cleanly shutdown and release while providing a useful reason for exiting. After the radio is started and threads launched, there are no thread state variables or shutdown messaging between threads, and the transceiver cannot be consistently shutdown. This issue remains to be solved. Signed-off-by: Thomas Tsou <tom@tsou.cc>
-rw-r--r--Transceiver52M/radioInterfaceResamp.cpp6
-rw-r--r--Transceiver52M/runTransceiver.cpp55
2 files changed, 34 insertions, 27 deletions
diff --git a/Transceiver52M/radioInterfaceResamp.cpp b/Transceiver52M/radioInterfaceResamp.cpp
index c3b4396..6c3839a 100644
--- a/Transceiver52M/radioInterfaceResamp.cpp
+++ b/Transceiver52M/radioInterfaceResamp.cpp
@@ -75,8 +75,6 @@ RadioInterfaceResamp::~RadioInterfaceResamp()
void RadioInterfaceResamp::close()
{
- RadioInterface::close();
-
delete innerSendBuffer;
delete outerSendBuffer;
delete innerRecvBuffer;
@@ -89,9 +87,13 @@ void RadioInterfaceResamp::close()
outerSendBuffer = NULL;
innerRecvBuffer = NULL;
outerRecvBuffer = NULL;
+ sendBuffer = NULL;
+ recvBuffer = NULL;
upsampler = NULL;
dnsampler = NULL;
+
+ RadioInterface::close();
}
/* Initialize I/O specific objects */
diff --git a/Transceiver52M/runTransceiver.cpp b/Transceiver52M/runTransceiver.cpp
index 9a20ee6..775424a 100644
--- a/Transceiver52M/runTransceiver.cpp
+++ b/Transceiver52M/runTransceiver.cpp
@@ -47,16 +47,14 @@
*/
#define SPS 4
-using namespace std;
-
ConfigurationTable gConfig(CONFIGDB);
volatile bool gbShutdown = false;
static void ctrlCHandler(int signo)
{
- cout << "Received shutdown signal" << endl;;
- gbShutdown = true;
+ std::cout << "Received shutdown signal" << std::endl;
+ gbShutdown = true;
}
/*
@@ -110,28 +108,25 @@ int testConfig(const char *filename)
int main(int argc, char *argv[])
{
- int trxPort;
+ int trxPort, fail = 0;
std::string deviceArgs, logLevel, trxAddr;
+ RadioDevice *usrp = NULL;
+ RadioInterface *radio = NULL;
+ Transceiver *trx = NULL;
if (argc == 3)
- {
deviceArgs = std::string(argv[2]);
- }
else
- {
deviceArgs = "";
- }
- if ( signal( SIGINT, ctrlCHandler ) == SIG_ERR )
- {
- cerr << "Couldn't install signal handler for SIGINT" << endl;
- exit(1);
+ if (signal(SIGINT, ctrlCHandler) == SIG_ERR) {
+ std::cerr << "Couldn't install signal handler for SIGINT" << std::endl;
+ return EXIT_FAILURE;
}
- if ( signal( SIGTERM, ctrlCHandler ) == SIG_ERR )
- {
- cerr << "Couldn't install signal handler for SIGTERM" << endl;
- exit(1);
+ if (signal(SIGTERM, ctrlCHandler) == SIG_ERR) {
+ std::cerr << "Couldn't install signal handler for SIGTERM" << std::endl;
+ return EXIT_FAILURE;
}
// Configure logger.
@@ -147,14 +142,13 @@ int main(int argc, char *argv[])
srandom(time(NULL));
- RadioDevice *usrp = RadioDevice::make(SPS);
+ usrp = RadioDevice::make(SPS);
int radioType = usrp->open(deviceArgs);
if (radioType < 0) {
LOG(ALERT) << "Transceiver exiting..." << std::endl;
return EXIT_FAILURE;
}
- RadioInterface* radio;
switch (radioType) {
case RadioDevice::NORMAL:
radio = new RadioInterface(usrp, 3, SPS, false);
@@ -165,25 +159,36 @@ int main(int argc, char *argv[])
break;
default:
LOG(ALERT) << "Unsupported configuration";
- return EXIT_FAILURE;
+ fail = 1;
+ goto shutdown;
}
if (!radio->init(radioType)) {
LOG(ALERT) << "Failed to initialize radio interface";
+ fail = 1;
+ goto shutdown;
}
- Transceiver *trx = new Transceiver(trxPort, trxAddr.c_str(),
- SPS, GSM::Time(3,0), radio);
+ trx = new Transceiver(trxPort, trxAddr.c_str(), SPS, GSM::Time(3,0), radio);
if (!trx->init()) {
LOG(ALERT) << "Failed to initialize transceiver";
+ fail = 1;
+ goto shutdown;
}
trx->receiveFIFO(radio->receiveFIFO());
trx->start();
- while (!gbShutdown) {
+ while (!gbShutdown)
sleep(1);
- }
- cout << "Shutting down transceiver..." << endl;
+shutdown:
+ std::cout << "Shutting down transceiver..." << std::endl;
delete trx;
+ delete radio;
+ delete usrp;
+
+ if (fail)
+ return EXIT_FAILURE;
+
+ return 0;
}