Use a singleton instead of a global for MojoWaitManyState

R=abarth@chromium.org, jamesr@chromium.org

Review URL: https://codereview.chromium.org/1395043003 .
diff --git a/mojo/dart/embedder/mojo_natives.cc b/mojo/dart/embedder/mojo_natives.cc
index 02eb595..cd9bbd3 100644
--- a/mojo/dart/embedder/mojo_natives.cc
+++ b/mojo/dart/embedder/mojo_natives.cc
@@ -723,21 +723,34 @@
 }
 
 struct MojoWaitManyState {
+  MojoWaitManyState() {}
+
   std::vector<uint32_t> handles;
   std::vector<uint32_t> signals;
   std::vector<uint32_t> out_index;
   std::vector<MojoHandleSignalsState> out_signals;
+
+  static MojoWaitManyState* GetInstance();
+
+ private:
+  DISALLOW_COPY_AND_ASSIGN(MojoWaitManyState);
 };
 
 // This global is safe because it is only accessed by the single handle watcher
 // isolate. If multiple handle watcher isolates are ever needed, it will need
 // to be replicated.
-static MojoWaitManyState handle_watcher_wait_state;
+MojoWaitManyState* MojoWaitManyState::GetInstance() {
+  static MojoWaitManyState* state = new MojoWaitManyState;
+  return state;
+}
 
 void MojoHandleWatcher_GrowStateArrays(Dart_NativeArguments arguments) {
   int64_t new_length;
   CHECK_INTEGER_ARGUMENT(arguments, 0, &new_length, InvalidArgument);
 
+  MojoWaitManyState& handle_watcher_wait_state =
+      *MojoWaitManyState::GetInstance();
+
   handle_watcher_wait_state.handles.resize(new_length);
   handle_watcher_wait_state.signals.resize(new_length);
   handle_watcher_wait_state.out_index.resize(1);
@@ -801,6 +814,9 @@
   CHECK_INTEGER_ARGUMENT(arguments, 0, &handles_len, InvalidArgument);
   CHECK_INTEGER_ARGUMENT(arguments, 1, &deadline, InvalidArgument);
 
+  MojoWaitManyState& handle_watcher_wait_state =
+      *MojoWaitManyState::GetInstance();
+
   uint32_t* handles = handle_watcher_wait_state.handles.data();
   uint32_t* signals = handle_watcher_wait_state.signals.data();
   uint32_t* out_index = handle_watcher_wait_state.out_index.data();