Version 1.4.0-dev.6.7

svn merge -c 36153 https://dart.googlecode.com/svn/branches/bleeding_edge trunk
svn merge -c 36203 https://dart.googlecode.com/svn/branches/bleeding_edge trunk

git-svn-id: http://dart.googlecode.com/svn/trunk@36210 260f80e4-7a28-3924-810f-c04153c831b5
diff --git a/runtime/bin/process.h b/runtime/bin/process.h
index adda36a..154347d 100644
--- a/runtime/bin/process.h
+++ b/runtime/bin/process.h
@@ -138,15 +138,15 @@
 
 class SignalInfo {
  public:
-  SignalInfo(int fd, int signal, SignalInfo* prev = NULL)
+  SignalInfo(int fd, int signal, SignalInfo* next = NULL)
       : fd_(fd),
         signal_(signal),
         // SignalInfo is expected to be created when in a isolate.
         port_(Dart_GetMainPortId()),
-        next_(NULL),
-        prev_(prev) {
-    if (prev_ != NULL) {
-      prev_->next_ = this;
+        next_(next),
+        prev_(NULL) {
+    if (next_ != NULL) {
+      next_->prev_ = this;
     }
   }
 
diff --git a/runtime/bin/process_android.cc b/runtime/bin/process_android.cc
index c13aa98..a2e6aa2 100644
--- a/runtime/bin/process_android.cc
+++ b/runtime/bin/process_android.cc
@@ -710,11 +710,7 @@
       return -1;
     }
   }
-  if (signal_handlers == NULL) {
-    signal_handlers = new SignalInfo(fds[1], signal);
-  } else {
-    new SignalInfo(fds[1], signal, signal_handlers);
-  }
+  signal_handlers = new SignalInfo(fds[1], signal, signal_handlers);
   return fds[0];
 }
 
diff --git a/runtime/bin/process_linux.cc b/runtime/bin/process_linux.cc
index ef0927a..75e5126 100644
--- a/runtime/bin/process_linux.cc
+++ b/runtime/bin/process_linux.cc
@@ -703,11 +703,7 @@
       return -1;
     }
   }
-  if (signal_handlers == NULL) {
-    signal_handlers = new SignalInfo(fds[1], signal);
-  } else {
-    new SignalInfo(fds[1], signal, signal_handlers);
-  }
+  signal_handlers = new SignalInfo(fds[1], signal, signal_handlers);
   return fds[0];
 }
 
diff --git a/runtime/bin/process_macos.cc b/runtime/bin/process_macos.cc
index e84b115..5c2dcb2 100644
--- a/runtime/bin/process_macos.cc
+++ b/runtime/bin/process_macos.cc
@@ -756,11 +756,7 @@
       return -1;
     }
   }
-  if (signal_handlers == NULL) {
-    signal_handlers = new SignalInfo(fds[1], signal);
-  } else {
-    new SignalInfo(fds[1], signal, signal_handlers);
-  }
+  signal_handlers = new SignalInfo(fds[1], signal, signal_handlers);
   return fds[0];
 }
 
diff --git a/runtime/bin/process_win.cc b/runtime/bin/process_win.cc
index 3875b4f..56d38be 100644
--- a/runtime/bin/process_win.cc
+++ b/runtime/bin/process_win.cc
@@ -920,10 +920,8 @@
       SetLastError(error_code);
       return -1;
     }
-    signal_handlers = new SignalInfo(write_fd, signal);
-  } else {
-    new SignalInfo(write_fd, signal, signal_handlers);
   }
+  signal_handlers = new SignalInfo(write_fd, signal, signal_handlers);
   return reinterpret_cast<intptr_t>(new FileHandle(fds[kReadHandle]));
 }
 
