Browse Source

memory pool for x25519 keys

pull/2121/head
orignal 3 weeks ago
parent
commit
29d77113cc
  1. 12
      libi2pd/Transports.cpp
  2. 4
      libi2pd/Transports.h

12
libi2pd/Transports.cpp

@ -25,7 +25,7 @@ namespace transport
{ {
template<typename Keys> template<typename Keys>
EphemeralKeysSupplier<Keys>::EphemeralKeysSupplier (int size): EphemeralKeysSupplier<Keys>::EphemeralKeysSupplier (int size):
m_QueueSize (size), m_IsRunning (false), m_Thread (nullptr) m_QueueSize (size), m_IsRunning (false)
{ {
} }
@ -39,7 +39,7 @@ namespace transport
void EphemeralKeysSupplier<Keys>::Start () void EphemeralKeysSupplier<Keys>::Start ()
{ {
m_IsRunning = true; m_IsRunning = true;
m_Thread = new std::thread (std::bind (&EphemeralKeysSupplier<Keys>::Run, this)); m_Thread.reset (new std::thread (std::bind (&EphemeralKeysSupplier<Keys>::Run, this)));
} }
template<typename Keys> template<typename Keys>
@ -53,8 +53,7 @@ namespace transport
if (m_Thread) if (m_Thread)
{ {
m_Thread->join (); m_Thread->join ();
delete m_Thread; m_Thread = nullptr;
m_Thread = 0;
} }
} }
@ -78,6 +77,7 @@ namespace transport
} }
else else
{ {
m_KeysPool.CleanUpMt ();
std::unique_lock<std::mutex> l(m_AcquiredMutex); std::unique_lock<std::mutex> l(m_AcquiredMutex);
if (!m_IsRunning) break; if (!m_IsRunning) break;
m_Acquired.wait (l); // wait for element gets acquired m_Acquired.wait (l); // wait for element gets acquired
@ -92,7 +92,7 @@ namespace transport
{ {
for (int i = 0; i < num; i++) for (int i = 0; i < num; i++)
{ {
auto pair = std::make_shared<Keys> (); auto pair = m_KeysPool.AcquireSharedMt ();
pair->GenerateKeys (); pair->GenerateKeys ();
std::unique_lock<std::mutex> l(m_AcquiredMutex); std::unique_lock<std::mutex> l(m_AcquiredMutex);
m_Queue.push (pair); m_Queue.push (pair);
@ -114,7 +114,7 @@ namespace transport
} }
} }
// queue is empty, create new // queue is empty, create new
auto pair = std::make_shared<Keys> (); auto pair = m_KeysPool.AcquireSharedMt ();
pair->GenerateKeys (); pair->GenerateKeys ();
return pair; return pair;
} }

4
libi2pd/Transports.h

@ -26,6 +26,7 @@
#include "RouterInfo.h" #include "RouterInfo.h"
#include "I2NPProtocol.h" #include "I2NPProtocol.h"
#include "Identity.h" #include "Identity.h"
#include "util.h"
namespace i2p namespace i2p
{ {
@ -53,9 +54,10 @@ namespace transport
const int m_QueueSize; const int m_QueueSize;
std::queue<std::shared_ptr<Keys> > m_Queue; std::queue<std::shared_ptr<Keys> > m_Queue;
i2p::util::MemoryPoolMt<Keys> m_KeysPool;
bool m_IsRunning; bool m_IsRunning;
std::thread * m_Thread; std::unique_ptr<std::thread> m_Thread;
std::condition_variable m_Acquired; std::condition_variable m_Acquired;
std::mutex m_AcquiredMutex; std::mutex m_AcquiredMutex;
}; };

Loading…
Cancel
Save