Quoting Serge Hallyn (serge.hal...@ubuntu.com):
> 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.

Heh, all right this patch doesn't compile.  But assuming noone
objects to the spirit of it I'll push one that does compile in
a bit.  (It's the base of the more general thread-safety patch
I'm working on)

> Signed-off-by: Serge Hallyn <serge.hal...@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
> 
> 
> ------------------------------------------------------------------------------
> LIMITED TIME SALE - Full Year of Microsoft Training For Just $49.99!
> 1,500+ hours of tutorials including VisualStudio 2012, Windows 8, SharePoint
> 2013, SQL 2012, MVC 4, more. BEST VALUE: New Multi-Library Power Pack includes
> Mobile, Cloud, Java, and UX Design. Lowest price ever! Ends 9/20/13. 
> http://pubads.g.doubleclick.net/gampad/clk?id=58041151&iu=/4140/ostg.clktrk
> _______________________________________________
> Lxc-devel mailing list
> Lxc-devel@lists.sourceforge.net
> https://lists.sourceforge.net/lists/listinfo/lxc-devel

------------------------------------------------------------------------------
LIMITED TIME SALE - Full Year of Microsoft Training For Just $49.99!
1,500+ hours of tutorials including VisualStudio 2012, Windows 8, SharePoint
2013, SQL 2012, MVC 4, more. BEST VALUE: New Multi-Library Power Pack includes
Mobile, Cloud, Java, and UX Design. Lowest price ever! Ends 9/20/13. 
http://pubads.g.doubleclick.net/gampad/clk?id=58041151&iu=/4140/ostg.clktrk
_______________________________________________
Lxc-devel mailing list
Lxc-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/lxc-devel

Reply via email to