diff --git a/src/flora-agent.cc b/src/flora-agent.cc index 368a0c5..af18ea1 100644 --- a/src/flora-agent.cc +++ b/src/flora-agent.cc @@ -115,9 +115,27 @@ void Agent::start(bool block) { } } +static void clean_gabages(list<shared_ptr<Client> >& gabages) { + auto it = gabages.begin(); + while (it != gabages.end()) { + auto cli = *it; + if (cli) { + static_pointer_cast<flora::internal::Client>(cli)->close(false); + if (cli.use_count() == 1) { + cli.reset(); + it = gabages.erase(it); + } else + ++it; + } else { + ++it; + } + } +} + void Agent::run() { unique_lock<mutex> locker(conn_mutex, defer_lock); - shared_ptr<Client> cli, gabage; + shared_ptr<Client> cli; + list<shared_ptr<Client> > gabages; flora::ClientOptions cliopts; cliopts.bufsize = options.bufsize; @@ -138,13 +156,14 @@ void Agent::run() { KLOGI(TAG, "flora service %s connected", options.uri.c_str()); init_cli(cli); locker.lock(); + gabages.push_back(cli); flora_cli.swap(cli); start_cond.notify_one(); conn_cond.wait(locker); - gabage.swap(flora_cli); + flora_cli.reset(); } locker.unlock(); - gabage.reset(); + clean_gabages(gabages); } } diff --git a/src/sock-conn.cc b/src/sock-conn.cc index 8089a04..6060dce 100644 --- a/src/sock-conn.cc +++ b/src/sock-conn.cc @@ -104,8 +104,9 @@ bool SocketConn::connect(const std::string &host, int32_t port) { bool SocketConn::send(const void *data, uint32_t size) { lock_guard<mutex> locker(write_mutex); - if (!sock_ready) + if (!sock_ready) { return false; + } ssize_t c = ::write(sock, data, size); if (c < 0) { KLOGE(TAG, "write to socket failed: %s", strerror(errno));