laforge
/
openbts-osmo
Archived
1
0
Fork 0

Remove Transceiver PID file on OpenBTS exit.

master
Alexander Chemeris 12 years ago committed by Thomas Tsou
parent 7b3c0d3090
commit a0f3b96688
  1. 31
      public-trunk/apps/OpenBTS.cpp

@ -109,8 +109,10 @@ TransceiverManager gTRX(1, gConfig.getStr("TRX.IP"), gConfig.getNum("TRX.Port"))
/// Pointer to the server socket if we run remote CLI.
static ConnectionServerSocket *sgCLIServerSock = NULL;
/// We store Transceiver PID if we started it.
/// We store Transceiver PID if we start it.
static pid_t sgTransceiverPid = 0;
static int sgTransceiverPidFileFd = -1;
static std::string sgTransceiverPidFile;
/** Function to shutdown the process when something wrong happens. */
void shutdownOpenbts()
@ -189,15 +191,15 @@ static int startTransceiver()
if (gConfig.defines("TRX.Path")) {
// Open and lock PID file, taking care of old transceiver instance.
std::string lockfile = gConfig.getStr("TRX.WritePID");
int lfp = openPidFile(lockfile);
if (lfp < 0) return EXIT_SUCCESS;
sgTransceiverPidFile = gConfig.getStr("TRX.WritePID");
sgTransceiverPidFileFd = openPidFile(sgTransceiverPidFile);
if (sgTransceiverPidFileFd < 0) return EXIT_SUCCESS;
int pid;
if (lockPidFile(lockfile, lfp, false) != EXIT_SUCCESS) {
if (lockPidFile(sgTransceiverPidFile, sgTransceiverPidFileFd, false) != EXIT_SUCCESS) {
// Another OpenBTS instance is running and blocking PID file.
return EXIT_FAILURE;
}
if (readPidFile(lockfile, lfp, pid) == EXIT_SUCCESS) {
if (readPidFile(sgTransceiverPidFile, sgTransceiverPidFileFd, pid) == EXIT_SUCCESS) {
// There is no harm in this. Transceiver's owner is not
// running and could safely kill it.
kill(pid, SIGTERM);
@ -217,7 +219,7 @@ static int startTransceiver()
_exit(0);
}
// Now we can finally write transceiver PID to the file.
if (writePidFile(lockfile, lfp, sgTransceiverPid) != EXIT_SUCCESS) return EXIT_FAILURE;
if (writePidFile(sgTransceiverPidFile, sgTransceiverPidFileFd, sgTransceiverPid) != EXIT_SUCCESS) return EXIT_FAILURE;
}
return EXIT_SUCCESS;
}
@ -573,7 +575,20 @@ int main(int argc, char *argv[])
exitBTS(0, cout);
}
if (sgTransceiverPid) kill(sgTransceiverPid, SIGKILL);
if (sgTransceiverPid) {
kill(sgTransceiverPid, SIGTERM);
if (sgTransceiverPidFileFd >= 0) {
close(sgTransceiverPidFileFd);
}
if (sgTransceiverPidFile.size() > 0) {
if (unlink(sgTransceiverPidFile.data()) == 0) {
LOG(INFO) << "Deleted lock file " << sgTransceiverPidFile;
} else {
LOG(INFO) << "Error while deleting lock file " << sgTransceiverPidFile
<< " code=" << errno << ": " << strerror(errno);
}
}
}
return EXIT_SUCCESS;
}