Merge "fix: LocIpc client app unable to exit" into location.lnx.3.9

This commit is contained in:
Linux Build Service Account 2018-06-03 02:28:14 -07:00 committed by Gerrit - the friendly Code Review server
commit a35498006d
2 changed files with 25 additions and 15 deletions

View file

@ -28,19 +28,9 @@
*/
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/un.h>
#include <sys/stat.h>
#include <error.h>
#include <errno.h>
#include <unistd.h>
#include <stdlib.h>
#include <array>
#include <loc_pla.h>
#include <log_util.h>
#include <string>
#include <vector>
#include "gps_extended_c.h"
#include "LocIpc.h"
namespace loc_util {
@ -52,8 +42,10 @@ namespace loc_util {
#define LOC_MSG_BUF_LEN 8192
#define LOC_MSG_HEAD "$MSGLEN$"
#define LOC_MSG_ABORT "LocIpcMsg::ABORT"
class LocIpcRunnable : public LocRunnable {
friend LocIpc;
public:
LocIpcRunnable(LocIpc& locIpc, const std::string& ipcName)
: mLocIpc(locIpc), mIpcName(ipcName) {}
@ -70,10 +62,10 @@ private:
};
bool LocIpc::startListeningNonBlocking(const std::string& name) {
mRunnable.reset(new LocIpcRunnable(*this, name));
mRunnable = new LocIpcRunnable(*this, name);
std::string threadName("LocIpc-");
threadName.append(name);
return mThread.start(threadName.c_str(), mRunnable.get());
return mThread.start(threadName.c_str(), mRunnable);
}
bool LocIpc::startListeningBlocking(const std::string& name) {
@ -107,6 +99,7 @@ bool LocIpc::startListeningBlocking(const std::string& name) {
ssize_t nBytes = 0;
std::string msg = "";
std::string abort = LOC_MSG_ABORT;
while (1) {
msg.resize(LOC_MSG_BUF_LEN);
nBytes = ::recvfrom(mIpcFd, (void*)(msg.data()), msg.size(), 0, NULL, NULL);
@ -116,6 +109,11 @@ bool LocIpc::startListeningBlocking(const std::string& name) {
continue;
}
if (strncmp(msg.data(), abort.c_str(), abort.length()) == 0) {
LOC_LOGi("recvd abort msg.data %s", msg.data());
break;
}
if (strncmp(msg.data(), LOC_MSG_HEAD, sizeof(LOC_MSG_HEAD) - 1)) {
// short message
msg.resize(nBytes);
@ -142,7 +140,6 @@ bool LocIpc::startListeningBlocking(const std::string& name) {
if (mStopRequested) {
mStopRequested = false;
return true;
} else {
LOC_LOGe("cannot read socket. reason:%s", strerror(errno));
(void)::close(mIpcFd);
@ -152,14 +149,28 @@ bool LocIpc::startListeningBlocking(const std::string& name) {
}
void LocIpc::stopListening() {
const char *socketName = nullptr;
mStopRequested = true;
if (mRunnable) {
std::string abort = LOC_MSG_ABORT;
socketName = (reinterpret_cast<LocIpcRunnable *>(mRunnable))->mIpcName.c_str();
send(socketName, abort);
mRunnable = nullptr;
}
if (mIpcFd >= 0) {
if (::close(mIpcFd)) {
LOC_LOGe("cannot close socket:%s", strerror(errno));
}
mIpcFd = -1;
}
//delete from the file system at the end
if (socketName) {
unlink(socketName);
}
}
bool LocIpc::send(const char name[], const std::string& data) {

View file

@ -32,7 +32,6 @@
#include <string>
#include <memory>
#include <string.h>
#include <unistd.h>
#include <sys/socket.h>
#include <sys/un.h>
@ -96,7 +95,7 @@ private:
int mIpcFd;
bool mStopRequested;
LocThread mThread;
std::unique_ptr<LocRunnable> mRunnable;
LocRunnable *mRunnable;
};
class LocIpcSender {