From: Christian Brauner Date: Sat, 24 Feb 2018 14:15:54 +0000 (+0100) Subject: lxccontainer: lxc_container_{get,put}() X-Git-Tag: lxc-3.0.0.beta1~15^2~26 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=045552aabed24b39095bdd5da678c4bc0c0c08d2;p=thirdparty%2Flxc.git lxccontainer: lxc_container_{get,put}() Signed-off-by: Christian Brauner --- diff --git a/src/lxc/lxccontainer.c b/src/lxc/lxccontainer.c index 4858d971b..1f6d33a6e 100644 --- a/src/lxc/lxccontainer.c +++ b/src/lxc/lxccontainer.c @@ -281,19 +281,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 @@ -326,6 +328,7 @@ int lxc_container_get(struct lxc_container *c) c->numthreads++; container_mem_unlock(c); + return 1; } @@ -333,14 +336,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; }