+extern RRDHOST *localhost;
+
+static inline void rrdhost_rdlock(RRDHOST *host) {
+ if(unlikely(pthread_rwlock_rdlock(&host->rrdhost_rwlock) != 0))
+ error("Cannot obtain read lock on host '%s'", host->hostname);
+}
+
+static inline void rrdhost_wrlock(RRDHOST *host) {
+ if(unlikely(pthread_rwlock_wrlock(&host->rrdhost_rwlock) != 0))
+ error("Cannot obtain write lock on host '%s'", host->hostname);
+}
+
+static inline void rrdhost_unlock(RRDHOST *host) {
+ if(unlikely(pthread_rwlock_unlock(&host->rrdhost_rwlock) != 0))
+ error("Cannot unlock host '%s'", host->hostname);
+}
+
+
+// ----------------------------------------------------------------------------
+// these loop macros make sure the linked list is accessed with the right lock
+
+#define rrdhost_foreach_read(var) \
+ for(var = localhost, rrd_check_rdlock(); var ; var = var->next)
+
+#define rrdhost_foreach_write(var) \
+ for(var = localhost, rrd_check_wrlock(); var ; var = var->next)
+
+
+// ----------------------------------------------------------------------------
+// global lock for all RRDHOSTs
+
+extern pthread_rwlock_t rrd_rwlock;
+
+static inline void rrd_rdlock() {
+ if(unlikely(pthread_rwlock_rdlock(&rrd_rwlock) != 0))
+ error("Cannot read lock the RRD database.");
+}
+
+static inline void rrd_wrlock() {
+ if(unlikely(pthread_rwlock_wrlock(&rrd_rwlock) != 0))
+ error("Cannot write lock the RRD database.");
+}
+
+static inline void rrd_unlock() {
+ if(unlikely(pthread_rwlock_unlock(&rrd_rwlock) != 0))
+ error("Cannot unlock the RRD database.");
+}
+
+static inline void rrdset_rdlock(RRDSET *st) {
+ if(unlikely(pthread_rwlock_rdlock(&st->rrdset_rwlock) != 0))
+ error("Cannot read lock RRDSET '%s' of host '%s'", st->id, st->rrdhost->hostname);
+}
+
+static inline void rrdset_wrlock(RRDSET *st) {
+ if(unlikely(pthread_rwlock_wrlock(&st->rrdset_rwlock) != 0))
+ error("Cannot write lock RRDSET '%s' of host '%s'", st->id, st->rrdhost->hostname);
+}
+
+static inline void rrdset_unlock(RRDSET *st) {
+ if(unlikely(pthread_rwlock_unlock(&st->rrdset_rwlock) != 0))
+ error("Cannot unlock RRDSET '%s' of host '%s'", st->id, st->rrdhost->hostname);
+}
+
+// ----------------------------------------------------------------------------
+
+extern size_t rrd_hosts_available;
+extern time_t rrdhost_free_orphan_time;
+
+extern void rrd_init(char *hostname);
+
+extern RRDHOST *rrdhost_find_by_hostname(const char *hostname, uint32_t hash);
+extern RRDHOST *rrdhost_find_by_guid(const char *guid, uint32_t hash);
+
+extern RRDHOST *rrdhost_find_or_create(
+ const char *hostname
+ , const char *guid
+ , const char *os
+ , int update_every
+ , int history
+ , RRD_MEMORY_MODE mode
+ , int health_enabled
+ , int rrdpush_enabled
+ , char *rrdpush_destination
+ , char *rrdpush_api_key
+);