diff options
Diffstat (limited to 'src/RpcMethodFactory.cc')
| -rw-r--r-- | src/RpcMethodFactory.cc | 34 |
1 files changed, 32 insertions, 2 deletions
diff --git a/src/RpcMethodFactory.cc b/src/RpcMethodFactory.cc index f2e48862..088f2ba9 100644 --- a/src/RpcMethodFactory.cc +++ b/src/RpcMethodFactory.cc @@ -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; } } |