diff --git a/tests/standalone/io/signal_test_script.dart b/tests/standalone/io/signal_test_script.dart
index 02b2c25..07f4c03 100644
--- a/tests/standalone/io/signal_test_script.dart
+++ b/tests/standalone/io/signal_test_script.dart
@@ -6,22 +6,24 @@
 import "dart:async";
 
 void main(args) {
-  var signal;
   // This process should die if it never receives a signal.
   var timeout = new Timer(new Duration(seconds: 25), () => exit(1));
-  switch (args[0]) {
-    case 'SIGHUP': signal = ProcessSignal.SIGHUP; break;
-    case 'SIGINT': signal = ProcessSignal.SIGINT; break;
-    case 'SIGTERM': signal = ProcessSignal.SIGTERM; break;
-    case 'SIGUSR1': signal = ProcessSignal.SIGUSR1; break;
-    case 'SIGUSR2': signal = ProcessSignal.SIGUSR2; break;
-    case 'SIGWINCH': signal = ProcessSignal.SIGWINCH; break;
+  for (var arg in args) {
+    var signal;
+    switch (arg) {
+      case 'SIGHUP': signal = ProcessSignal.SIGHUP; break;
+      case 'SIGINT': signal = ProcessSignal.SIGINT; break;
+      case 'SIGTERM': signal = ProcessSignal.SIGTERM; break;
+      case 'SIGUSR1': signal = ProcessSignal.SIGUSR1; break;
+      case 'SIGUSR2': signal = ProcessSignal.SIGUSR2; break;
+      case 'SIGWINCH': signal = ProcessSignal.SIGWINCH; break;
+    }
+    signal.watch().first.then((s) {
+      if (signal != s) exit(1);
+      if (signal.toString() != arg) exit(1);
+      print(signal);
+      exit(0);
+    });
   }
-  signal.watch().first.then((s) {
-    if (signal != s) exit(1);
-    if (signal.toString() != args[0]) exit(1);
-    print('got signal');
-    timeout.cancel();
-  });
   print("ready");
 }
diff --git a/tests/standalone/io/signals_test.dart b/tests/standalone/io/signals_test.dart
index d73b01a..a811208 100644
--- a/tests/standalone/io/signals_test.dart
+++ b/tests/standalone/io/signals_test.dart
@@ -60,7 +60,7 @@
             process.kill(signal);
           }
         }, onDone: () {
-          Expect.equals('ready\ngot signal\n', output);
+          Expect.equals('ready\n$signal\n', output);
         });
       process.exitCode.then((exitCode) {
         Expect.equals(0, exitCode);
@@ -69,6 +69,34 @@
     });
 }
 
+void testMultipleSignals(List<ProcessSignal> signals) {
+  for (var signal in signals) {
+    asyncStart();
+    Process.start(Platform.executable,
+        [Platform.script.resolve('signal_test_script.dart').toFilePath()]
+            ..addAll(signals.map((s) => s.toString())))
+      .then((process) {
+        process.stdin.close();
+        process.stderr.drain();
+
+        var output = "";
+        process.stdout.transform(UTF8.decoder)
+          .listen((str) {
+            output += str;
+            if (output == 'ready\n') {
+              process.kill(signal);
+            }
+          }, onDone: () {
+            Expect.equals('ready\n$signal\n', output);
+          });
+        process.exitCode.then((exitCode) {
+          Expect.equals(0, exitCode);
+          asyncEnd();
+        });
+      });
+  }
+}
+
 
 void testListenCancel() {
   for (int i = 0; i < 10; i++) {
@@ -95,4 +123,12 @@
   testSignal(ProcessSignal.SIGUSR1);
   testSignal(ProcessSignal.SIGUSR2);
   testSignal(ProcessSignal.SIGWINCH);
+
+  testMultipleSignals([
+      ProcessSignal.SIGHUP,
+      ProcessSignal.SIGINT,
+      ProcessSignal.SIGTERM,
+      ProcessSignal.SIGUSR1,
+      ProcessSignal.SIGUSR2,
+      ProcessSignal.SIGWINCH]);
 }
diff --git a/tools/VERSION b/tools/VERSION
index 637a721..5cf5da2 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -28,4 +28,4 @@
 MINOR 4
 PATCH 0
 PRERELEASE 6
-PRERELEASE_PATCH 6
+PRERELEASE_PATCH 7