From 49eccee209f01af043d084742bbbc9d4519eddfc Mon Sep 17 00:00:00 2001 From: Volker Lendecke Date: Sun, 14 Jun 2009 12:58:19 +0200 Subject: Remove "winbindd_request" and "winbindd_response" from winbindd_cli_state This shrinks the memory footprint of an idle client by 5592 bytes to 60 bytes on my 32-bit box. --- source3/winbindd/winbindd.c | 16 ++++++++++------ source3/winbindd/winbindd.h | 4 +--- source3/winbindd/winbindd_dual.c | 6 ++++-- 3 files changed, 15 insertions(+), 11 deletions(-) (limited to 'source3') diff --git a/source3/winbindd/winbindd.c b/source3/winbindd/winbindd.c index 9cc1bf2701..0a73c0ebc6 100644 --- a/source3/winbindd/winbindd.c +++ b/source3/winbindd/winbindd.c @@ -531,11 +531,6 @@ static void process_request(struct winbindd_cli_state *state) struct winbindd_dispatch_table *table = dispatch_table; struct winbindd_async_dispatch_table *atable; - ZERO_STRUCTP(state->response); - - state->response->result = WINBINDD_PENDING; - state->response->length = sizeof(struct winbindd_response); - state->mem_ctx = talloc_init("winbind request"); if (state->mem_ctx == NULL) return; @@ -570,6 +565,16 @@ static void process_request(struct winbindd_cli_state *state) return; } + state->response = talloc_zero(state->mem_ctx, + struct winbindd_response); + if (state->response == NULL) { + DEBUG(10, ("talloc failed\n")); + remove_client(state); + return; + } + state->response->result = WINBINDD_PENDING; + state->response->length = sizeof(struct winbindd_response); + for (table = dispatch_table; table->fn; table++) { if (state->request->cmd == table->cmd) { DEBUG(10,("process_request: request fn %s\n", @@ -709,7 +714,6 @@ static void new_connection(int listen_sock, bool privileged) } state->sock = sock; - state->response = &state->_response; state->out_queue = tevent_queue_create(state, "winbind client reply"); if (state->out_queue == NULL) { diff --git a/source3/winbindd/winbindd.h b/source3/winbindd/winbindd.h index 4b4fc04d6d..804c0afa5d 100644 --- a/source3/winbindd/winbindd.h +++ b/source3/winbindd/winbindd.h @@ -58,10 +58,8 @@ struct winbindd_cli_state { NTSTATUS (*recv_fn)(struct tevent_req *req, TALLOC_CTX *mem_ctx, struct winbindd_response **presp); struct winbindd_request *request; /* Request from client */ - struct winbindd_request _request; struct tevent_queue *out_queue; - struct winbindd_response *response; - struct winbindd_response _response; /* Respose to client */ + struct winbindd_response *response; /* Respose to client */ bool getpwent_initialized; /* Has getpwent_state been * initialized? */ bool getgrent_initialized; /* Has getgrent_state been diff --git a/source3/winbindd/winbindd_dual.c b/source3/winbindd/winbindd_dual.c index 3e0d956a74..92f0d60817 100644 --- a/source3/winbindd/winbindd_dual.c +++ b/source3/winbindd/winbindd_dual.c @@ -1316,6 +1316,8 @@ static bool fork_domain_child(struct winbindd_child *child) { int fdpair[2]; struct winbindd_cli_state state; + struct winbindd_request request; + struct winbindd_response response; struct winbindd_domain *primary_domain = NULL; if (child->domain) { @@ -1333,8 +1335,8 @@ static bool fork_domain_child(struct winbindd_child *child) ZERO_STRUCT(state); state.pid = sys_getpid(); - state.request = &state._request; - state.response = &state._response; + state.request = &request; + state.response = &response; child->pid = sys_fork(); -- cgit