Cache and reuse RpcMethod objects.

pull/1/head
Tatsuhiro Tsujikawa 2011-06-15 20:07:10 +09:00
parent d1885a5874
commit e3e7a420de
2 changed files with 35 additions and 2 deletions

View File

@ -41,8 +41,17 @@ namespace aria2 {
namespace rpc {
namespace {
SharedHandle<RpcMethod> getNoSuchMethod()
{
static SharedHandle<RpcMethod> m(new NoSuchMethodRpcMethod());
return m;
}
} // namespace
namespace {
SharedHandle<RpcMethod>
RpcMethodFactory::create(const std::string& methodName)
createMethod(const std::string& methodName)
{
if(methodName == AddUriRpcMethod::getMethodName()) {
return SharedHandle<RpcMethod>(new AddUriRpcMethod());
@ -118,7 +127,28 @@ RpcMethodFactory::create(const std::string& methodName)
} else if(methodName == SystemMulticallRpcMethod::getMethodName()) {
return SharedHandle<RpcMethod>(new SystemMulticallRpcMethod());
} else {
return SharedHandle<RpcMethod>(new NoSuchMethodRpcMethod());
return SharedHandle<RpcMethod>();
}
}
} // namespace
std::map<std::string, SharedHandle<RpcMethod> > RpcMethodFactory::cache_;
SharedHandle<RpcMethod>
RpcMethodFactory::create(const std::string& methodName)
{
std::map<std::string, SharedHandle<RpcMethod> >::const_iterator itr =
cache_.find(methodName);
if(itr == cache_.end()) {
SharedHandle<RpcMethod> m = createMethod(methodName);
if(m) {
cache_.insert(std::make_pair(methodName, m));
return m;
} else {
return getNoSuchMethod();
}
} else {
return (*itr).second;
}
}

View File

@ -38,6 +38,7 @@
#include "common.h"
#include <string>
#include <map>
#include "SharedHandle.h"
@ -50,6 +51,8 @@ class RpcMethod;
class RpcMethodFactory {
public:
static SharedHandle<RpcMethod> create(const std::string& methodName);
private:
static std::map<std::string, SharedHandle<RpcMethod> > cache_;
};
} // namespace rpc