]> git.meshlink.io Git - catta/blobdiff - server.h
fix two memory leaks
[catta] / server.h
index 4134638dd6fd88d5dae95d787f9bf1142d4c076c..97b2d6b41a358d46a2d6843ca667c49227fc6962 100644 (file)
--- a/server.h
+++ b/server.h
@@ -4,72 +4,76 @@
 #include "flx.h"
 #include "iface.h"
 #include "prioq.h"
+#include "llist.h"
+#include "timeeventq.h"
+#include "announce.h"
+#include "subscribe.h"
 
-struct _flxEntry;
-typedef struct _flxEntry flxEntry;
 struct _flxEntry {
-    flxRecord rr;
-    gint id;
+    flxServer *server;
+    flxEntryGroup *group;
+
+    gboolean dead;
+    
+    flxEntryFlags flags;
+    flxRecord *record;
     gint interface;
     guchar protocol;
 
-    gboolean unique;
-
-    flxEntry *next, *prev;
-    flxEntry *next_by_name, *prev_by_name;
-    flxEntry *next_by_id, *prev_by_id;
+    FLX_LLIST_FIELDS(flxEntry, entries);
+    FLX_LLIST_FIELDS(flxEntry, by_key);
+    FLX_LLIST_FIELDS(flxEntry, by_group);
+    
+    FLX_LLIST_HEAD(flxAnnouncement, announcements);
 };
 
-typedef struct _flxQueryJob {
-    gint ref;
-    GTimeVal time;
-    flxQuery query;
-} flxQueryJob;
+struct _flxEntryGroup {
+    flxServer *server;
+    gboolean dead;
 
-typedef struct _flxQueryJobInstance {
-    flxPrioQueueNode *node;
-    flxQueryJob *job;
-    gint interface;
-    guchar protocol;
-} flxQueryJobInstance;
+    flxEntryGroupStatus status;
+    gpointer userdata;
+    flxEntryGroupCallback callback;
 
-typedef struct _flxResponseJob {
-    gint ref;
-    GTimeVal time;
-    flxRecord response;
-} flxResponseJob;
-
-typedef struct _flxResponseJobInstance {
-    flxPrioQueueNode *node;
-    flxResponseJob *job;
-    gint interface;
-    guchar protocol;
-} flxResponseJobInstance;
+    guint n_probing;
+    
+    FLX_LLIST_FIELDS(flxEntryGroup, groups);
+    FLX_LLIST_HEAD(flxEntry, entries);
+};
 
 struct _flxServer {
     GMainContext *context;
     flxInterfaceMonitor *monitor;
 
-    gint current_id;
+    FLX_LLIST_HEAD(flxEntry, entries);
+    GHashTable *entries_by_key;
+
+    FLX_LLIST_HEAD(flxEntryGroup, groups);
     
-    GHashTable *rrset_by_id;
-    GHashTable *rrset_by_name;
+    FLX_LLIST_HEAD(flxSubscription, subscriptions);
+    GHashTable *subscription_hashtable;
+
+    gboolean need_entry_cleanup, need_group_cleanup;
+    
+    flxTimeEventQueue *time_event_queue;
+    
+    gchar *hostname;
+
+    gint fd_ipv4, fd_ipv6;
 
-    flxEntry *entries;
+    GPollFD pollfd_ipv4, pollfd_ipv6;
+    GSource *source;
 
-    flxPrioQueue *query_job_queue;
-    flxPrioQueue *response_job_queue;
+    gboolean ignore_bad_ttl;
 };
 
-flxQueryJob* flx_query_job_new(void);
-flxQueryJob* flx_query_job_ref(flxQueryJob *job);
-void flx_query_job_unref(flxQueryJob *job);
+gboolean flx_server_entry_match_interface(flxEntry *e, flxInterface *i);
 
-void flx_server_post_query_job(flxServer *s, gint interface, guchar protocol, const GTimeVal *tv, const flxQuery *q);
-void flx_server_drop_query_job(flxServer *s, gint interface, guchar protocol, const flxQuery *q);
+void flx_server_post_query(flxServer *s, gint interface, guchar protocol, flxKey *key);
+void flx_server_post_response(flxServer *s, gint interface, guchar protocol, flxRecord *record, gboolean flush_cache);
 
-void flx_server_remove_query_job_instance(flxServer *s, flxQueryJobInstance *i);
+void flx_entry_group_run_callback(flxEntryGroup *g, flxEntryGroupStatus state);
 
-gboolean flx_query_equal(const flxQuery *a, const flxQuery *b);
+gboolean flx_entry_commited(flxEntry *e);
 
 #endif