From 77918fd412c9629de89d9959200628fcbea85944 Mon Sep 17 00:00:00 2001
From: Jeff Becker <ampernand@gmail.com>
Date: Mon, 16 Jan 2017 07:54:56 -0500
Subject: [PATCH] use std::shared_from_this

---
 Datagram.cpp | 6 ++++--
 Datagram.h   | 8 +++++---
 2 files changed, 9 insertions(+), 5 deletions(-)

diff --git a/Datagram.cpp b/Datagram.cpp
index 38dfc3e1..705e10ef 100644
--- a/Datagram.cpp
+++ b/Datagram.cpp
@@ -182,7 +182,8 @@ namespace datagram
 		// we used this session
 		m_LastUse = i2p::util::GetMillisecondsSinceEpoch();
 		// schedule send
-		m_LocalDestination->GetService().post(std::bind(&DatagramSession::HandleSend, this, msg));
+		auto self = shared_from_this();
+		m_LocalDestination->GetService().post(std::bind(&DatagramSession::HandleSend, self, msg));
 	}
 
 	DatagramSession::Info DatagramSession::GetSessionInfo() const
@@ -334,7 +335,8 @@ namespace datagram
 	{
 		boost::posix_time::milliseconds dlt(100);
 		m_SendQueueTimer.expires_from_now(dlt);
-		m_SendQueueTimer.async_wait([this](const boost::system::error_code & ec) { if(ec) return; FlushSendQueue(); });
+		auto self = shared_from_this();
+		m_SendQueueTimer.async_wait([self](const boost::system::error_code & ec) { if(ec) return; self->FlushSendQueue(); });
 	}
 }
 }
diff --git a/Datagram.h b/Datagram.h
index 2eb180d6..a10f2646 100644
--- a/Datagram.h
+++ b/Datagram.h
@@ -34,7 +34,7 @@ namespace datagram
   // max 64 messages buffered in send queue for each datagram session
   const size_t DATAGRAM_SEND_QUEUE_MAX_SIZE = 64;
 	
-	class DatagramSession
+	class DatagramSession : public std::enable_shared_from_this<DatagramSession>
 	{
 	public:
 		DatagramSession(i2p::client::ClientDestination * localDestination,
@@ -90,7 +90,9 @@ namespace datagram
     uint64_t m_LastUse;
     bool m_RequestingLS;
 	};
-	
+
+	typedef std::shared_ptr<DatagramSession> DatagramSession_ptr;
+
 	const size_t MAX_DATAGRAM_SIZE = 32768;	 
 	class DatagramDestination
 	{
@@ -132,7 +134,7 @@ namespace datagram
 			i2p::data::IdentityEx m_Identity;
 			Receiver m_Receiver; // default
 			std::mutex m_SessionsMutex;
-			std::map<i2p::data::IdentHash, std::shared_ptr<DatagramSession> > m_Sessions;
+			std::map<i2p::data::IdentHash, DatagramSession_ptr > m_Sessions;
 			std::mutex m_ReceiversMutex;
 			std::map<uint16_t, Receiver> m_ReceiversByPorts;