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);
}
GENERIC_INPUT_CALL(brick->inputs[0], mref_put, mref);
atomic_dec(&brick->in_flight);
if (mref_a->do_put) {
GENERIC_INPUT_CALL(brick->inputs[0], mref_put, mref);
atomic_dec(&brick->in_flight);
} else {
mars_free_mref(mref);
}
}
mars_shutdown_socket(sock);
@ -145,6 +149,7 @@ err:
MARS_FAT("cannot handle callback - giving up\n");
}
static
int server_io(struct server_brick *brick, struct mars_socket *sock, struct mars_cmd *cmd)
{
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
goto done;
}
mref_a->do_put = true;
atomic_inc(&brick->in_flight);
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)
continue;
GENERIC_INPUT_CALL(brick->inputs[0], mref_put, mref);
if (mref_a->do_put) {
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);
struct server_brick *brick;
struct list_head cb_head;
bool do_put;
};
struct server_output {