Files
allwpilib/src/Storage.h

129 lines
4.2 KiB
C
Raw Normal View History

/*----------------------------------------------------------------------------*/
/* Copyright (c) FIRST 2015. All Rights Reserved. */
/* Open Source Software - may be modified and shared by FRC teams. The code */
/* must be accompanied by the FIRST BSD license file in the root directory of */
/* the project. */
/*----------------------------------------------------------------------------*/
#ifndef NT_STORAGE_H_
#define NT_STORAGE_H_
#include <atomic>
#include <cstddef>
#include <functional>
2015-07-14 23:15:08 -07:00
#include <iosfwd>
#include <memory>
#include <mutex>
2015-08-01 16:33:39 -07:00
#include <vector>
2015-08-13 13:12:15 -07:00
#include "llvm/DenseMap.h"
#include "llvm/StringMap.h"
#include "atomic_static.h"
#include "Message.h"
#include "Notifier.h"
#include "ntcore_cpp.h"
2015-08-13 13:12:15 -07:00
#include "RpcServer.h"
#include "SequenceNumber.h"
namespace nt {
class NetworkConnection;
class StorageTest;
class Storage {
friend class StorageTest;
public:
static Storage& GetInstance() {
ATOMIC_STATIC(Storage, instance);
return instance;
}
2015-07-14 23:15:08 -07:00
~Storage();
// Accessors required by Dispatcher.
typedef std::function<void(std::shared_ptr<Message> msg,
NetworkConnection* only,
NetworkConnection* except)> QueueOutgoingFunc;
void SetOutgoing(QueueOutgoingFunc queue_outgoing, bool server);
void ClearOutgoing();
NT_Type GetEntryType(unsigned int id) const;
2015-08-13 13:12:15 -07:00
void ProcessIncoming(std::shared_ptr<Message> msg, NetworkConnection* conn,
std::weak_ptr<NetworkConnection> conn_weak);
void GetInitialAssignments(NetworkConnection& conn,
std::vector<std::shared_ptr<Message>>* msgs);
void ApplyInitialAssignments(NetworkConnection& conn,
llvm::ArrayRef<std::shared_ptr<Message>> msgs,
bool new_server,
2015-07-31 20:32:52 -07:00
std::vector<std::shared_ptr<Message>>* out_msgs);
std::mutex& mutex() { return m_mutex; }
// User functions
std::shared_ptr<Value> GetEntryValue(StringRef name) const;
bool SetEntryValue(StringRef name, std::shared_ptr<Value> value);
void SetEntryTypeValue(StringRef name, std::shared_ptr<Value> value);
void SetEntryFlags(StringRef name, unsigned int flags);
unsigned int GetEntryFlags(StringRef name) const;
void DeleteEntry(StringRef name);
void DeleteAllEntries();
std::vector<EntryInfo> GetEntryInfo(StringRef prefix, unsigned int types);
void NotifyEntries(StringRef prefix);
void SavePersistent(std::ostream& os) const;
bool LoadPersistent(
std::istream& is,
std::function<void(std::size_t line, const char* msg)> warn);
2015-08-13 13:12:15 -07:00
// RPC configuration needs to come through here as RPC definitions are
// actually special Storage value types.
void CreateRpc(StringRef name, StringRef def, RpcCallback callback);
void CreatePolledRpc(StringRef name, StringRef def);
unsigned int CallRpc(StringRef name, StringRef params);
bool GetRpcResult(bool blocking, unsigned int call_uid, std::string* result);
private:
2015-08-13 13:12:15 -07:00
Storage() : Storage(Notifier::GetInstance(), RpcServer::GetInstance()) {}
Storage(Notifier& notifier, RpcServer& rpcserver);
Storage(const Storage&) = delete;
Storage& operator=(const Storage&) = delete;
struct Entry {
2015-08-13 13:12:15 -07:00
Entry(llvm::StringRef name_)
: name(name_), flags(0), id(0xffff), rpc_call_uid(0) {}
bool IsPersistent() const { return (flags & NT_PERSISTENT) != 0; }
std::string name;
std::shared_ptr<Value> value;
unsigned int flags;
unsigned int id;
SequenceNumber seq_num;
2015-08-13 13:12:15 -07:00
RpcCallback rpc_callback;
unsigned int rpc_call_uid;
};
typedef llvm::StringMap<std::unique_ptr<Entry>> EntriesMap;
typedef std::vector<Entry*> IdMap;
2015-08-13 13:12:15 -07:00
typedef llvm::DenseMap<std::pair<unsigned int, unsigned int>, std::string>
RpcResultMap;
mutable std::mutex m_mutex;
EntriesMap m_entries;
IdMap m_idmap;
2015-08-13 13:12:15 -07:00
RpcResultMap m_rpc_results;
std::atomic_bool m_terminating;
std::condition_variable m_rpc_results_cond;
QueueOutgoingFunc m_queue_outgoing;
2015-08-13 13:12:15 -07:00
bool m_server = true;
Notifier& m_notifier;
2015-08-13 13:12:15 -07:00
RpcServer& m_rpc_server;
ATOMIC_STATIC_DECL(Storage)
};
} // namespace nt
#endif // NT_STORAGE_H_