From b550d009ca06e31672e3e4b7b8555a26e17b3370 Mon Sep 17 00:00:00 2001 From: Willy Tarreau Date: Fri, 20 Feb 2015 16:53:25 +0100 Subject: [PATCH] MEDIUM: protocol: use a family array to index the protocol handlers Instead of walking over a list, we now have a direct mapping between protocol families and their respective handlers. This will allow fast lookups. --- include/proto/protocol.h | 10 +++++++++- src/protocol.c | 17 +++++------------ 2 files changed, 14 insertions(+), 13 deletions(-) diff --git a/include/proto/protocol.h b/include/proto/protocol.h index 1842faf16..13a3c0a61 100644 --- a/include/proto/protocol.h +++ b/include/proto/protocol.h @@ -22,8 +22,11 @@ #ifndef _PROTO_PROTOCOL_H #define _PROTO_PROTOCOL_H +#include #include +extern struct protocol *__protocol_by_family[AF_MAX]; + /* Registers the protocol */ void protocol_register(struct protocol *proto); @@ -51,7 +54,12 @@ int protocol_unbind_all(void); int protocol_enable_all(void); /* returns the protocol associated to family or NULL if not found */ -struct protocol *protocol_by_family(int family); +static inline struct protocol *protocol_by_family(int family) +{ + if (family >= 0 && family < AF_MAX) + return __protocol_by_family[family]; + return NULL; +} #endif /* _PROTO_PROTOCOL_H */ diff --git a/src/protocol.c b/src/protocol.c index 84d23dab0..3caccb6a3 100644 --- a/src/protocol.c +++ b/src/protocol.c @@ -10,6 +10,8 @@ * */ +#include + #include #include #include @@ -19,11 +21,14 @@ /* List head of all registered protocols */ static struct list protocols = LIST_HEAD_INIT(protocols); +struct protocol *__protocol_by_family[AF_MAX] = { }; /* Registers the protocol */ void protocol_register(struct protocol *proto) { LIST_ADDQ(&protocols, &proto->list); + if (proto->sock_domain >= 0 && proto->sock_domain < AF_MAX) + __protocol_by_family[proto->sock_domain] = proto; } /* Unregisters the protocol . Note that all listeners must have @@ -109,18 +114,6 @@ int protocol_disable_all(void) return err; } -/* Returns the protocol handler for socket family or NULL if not found */ -struct protocol *protocol_by_family(int family) -{ - struct protocol *proto; - - list_for_each_entry(proto, &protocols, list) { - if (proto->sock_domain == family) - return proto; - } - return NULL; -} - /* * Local variables: * c-indent-level: 8 -- 2.47.3