diff --git a/db.h b/db.h new file mode 100644 index 0000000..fd4c149 --- /dev/null +++ b/db.h @@ -0,0 +1,44 @@ +#include + +#include +#include +#include +#include +#include + +#include "netbase.h" +#include "protocol.h" +#include "util.h" + +class CAddrInfo { +private: + CIP ip; + uint64_t services; + uint32_t lastTry; + uint32_t ourLastTry; + double reliabity; + double weight; +} + +class CAddrDb { +private: + CCriticalSection cs; + int nId; // number of address id's + map idToInfo; // map address id to address info + map ipToId; // map ip to id + deque ourId; // sequence of tracked nodes, in order we have tried connecting to them + set unkId; // set of nodes not yet tried + set goodId; // set of good nodes + map > banned; // nodes that are banned, with their from/to ban time + +public: + void Add(const CAddress &addr); + void Add(const vector &vAddr); + void Good(const CIP &addr); + void Bad(const CIP &addr, int fail); + CIP Get(); +} + +extern "C" { + int GetIPv4Address(struct in_addr *addr, int max); +} diff --git a/util.h b/util.h index 6bdd2e1..6da6331 100644 --- a/util.h +++ b/util.h @@ -1,6 +1,8 @@ #ifndef _UTIL_H_ #define _UTIL_H_ 1 +#include + #define loop for (;;) #define BEGIN(a) ((char*)&(a)) #define END(a) ((char*)&((&(a))[1])) @@ -34,4 +36,31 @@ inline int myclosesocket(SOCKET& hSocket) } #define closesocket(s) myclosesocket(s) + +// Wrapper to automatically initialize mutex +class CCriticalSection +{ +protected: + pthread_mutex_t mutex; +public: + explicit CCriticalSection() { pthread_mutex_init(&mutex, NULL); } + ~CCriticalSection() { pthread_mutex_destroy(&mutex); } + void Enter() { pthread_mutex_lock(&mutex); } + void Leave() { pthread_mutex_unlock(&mutex); } +}; + +// Automatically leave critical section when leaving block, needed for exception safety +class CCriticalBlock +{ +protected: + CCriticalSection* pcs; +public: + CCriticalBlock(CCriticalSection& cs) : pcs(&cs) { pcs->Enter(); } + operator bool() const { return true; } + ~CCriticalBlock() { pcs->Leave(); } +}; + +#define CRITICAL_BLOCK(cs) \ + if (CCriticalBlock criticalblock = CCriticalBlock(cs)) + #endif