[core] gw_backend less pointer chasing

This commit is contained in:
Glenn Strauss 2019-11-23 00:48:24 -05:00
parent cec18f4381
commit c2a16bb228
2 changed files with 35 additions and 40 deletions

View File

@ -151,44 +151,40 @@ static gw_exts *gw_extensions_init(void) {
static void gw_extensions_free(gw_exts *f) {
if (!f) return;
for (uint32_t i = 0; i < f->used; ++i) {
gw_extension *fe = f->exts[i];
gw_extension *fe = f->exts+i;
for (uint32_t j = 0; j < fe->used; ++j) {
gw_host_free(fe->hosts[j]);
}
buffer_free(fe->key);
free(fe->hosts);
free(fe);
}
free(f->exts);
free(f);
}
static int gw_extension_insert(gw_exts *ext, buffer *key, gw_host *fh) {
static int gw_extension_insert(gw_exts *ext, const buffer *key, gw_host *fh) {
gw_extension *fe = NULL;
for (uint32_t i = 0; i < ext->used; ++i) {
if (buffer_is_equal(key, ext->exts[i]->key)) {
fe = ext->exts[i];
if (buffer_is_equal(key, &ext->exts[i].key)) {
fe = ext->exts+i;
break;
}
}
if (NULL == fe) {
fe = calloc(1, sizeof(*fe));
force_assert(fe);
fe->key = buffer_init();
fe->last_used_ndx = -1;
buffer_copy_buffer(fe->key, key);
if (ext->used == ext->size) {
ext->size += 8;
ext->exts = realloc(ext->exts, ext->size * sizeof(*(ext->exts)));
ext->exts = realloc(ext->exts, ext->size * sizeof(gw_extension));
force_assert(ext->exts);
memset(ext->exts + ext->used, 0, 8 * sizeof(gw_extension));
}
ext->exts[ext->used++] = fe;
fe->size = 4;
fe->hosts = malloc(fe->size * sizeof(*(fe->hosts)));
force_assert(fe->hosts);
} else if (fe->size == fe->used) {
fe = ext->exts + ext->used++;
fe->last_used_ndx = -1;
buffer *b;
*(const buffer **)&b = &fe->key;
memcpy(b, key, sizeof(buffer)); /*(copy; not later free'd)*/
}
if (fe->size == fe->used) {
fe->size += 4;
fe->hosts = realloc(fe->hosts, fe->size * sizeof(*(fe->hosts)));
force_assert(fe->hosts);
@ -704,7 +700,7 @@ static gw_host * unixsocket_is_dup(gw_plugin_data *p, const buffer *unixsocket)
gw_exts *exts = conf->exts;
for (uint32_t j = 0; j < exts->used; ++j) {
gw_extension *ex = exts->exts[j];
gw_extension *ex = exts->exts+j;
for (uint32_t n = 0; n < ex->used; ++n) {
gw_host *host = ex->hosts[n];
if (!buffer_string_is_empty(host->unixsocket)
@ -936,7 +932,7 @@ static gw_host * gw_host_get(server *srv, connection *con, gw_extension *extensi
extension->note_is_sent = 1;
log_error_write(srv, __FILE__, __LINE__, "sBSbsbs",
"all handlers for", con->uri.path, "?",
con->uri.query, "on", extension->key, "are down.");
con->uri.query, "on", &extension->key, "are down.");
}
return NULL;
@ -1121,7 +1117,7 @@ void gw_plugin_config_free(gw_plugin_config *s) {
gw_exts *exts = s->exts;
if (exts) {
for (uint32_t j = 0; j < exts->used; ++j) {
gw_extension *ex = exts->exts[j];
gw_extension *ex = exts->exts+j;
for (uint32_t n = 0; n < ex->used; ++n) {
gw_proc *proc;
gw_host *host = ex->hosts[n];
@ -1177,7 +1173,7 @@ void gw_free(void *p_d) {
void gw_exts_clear_check_local(gw_exts *exts) {
for (uint32_t j = 0; j < exts->used; ++j) {
gw_extension *ex = exts->exts[j];
gw_extension *ex = exts->exts+j;
for (uint32_t n = 0; n < ex->used; ++n) {
ex->hosts[n]->check_local = 0;
}
@ -2349,9 +2345,9 @@ handler_t gw_check_extension(server *srv, connection *con, gw_plugin_data *p, in
/* check if we know the extension */
uint32_t k;
for (k = 0; k < exts->used; ++k) {
extension = exts->exts[k];
extension = exts->exts+k;
if (buffer_is_equal(&ds->value, extension->key)) {
if (buffer_is_equal(&ds->value, &extension->key)) {
break;
}
}
@ -2368,19 +2364,19 @@ handler_t gw_check_extension(server *srv, connection *con, gw_plugin_data *p, in
/* check if extension matches */
for (uint32_t k = 0; k < exts->used; ++k) {
gw_extension *ext = exts->exts[k];
size_t ct_len = buffer_string_length(ext->key);
gw_extension *ext = exts->exts+k;
size_t ct_len = buffer_string_length(&ext->key);
/* check _url_ in the form "/gw_pattern" */
if (ext->key->ptr[0] == '/') {
if (ext->key.ptr[0] == '/') {
if (ct_len <= uri_path_len
&& 0==memcmp(con->uri.path->ptr,ext->key->ptr,ct_len)){
&& 0 == memcmp(con->uri.path->ptr,ext->key.ptr,ct_len)){
extension = ext;
break;
}
} else if (ct_len <= s_len
&& 0 == memcmp(fn->ptr + s_len - ct_len,
ext->key->ptr, ct_len)) {
ext->key.ptr, ct_len)) {
/* check extension in the form ".fcg" */
extension = ext;
break;
@ -2445,16 +2441,16 @@ handler_t gw_check_extension(server *srv, connection *con, gw_plugin_data *p, in
char *pathinfo;
/* the rewrite is only done for /prefix/? matches */
if (host->fix_root_path_name && extension->key->ptr[0] == '/'
&& extension->key->ptr[1] == '\0'){
if (host->fix_root_path_name && extension->key.ptr[0] == '/'
&& extension->key.ptr[1] == '\0') {
buffer_copy_buffer(con->request.pathinfo, con->uri.path);
buffer_clear(con->uri.path);
} else if (extension->key->ptr[0] == '/'
} else if (extension->key.ptr[0] == '/'
&& buffer_string_length(con->uri.path)
> buffer_string_length(extension->key)
> buffer_string_length(&extension->key)
&& (pathinfo =
strchr(con->uri.path->ptr
+ buffer_string_length(extension->key),
+ buffer_string_length(&extension->key),
'/')) != NULL) {
/* rewrite uri.path and pathinfo */
@ -2579,7 +2575,7 @@ static void gw_handle_trigger_host(server *srv, gw_host *host, int debug) {
static void gw_handle_trigger_exts(server *srv, gw_exts *exts, int debug) {
for (uint32_t j = 0; j < exts->used; ++j) {
gw_extension *ex = exts->exts[j];
gw_extension *ex = exts->exts+j;
for (uint32_t n = 0; n < ex->used; ++n) {
gw_handle_trigger_host(srv, ex->hosts[n], debug);
}
@ -2588,7 +2584,7 @@ static void gw_handle_trigger_exts(server *srv, gw_exts *exts, int debug) {
static void gw_handle_trigger_exts_wkr(server *srv, gw_exts *exts) {
for (uint32_t j = 0; j < exts->used; ++j) {
gw_extension * const ex = exts->exts[j];
gw_extension * const ex = exts->exts+j;
for (uint32_t n = 0; n < ex->used; ++n) {
gw_host * const host = ex->hosts[n];
for (gw_proc *proc = host->first; proc; proc = proc->next) {
@ -2670,7 +2666,7 @@ handler_t gw_handle_waitpid_cb(server *srv, void *p_d, pid_t pid, int status) {
* might be part of a larger plugin_config) */
gw_exts *exts = conf->exts;
for (uint32_t j = 0; j < exts->used; ++j) {
gw_extension *ex = exts->exts[j];
gw_extension *ex = exts->exts+j;
for (uint32_t n = 0; n < ex->used; ++n) {
gw_host *host = ex->hosts[n];
gw_proc *proc;

View File

@ -233,7 +233,7 @@ typedef struct {
*/
typedef struct {
buffer *key; /* like .php */
const buffer key; /* like .php */
int note_is_sent;
int last_used_ndx;
@ -245,8 +245,7 @@ typedef struct {
} gw_extension;
typedef struct {
gw_extension **exts;
gw_extension *exts;
uint32_t used;
uint32_t size;
} gw_exts;