]> git.ipfire.org Git - thirdparty/lxc.git/commitdiff
commands: don't lock atomic operations
authorChristian Brauner <christian.brauner@ubuntu.com>
Wed, 22 Nov 2017 13:25:10 +0000 (14:25 +0100)
committerChristian Brauner <christian.brauner@ubuntu.com>
Wed, 6 Dec 2017 15:01:22 +0000 (16:01 +0100)
We're dealing with an integer (lxc_state_t which is an enum). Any POSIX
implementation makes those operations atomic so there's not need in locking
this.

Signed-off-by: Christian Brauner <christian.brauner@ubuntu.com>
src/lxc/commands.c

index 874a6f7911f48e471ccd65535f45e25fb9170a02..a896a47c2dd345cf4a55ed292f631984cc5756e4 100644 (file)
@@ -904,44 +904,35 @@ int lxc_cmd_add_state_client(const char *name, const char *lxcpath,
            },
        };
 
-       /* Lock the whole lxc_cmd_add_state_client_callback() call to ensure
-       *  that lxc_set_state() doesn't cause us to miss a state.
-        */
-       process_lock();
        /* Check if already in requested state. */
        state = lxc_getstate(name, lxcpath);
        if (state < 0) {
-               process_unlock();
                TRACE("%s - Failed to retrieve state of container", strerror(errno));
                return -1;
        } else if (states[state]) {
-               process_unlock();
                TRACE("Container is %s state", lxc_state2str(state));
                return state;
        }
 
        if ((state == STARTING) && !states[RUNNING] && !states[STOPPING] && !states[STOPPED]) {
-               process_unlock();
                TRACE("Container is in %s state and caller requested to be "
                      "informed about a previous state", lxc_state2str(state));
                return state;
        } else if ((state == RUNNING) && !states[STOPPING] && !states[STOPPED]) {
-               process_unlock();
                TRACE("Container is in %s state and caller requested to be "
                      "informed about a previous state", lxc_state2str(state));
                return state;
        } else if ((state == STOPPING) && !states[STOPPED]) {
-               process_unlock();
                TRACE("Container is in %s state and caller requested to be "
                      "informed about a previous state", lxc_state2str(state));
                return state;
        } else if ((state == STOPPED) || (state == ABORTING)) {
-               process_unlock();
                TRACE("Container is in %s state and caller requested to be "
                      "informed about a previous state", lxc_state2str(state));
                return state;
        }
 
+       process_lock();
        ret = lxc_cmd(name, &cmd, &stopped, lxcpath, NULL);
        process_unlock();
        if (ret < 0) {