Phil Mayers wrote:
Do you have any pointers how to get started on this? Off the top of my head it seems we'd need something like the code below; a struct to hold module-supplied connection create/keepalive/delete functions, some code in the server core to set and re-set "last used" times and call a keepalive function, and delete
Pretty much that, yes.
typedef struct { int alive; void *conn; /* mutex stuff */ } fr_pool_conn;
Add more stats to that: last used, # of uses, etc.
typedef struct { int pool_min; int pool_max; int pool_idle; fr_pool_conn *conns;
void* (*conn_create)(void *arg); int (*conn_keepalive)(void *conn, void *arg); int (*conn_delete)(void *conn, void *arg);
void *arg;
"ctx" instead of "arg", it's a bit clearer.
} fr_conn_pool;
...and then something like: ... int ldap_init(...) {
inst->ldap_pool = fr_pool_create( 5, /* min connection */,
Nah, pass the CONF_SECTION to the pool creation code. It will take care of parsing the min/max connections stuff. That also allows you to add new configuration without changing existing callers!
int perform_search() {
ldap_instance *inst = ...; /* timeout argument - 0 == pool - seconds or microseconds? */ LDAP *conn = fr_pool_get(&inst->ldap_pool, 0); /* stuff fr_pool_release(&inst->ldap_pool, conn);
Pretty much, yes. Hmm... if we really wanted to go nuts, the code in src/main/threads.c does a lot of this already. It could be hacked to use a connection pool. too. Alan DeKok.