]> 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>
Fri, 15 Dec 2017 11:44:41 +0000 (12:44 +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 eb9eac65e86e31a9698cb36c2890e9388e47fa47..80ee202407d01527b49bd8bc9e9ab51cbb7431f4 100644 (file)
@@ -841,44 +841,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) {