server: fix refcounting

This commit is contained in:
Thomas Schoebel-Theuer 2014-03-21 07:31:55 +01:00 committed by Thomas Schoebel-Theuer
parent 54275af543
commit 5b7fabf167
2 changed files with 15 additions and 4 deletions

View File

@ -96,8 +96,12 @@ int cb_thread(void *data)
mars_shutdown_socket(sock); mars_shutdown_socket(sock);
} }
if (mref_a->do_put) {
GENERIC_INPUT_CALL(brick->inputs[0], mref_put, mref); GENERIC_INPUT_CALL(brick->inputs[0], mref_put, mref);
atomic_dec(&brick->in_flight); atomic_dec(&brick->in_flight);
} else {
mars_free_mref(mref);
}
} }
mars_shutdown_socket(sock); mars_shutdown_socket(sock);
@ -145,6 +149,7 @@ err:
MARS_FAT("cannot handle callback - giving up\n"); MARS_FAT("cannot handle callback - giving up\n");
} }
static
int server_io(struct server_brick *brick, struct mars_socket *sock, struct mars_cmd *cmd) int server_io(struct server_brick *brick, struct mars_socket *sock, struct mars_cmd *cmd)
{ {
struct mref_object *mref; struct mref_object *mref;
@ -187,7 +192,7 @@ int server_io(struct server_brick *brick, struct mars_socket *sock, struct mars_
status = 0; // continue serving requests status = 0; // continue serving requests
goto done; goto done;
} }
mref_a->do_put = true;
atomic_inc(&brick->in_flight); atomic_inc(&brick->in_flight);
GENERIC_INPUT_CALL(brick->inputs[0], mref_io, mref); GENERIC_INPUT_CALL(brick->inputs[0], mref_io, mref);
@ -213,7 +218,12 @@ void _clean_list(struct server_brick *brick, struct list_head *start)
if (!mref) if (!mref)
continue; continue;
if (mref_a->do_put) {
GENERIC_INPUT_CALL(brick->inputs[0], mref_put, mref); GENERIC_INPUT_CALL(brick->inputs[0], mref_put, mref);
atomic_dec(&brick->in_flight);
} else {
mars_free_mref(mref);
}
} }
} }

View File

@ -17,6 +17,7 @@ struct server_mref_aspect {
GENERIC_ASPECT(mref); GENERIC_ASPECT(mref);
struct server_brick *brick; struct server_brick *brick;
struct list_head cb_head; struct list_head cb_head;
bool do_put;
}; };
struct server_output { struct server_output {