|
From: <do_...@wu...> - 2013-10-17 06:19:29
|
Author: ttsou
Date: 2013-10-17 01:19:23 -0500 (Thu, 17 Oct 2013)
New Revision: 6752
Modified:
software/public/openbts/trunk/Transceiver52M/radioInterfaceResamp.cpp
software/public/openbts/trunk/Transceiver52M/runTransceiver.cpp
Log:
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 <to...@ts...>
Modified: software/public/openbts/trunk/Transceiver52M/radioInterfaceResamp.cpp
===================================================================
--- software/public/openbts/trunk/Transceiver52M/radioInterfaceResamp.cpp 2013-10-17 06:19:19 UTC (rev 6751)
+++ software/public/openbts/trunk/Transceiver52M/radioInterfaceResamp.cpp 2013-10-17 06:19:23 UTC (rev 6752)
@@ -75,8 +75,6 @@
void RadioInterfaceResamp::close()
{
- RadioInterface::close();
-
delete innerSendBuffer;
delete outerSendBuffer;
delete innerRecvBuffer;
@@ -89,9 +87,13 @@
outerSendBuffer = NULL;
innerRecvBuffer = NULL;
outerRecvBuffer = NULL;
+ sendBuffer = NULL;
+ recvBuffer = NULL;
upsampler = NULL;
dnsampler = NULL;
+
+ RadioInterface::close();
}
/* Initialize I/O specific objects */
Modified: software/public/openbts/trunk/Transceiver52M/runTransceiver.cpp
===================================================================
--- software/public/openbts/trunk/Transceiver52M/runTransceiver.cpp 2013-10-17 06:19:19 UTC (rev 6751)
+++ software/public/openbts/trunk/Transceiver52M/runTransceiver.cpp 2013-10-17 06:19:23 UTC (rev 6752)
@@ -47,8 +47,6 @@
*/
#define SPS 4
-using namespace std;
-
ConfigurationKeyMap getConfigurationKeys();
ConfigurationTable gConfig(CONFIGDB, 0, getConfigurationKeys());
@@ -56,8 +54,8 @@
static void ctrlCHandler(int signo)
{
- cout << "Received shutdown signal" << endl;;
- gbShutdown = true;
+ std::cout << "Received shutdown signal" << std::endl;
+ gbShutdown = true;
}
/*
@@ -111,28 +109,25 @@
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.
@@ -148,14 +143,13 @@
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);
@@ -166,27 +160,38 @@
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;
}
ConfigurationKeyMap getConfigurationKeys()
|