|  | #pragma once | 
|  |  | 
|  | #include <chrono> | 
|  | #include <cstdint> | 
|  | #include <stdexcept> | 
|  | #include <string> | 
|  | #include <vector> | 
|  |  | 
|  | #include "caffe2/core/common.h" | 
|  |  | 
|  | namespace caffe2 { | 
|  |  | 
|  | class CAFFE2_API StoreHandler { | 
|  | public: | 
|  | static constexpr std::chrono::milliseconds kDefaultTimeout = | 
|  | std::chrono::seconds(30); | 
|  | static constexpr std::chrono::milliseconds kNoTimeout = | 
|  | std::chrono::milliseconds::zero(); | 
|  |  | 
|  | virtual ~StoreHandler(); | 
|  |  | 
|  | /* | 
|  | * Set data for the key if it doesn't exist. | 
|  | * If the key exists the data should be the same as the existing key. | 
|  | */ | 
|  | virtual void set(const std::string& name, const std::string& data) = 0; | 
|  |  | 
|  | /* | 
|  | * Get the data for the key. | 
|  | * The call should wait until the key is stored with specified timeout | 
|  | * and return data if set else fail. | 
|  | */ | 
|  | virtual std::string get( | 
|  | const std::string& name, | 
|  | const std::chrono::milliseconds& timeout = kDefaultTimeout) = 0; | 
|  |  | 
|  | /* | 
|  | * Does an atomic add operation on the key and returns the latest updated | 
|  | * value. | 
|  | * Note: To access the current value for this counter call with value = 0 | 
|  | */ | 
|  | virtual int64_t add(const std::string& name, int64_t value) = 0; | 
|  |  | 
|  | /* | 
|  | * Check if a keys exist in the store. | 
|  | */ | 
|  | virtual bool check(const std::vector<std::string>& names) = 0; | 
|  |  | 
|  | /* | 
|  | * Wait for Keys to be stored. | 
|  | */ | 
|  | virtual void wait( | 
|  | const std::vector<std::string>& names, | 
|  | const std::chrono::milliseconds& timeout = kDefaultTimeout) = 0; | 
|  | }; | 
|  |  | 
|  | /* | 
|  | * The backing store is no longer available. It may have been deleted. | 
|  | */ | 
|  | struct CAFFE2_API StoreHandlerNotAvailableException | 
|  | : public std::runtime_error { | 
|  | explicit StoreHandlerNotAvailableException(const std::string& msg) | 
|  | : std::runtime_error(msg) {} | 
|  | }; | 
|  |  | 
|  | #define STORE_HANDLER_NOT_AVAILABLE(...)             \ | 
|  | throw ::caffe2::StoreHandlerNotAvailableException( \ | 
|  | ::c10::str("[", __FILE__, ":", __LINE__, "] ", __VA_ARGS__)); | 
|  |  | 
|  | /* | 
|  | * Timeout accessing the store. | 
|  | */ | 
|  | struct CAFFE2_API StoreHandlerTimeoutException : public std::runtime_error { | 
|  | explicit StoreHandlerTimeoutException(const std::string& msg) | 
|  | : std::runtime_error(msg) {} | 
|  | }; | 
|  |  | 
|  | #define STORE_HANDLER_TIMEOUT(...)              \ | 
|  | throw ::caffe2::StoreHandlerTimeoutException( \ | 
|  | ::c10::str("[", __FILE__, ":", __LINE__, "] ", __VA_ARGS__)); | 
|  | } // namespace caffe2 |