|
|
|
#pragma once |
|
#include "moses/Util.h" |
|
#include "moses/ContextScope.h" |
|
#include "moses/parameters/AllOptions.h" |
|
#include <sys/time.h> |
|
#include <boost/unordered_map.hpp> |
|
|
|
#ifdef WITH_THREADS |
|
#include <boost/thread/shared_mutex.hpp> |
|
#include <boost/thread/locks.hpp> |
|
#endif |
|
namespace MosesServer{ |
|
|
|
struct Session |
|
{ |
|
uint64_t const id; |
|
time_t start_time; |
|
time_t last_access; |
|
boost::shared_ptr<Moses::ContextScope> const scope; |
|
SPTR<std::map<std::string,float> > m_context_weights; |
|
|
|
|
|
Session(uint64_t const session_id) |
|
: id(session_id) |
|
, scope(new Moses::ContextScope) |
|
{ |
|
last_access = start_time = time(NULL); |
|
} |
|
|
|
bool is_new() const { return last_access == start_time; } |
|
|
|
void setup(std::map<std::string, xmlrpc_c::value> const& params); |
|
}; |
|
|
|
class SessionCache |
|
{ |
|
mutable boost::shared_mutex m_lock; |
|
uint64_t m_session_counter; |
|
boost::unordered_map<uint64_t,Session> m_cache; |
|
public: |
|
|
|
SessionCache() : m_session_counter(1) {} |
|
|
|
Session const& |
|
operator[](uint32_t id) |
|
{ |
|
boost::upgrade_lock<boost::shared_mutex> lock(m_lock); |
|
if (id > 1) |
|
{ |
|
boost::unordered_map<uint64_t, Session>::iterator m = m_cache.find(id); |
|
if (m != m_cache.end()) |
|
{ |
|
m->second.last_access = time(NULL); |
|
return m->second; |
|
} |
|
} |
|
boost::upgrade_to_unique_lock<boost::shared_mutex> xlock(lock); |
|
id = ++m_session_counter; |
|
std::pair<uint64_t, Session> foo(id, Session(id)); |
|
return m_cache.insert(foo).first->second; |
|
} |
|
|
|
void |
|
erase(uint32_t const id) |
|
{ |
|
boost::unique_lock<boost::shared_mutex> lock(m_lock); |
|
m_cache.erase(id); |
|
} |
|
|
|
|
|
}; |
|
|
|
|
|
} |
|
|