[lxc-devel] [PATCH] make process_lock return void
Serge Hallyn
serge.hallyn at ubuntu.com
Mon Sep 16 19:37:32 UTC 2013
pthread_mutex_lock() will only return an error if it was set to
PTHREAD_MUTEX_ERRORCHECK and we are recursively calling it (and
would otherwise have deadlocked). If that's the case then log a
message for future debugging and exit. Trying to "recover" at
that point is madness.
Signed-off-by: Serge Hallyn <serge.hallyn at ubuntu.com>
---
src/lxc/console.c | 16 ++++++++--------
src/lxc/lxccontainer.c | 12 ++++--------
src/lxc/lxclock.c | 6 ++++--
src/lxc/lxclock.h | 2 +-
src/lxc/monitor.c | 2 ++
5 files changed, 19 insertions(+), 19 deletions(-)
diff --git a/src/lxc/console.c b/src/lxc/console.c
index e35a811..f503f18 100644
--- a/src/lxc/console.c
+++ b/src/lxc/console.c
@@ -100,16 +100,16 @@ static void lxc_console_winch(struct lxc_tty_state *ts)
void lxc_console_sigwinch(int sig)
{
- if (process_lock() == 0) {
- struct lxc_list *it;
- struct lxc_tty_state *ts;
+ struct lxc_list *it;
+ struct lxc_tty_state *ts;
- lxc_list_for_each(it, &lxc_ttys) {
- ts = it->elem;
- lxc_console_winch(ts);
- }
- process_unlock();
+ process_lock();
+
+ lxc_list_for_each(it, &lxc_ttys) {
+ ts = it->elem;
+ lxc_console_winch(ts);
}
+ process_unlock();
}
static int lxc_console_cb_sigwinch_fd(int fd, void *cbdata,
diff --git a/src/lxc/lxccontainer.c b/src/lxc/lxccontainer.c
index 3c51c4a..bb2f226 100644
--- a/src/lxc/lxccontainer.c
+++ b/src/lxc/lxccontainer.c
@@ -100,8 +100,7 @@ int ongoing_create(struct lxc_container *c)
if (!file_exists(path))
return 0;
- if (process_lock())
- return -1;
+ process_lock();
if ((fd = open(path, O_RDWR)) < 0) {
// give benefit of the doubt
SYSERROR("Error opening partial file");
@@ -138,8 +137,7 @@ int create_partial(struct lxc_container *c)
ERROR("Error writing partial pathname");
return -1;
}
- if (process_lock())
- return -1;
+ process_lock();
if ((fd=open(path, O_RDWR | O_CREAT | O_EXCL, 0755)) < 0) {
SYSERROR("Erorr creating partial file");
process_unlock();
@@ -173,8 +171,7 @@ void remove_partial(struct lxc_container *c, int fd)
ERROR("Error writing partial pathname");
return;
}
- if (process_lock())
- return;
+ process_lock();
if (unlink(path) < 0)
SYSERROR("Error unlink partial file %s", path);
process_unlock();
@@ -546,8 +543,7 @@ static bool lxcapi_start(struct lxc_container *c, int useinit, char * const argv
return false;
lxc_monitord_spawn(c->config_path);
- if (process_lock())
- return false;
+ process_lock();
pid_t pid = fork();
if (pid < 0) {
lxc_container_put(c);
diff --git a/src/lxc/lxclock.c b/src/lxc/lxclock.c
index 1d6a86c..3307418 100644
--- a/src/lxc/lxclock.c
+++ b/src/lxc/lxclock.c
@@ -271,12 +271,14 @@ void lxc_putlock(struct lxc_lock *l)
free(l);
}
-int process_lock(void)
+void process_lock(void)
{
int ret;
ret = pthread_mutex_lock(&thread_mutex);
- if (ret != 0)
+ if (ret != 0) {
ERROR("pthread_mutex_lock returned:%d %s", ret, strerror(ret));
+ exit(1);
+ }
return ret;
}
diff --git a/src/lxc/lxclock.h b/src/lxc/lxclock.h
index fae7e4d..dcdf79d 100644
--- a/src/lxc/lxclock.h
+++ b/src/lxc/lxclock.h
@@ -85,7 +85,7 @@ extern int lxcunlock(struct lxc_lock *lock);
extern void lxc_putlock(struct lxc_lock *l);
-extern int process_lock(void);
+extern void process_lock(void);
extern void process_unlock(void);
struct lxc_container;
extern int container_mem_lock(struct lxc_container *c);
diff --git a/src/lxc/monitor.c b/src/lxc/monitor.c
index 64e9987..747d6ca 100644
--- a/src/lxc/monitor.c
+++ b/src/lxc/monitor.c
@@ -187,7 +187,9 @@ int lxc_monitor_open(const char *lxcpath)
if (lxc_monitor_sock_name(lxcpath, &addr) < 0)
return -1;
+ process_lock();
fd = socket(PF_UNIX, SOCK_STREAM, 0);
+ process_unlock();
if (fd < 0) {
ERROR("socket : %s", strerror(errno));
return -1;
--
1.8.3.2
More information about the lxc-devel
mailing list