Uses a lock around Popens() to prevent a deadlock in Python.

Please see crbug.com/323843 for more details.

BUG=chromium:323843
TEST=Run the audiovideo_CRASFormatConversion on parrot

Change-Id: I12b9450c937acf74888ed995f25f405c4f15a705
Reviewed-on: https://chromium-review.googlesource.com/178373
Reviewed-by: Owen Lin <owenlin@chromium.org>
Tested-by: Owen Lin <owenlin@chromium.org>
Commit-Queue: Owen Lin <owenlin@chromium.org>
diff --git a/client/cros/audio/cmd_utils.py b/client/cros/audio/cmd_utils.py
index ca5858a..03c0c14 100644
--- a/client/cros/audio/cmd_utils.py
+++ b/client/cros/audio/cmd_utils.py
@@ -6,6 +6,9 @@
 import logging
 import pipes
 import subprocess
+import threading
+
+_popen_lock = threading.Lock()
 
 
 def wait_and_check_returncode(*popens):
@@ -40,7 +43,9 @@
     '''Returns a Popen object just as subprocess.Popen does but with the
     executed command stored in Popen.command.
     '''
-    ps = subprocess.Popen(*args, **kargs)
+    # The lock is required for http://crbug.com/323843.
+    with _popen_lock:
+        ps = subprocess.Popen(*args, **kargs)
     the_args = args[0] if len(args) > 0 else kargs['args']
     ps.command = ' '.join(pipes.quote(x) for x in the_args)
     logging.info('Running(%d): %s', ps.pid, ps.command)