From ecdb5b75a4555effd0989cd5bd06012b8c22b93d Mon Sep 17 00:00:00 2001 From: Christian Brauner Date: Sat, 24 Feb 2018 15:15:54 +0100 Subject: [PATCH] lxccontainer: lxc_container_{get,put}() Signed-off-by: Christian Brauner --- src/lxc/lxccontainer.c | 33 ++++++++++++++++++++------------- 1 file changed, 20 insertions(+), 13 deletions(-) diff --git a/src/lxc/lxccontainer.c b/src/lxc/lxccontainer.c index 8dae3672e..0262704e4 100644 --- a/src/lxc/lxccontainer.c +++ b/src/lxc/lxccontainer.c @@ -280,19 +280,21 @@ static void lxc_container_free(struct lxc_container *c) free(c); } -/* - * Consider the following case: -freer | racing get()er -================================================================== -lxc_container_put() | lxc_container_get() -\ lxclock(c->privlock) | c->numthreads < 1? (no) -\ c->numthreads = 0 | \ lxclock(c->privlock) -> waits -\ lxcunlock() | \ -\ lxc_container_free() | \ lxclock() returns - | \ c->numthreads < 1 -> return 0 -\ \ (free stuff) | -\ \ sem_destroy(privlock) | - +/* Consider the following case: + * + * |====================================================================| + * | freer | racing get()er | + * |====================================================================| + * | lxc_container_put() | lxc_container_get() | + * | \ lxclock(c->privlock) | c->numthreads < 1? (no) | + * | \ c->numthreads = 0 | \ lxclock(c->privlock) -> waits | + * | \ lxcunlock() | \ | + * | \ lxc_container_free() | \ lxclock() returns | + * | | \ c->numthreads < 1 -> return 0 | + * | \ \ (free stuff) | | + * | \ \ sem_destroy(privlock) | | + * |_______________________________|____________________________________| + * * When the get()er checks numthreads the first time, one of the following * is true: * 1. freer has set numthreads = 0. get() returns 0 @@ -322,6 +324,7 @@ int lxc_container_get(struct lxc_container *c) } c->numthreads++; container_mem_unlock(c); + return 1; } @@ -329,14 +332,18 @@ int lxc_container_put(struct lxc_container *c) { if (!c) return -1; + if (container_mem_lock(c)) return -1; + if (--c->numthreads < 1) { container_mem_unlock(c); lxc_container_free(c); return 1; } + container_mem_unlock(c); + return 0; } -- 2.47.2