[lxc-devel] [PATCH] make process_lock return void
Stéphane Graber
stgraber at ubuntu.com
Mon Sep 16 19:59:45 UTC 2013
On Mon, Sep 16, 2013 at 02:58:51PM -0500, Serge Hallyn wrote:
> Quoting Serge Hallyn (serge.hallyn at 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)
I'm fine with the idea behind that patch.
>
> > 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
> >
> >
> > ------------------------------------------------------------------------------
> > 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 at 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 at lists.sourceforge.net
> https://lists.sourceforge.net/lists/listinfo/lxc-devel
--
Stéphane Graber
Ubuntu developer
http://www.ubuntu.com
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 836 bytes
Desc: Digital signature
URL: <http://lists.linuxcontainers.org/pipermail/lxc-devel/attachments/20130916/708f0fd0/attachment.pgp>
More information about the lxc-devel
mailing list