Add Mojo{Set,Get}DataPipeConsumerOptions() to the NaCl system thunks.

Also actually add them properly to the native system thunks.

R=vardhan@google.com
BUG=#442

Review URL: https://codereview.chromium.org/1859123003 .
diff --git a/mojo/edk/embedder/system_impl_private_entrypoints.cc b/mojo/edk/embedder/system_impl_private_entrypoints.cc
index 2e6d380..0e62599 100644
--- a/mojo/edk/embedder/system_impl_private_entrypoints.cc
+++ b/mojo/edk/embedder/system_impl_private_entrypoints.cc
@@ -193,6 +193,27 @@
   return core->EndWriteData(data_pipe_producer_handle, num_elements_written);
 }
 
+MojoResult MojoSystemImplSetDataPipeConsumerOptions(
+    MojoSystemImpl system,
+    MojoHandle data_pipe_consumer_handle,
+    const struct MojoDataPipeConsumerOptions* options) {
+  mojo::system::Core* core = static_cast<mojo::system::Core*>(system);
+  DCHECK(core);
+  return core->SetDataPipeConsumerOptions(data_pipe_consumer_handle,
+                                          MakeUserPointer(options));
+}
+
+MojoResult MojoSystemImplGetDataPipeConsumerOptions(
+    MojoSystemImpl system,
+    MojoHandle data_pipe_consumer_handle,
+    struct MojoDataPipeConsumerOptions* options,
+    uint32_t options_num_bytes) {
+  mojo::system::Core* core = static_cast<mojo::system::Core*>(system);
+  DCHECK(core);
+  return core->GetDataPipeConsumerOptions(
+      data_pipe_consumer_handle, MakeUserPointer(options), options_num_bytes);
+}
+
 MojoResult MojoSystemImplReadData(MojoSystemImpl system,
                                   MojoHandle data_pipe_consumer_handle,
                                   void* elements,
diff --git a/mojo/nacl/nonsfi/irt_mojo_nonsfi.cc b/mojo/nacl/nonsfi/irt_mojo_nonsfi.cc
index 4f184d7..6ae5c54 100644
--- a/mojo/nacl/nonsfi/irt_mojo_nonsfi.cc
+++ b/mojo/nacl/nonsfi/irt_mojo_nonsfi.cc
@@ -33,6 +33,8 @@
     MojoWriteData,
     MojoBeginWriteData,
     MojoEndWriteData,
+    MojoSetDataPipeConsumerOptions,
+    MojoGetDataPipeConsumerOptions,
     MojoReadData,
     MojoBeginReadData,
     MojoEndReadData,
diff --git a/mojo/nacl/sfi/nacl_bindings/mojo_irt.c b/mojo/nacl/sfi/nacl_bindings/mojo_irt.c
index 8fbc1c5..9c451a6 100644
--- a/mojo/nacl/sfi/nacl_bindings/mojo_irt.c
+++ b/mojo/nacl/sfi/nacl_bindings/mojo_irt.c
@@ -214,6 +214,34 @@
   return result;
 };
 
+static MojoResult irt_MojoSetDataPipeConsumerOptions(
+    MojoHandle data_pipe_consumer_handle,
+    const struct MojoDataPipeConsumerOptions* options) {
+  uint32_t params[4];
+  MojoResult result = MOJO_RESULT_INVALID_ARGUMENT;
+  params[0] = 12;
+  params[1] = (uint32_t)(&data_pipe_consumer_handle);
+  params[2] = (uint32_t)(options);
+  params[3] = (uint32_t)(&result);
+  DoMojoCall(params, sizeof(params));
+  return result;
+};
+
+static MojoResult irt_MojoGetDataPipeConsumerOptions(
+    MojoHandle data_pipe_consumer_handle,
+    struct MojoDataPipeConsumerOptions* options,
+    uint32_t options_num_bytes) {
+  uint32_t params[5];
+  MojoResult result = MOJO_RESULT_INVALID_ARGUMENT;
+  params[0] = 13;
+  params[1] = (uint32_t)(&data_pipe_consumer_handle);
+  params[2] = (uint32_t)(options);
+  params[3] = (uint32_t)(&options_num_bytes);
+  params[4] = (uint32_t)(&result);
+  DoMojoCall(params, sizeof(params));
+  return result;
+};
+
 static MojoResult irt_MojoReadData(
     MojoHandle data_pipe_consumer_handle,
     void* elements,
@@ -221,7 +249,7 @@
     MojoReadDataFlags flags) {
   uint32_t params[6];
   MojoResult result = MOJO_RESULT_INVALID_ARGUMENT;
-  params[0] = 12;
+  params[0] = 14;
   params[1] = (uint32_t)(&data_pipe_consumer_handle);
   params[2] = (uint32_t)(elements);
   params[3] = (uint32_t)(num_bytes);
@@ -238,7 +266,7 @@
     MojoReadDataFlags flags) {
   uint32_t params[6];
   MojoResult result = MOJO_RESULT_INVALID_ARGUMENT;
-  params[0] = 13;
+  params[0] = 15;
   params[1] = (uint32_t)(&data_pipe_consumer_handle);
   params[2] = (uint32_t)(buffer);
   params[3] = (uint32_t)(buffer_num_bytes);
@@ -253,7 +281,7 @@
     uint32_t num_bytes_read) {
   uint32_t params[4];
   MojoResult result = MOJO_RESULT_INVALID_ARGUMENT;
-  params[0] = 14;
+  params[0] = 16;
   params[1] = (uint32_t)(&data_pipe_consumer_handle);
   params[2] = (uint32_t)(&num_bytes_read);
   params[3] = (uint32_t)(&result);
@@ -267,7 +295,7 @@
     MojoHandle* shared_buffer_handle) {
   uint32_t params[5];
   MojoResult result = MOJO_RESULT_INVALID_ARGUMENT;
-  params[0] = 15;
+  params[0] = 17;
   params[1] = (uint32_t)(options);
   params[2] = (uint32_t)(&num_bytes);
   params[3] = (uint32_t)(shared_buffer_handle);
@@ -282,7 +310,7 @@
     MojoHandle* new_buffer_handle) {
   uint32_t params[5];
   MojoResult result = MOJO_RESULT_INVALID_ARGUMENT;
-  params[0] = 16;
+  params[0] = 18;
   params[1] = (uint32_t)(&buffer_handle);
   params[2] = (uint32_t)(options);
   params[3] = (uint32_t)(new_buffer_handle);
@@ -297,7 +325,7 @@
     uint32_t info_num_bytes) {
   uint32_t params[5];
   MojoResult result = MOJO_RESULT_INVALID_ARGUMENT;
-  params[0] = 17;
+  params[0] = 19;
   params[1] = (uint32_t)(&buffer_handle);
   params[2] = (uint32_t)(info);
   params[3] = (uint32_t)(&info_num_bytes);
@@ -314,7 +342,7 @@
     MojoMapBufferFlags flags) {
   uint32_t params[7];
   MojoResult result = MOJO_RESULT_INVALID_ARGUMENT;
-  params[0] = 18;
+  params[0] = 20;
   params[1] = (uint32_t)(&buffer_handle);
   params[2] = (uint32_t)(&offset);
   params[3] = (uint32_t)(&num_bytes);
@@ -328,7 +356,7 @@
 static MojoResult irt_MojoUnmapBuffer(void* buffer) {
   uint32_t params[3];
   MojoResult result = MOJO_RESULT_INVALID_ARGUMENT;
-  params[0] = 19;
+  params[0] = 21;
   params[1] = (uint32_t)(&buffer);
   params[2] = (uint32_t)(&result);
   DoMojoCall(params, sizeof(params));
@@ -348,6 +376,8 @@
   &irt_MojoWriteData,
   &irt_MojoBeginWriteData,
   &irt_MojoEndWriteData,
+  &irt_MojoSetDataPipeConsumerOptions,
+  &irt_MojoGetDataPipeConsumerOptions,
   &irt_MojoReadData,
   &irt_MojoBeginReadData,
   &irt_MojoEndReadData,
diff --git a/mojo/nacl/sfi/nacl_bindings/mojo_syscall.cc b/mojo/nacl/sfi/nacl_bindings/mojo_syscall.cc
index b31a478..ebd243c 100644
--- a/mojo/nacl/sfi/nacl_bindings/mojo_syscall.cc
+++ b/mojo/nacl/sfi/nacl_bindings/mojo_syscall.cc
@@ -509,6 +509,76 @@
       return 0;
     }
     case 12: {
+      if (num_params != 4) {
+        return -1;
+      }
+      MojoHandle data_pipe_consumer_handle_value;
+      const struct MojoDataPipeConsumerOptions* options;
+      MojoResult volatile* result_ptr;
+      MojoResult result_value;
+      {
+        ScopedCopyLock copy_lock(nap);
+        if (!ConvertScalarInput(nap, params[1],
+                                &data_pipe_consumer_handle_value)) {
+          return -1;
+        }
+        if (!ConvertExtensibleStructInput(nap, params[2], true, &options)) {
+          return -1;
+        }
+        if (!ConvertScalarOutput(nap, params[3], false, &result_ptr)) {
+          return -1;
+        }
+      }
+
+      result_value = MojoSystemImplSetDataPipeConsumerOptions(
+          g_mojo_system, data_pipe_consumer_handle_value, options);
+
+      {
+        ScopedCopyLock copy_lock(nap);
+        *result_ptr = result_value;
+      }
+
+      return 0;
+    }
+    case 13: {
+      if (num_params != 5) {
+        return -1;
+      }
+      MojoHandle data_pipe_consumer_handle_value;
+      struct MojoDataPipeConsumerOptions* options;
+      uint32_t options_num_bytes_value;
+      MojoResult volatile* result_ptr;
+      MojoResult result_value;
+      {
+        ScopedCopyLock copy_lock(nap);
+        if (!ConvertScalarInput(nap, params[1],
+                                &data_pipe_consumer_handle_value)) {
+          return -1;
+        }
+        if (!ConvertScalarInput(nap, params[3], &options_num_bytes_value)) {
+          return -1;
+        }
+        if (!ConvertScalarOutput(nap, params[4], false, &result_ptr)) {
+          return -1;
+        }
+        if (!ConvertArray(nap, params[2], options_num_bytes_value, 1, false,
+                          &options)) {
+          return -1;
+        }
+      }
+
+      result_value = MojoSystemImplGetDataPipeConsumerOptions(
+          g_mojo_system, data_pipe_consumer_handle_value, options,
+          options_num_bytes_value);
+
+      {
+        ScopedCopyLock copy_lock(nap);
+        *result_ptr = result_value;
+      }
+
+      return 0;
+    }
+    case 14: {
       if (num_params != 6) {
         return -1;
       }
@@ -553,10 +623,10 @@
 
       return 0;
     }
-    case 13:
+    case 15:
       fprintf(stderr, "MojoBeginReadData not implemented\n");
       return -1;
-    case 14: {
+    case 16: {
       if (num_params != 4) {
         return -1;
       }
@@ -588,7 +658,7 @@
 
       return 0;
     }
-    case 15: {
+    case 17: {
       if (num_params != 5) {
         return -1;
       }
@@ -627,7 +697,7 @@
 
       return 0;
     }
-    case 16: {
+    case 18: {
       if (num_params != 5) {
         return -1;
       }
@@ -666,7 +736,7 @@
 
       return 0;
     }
-    case 17: {
+    case 19: {
       if (num_params != 5) {
         return -1;
       }
@@ -702,10 +772,10 @@
 
       return 0;
     }
-    case 18:
+    case 20:
       fprintf(stderr, "MojoMapBuffer not implemented\n");
       return -1;
-    case 19:
+    case 21:
       fprintf(stderr, "MojoUnmapBuffer not implemented\n");
       return -1;
   }
diff --git a/mojo/nacl/sfi/nacl_bindings_generator/interface.py b/mojo/nacl/sfi/nacl_bindings_generator/interface.py
index 1c97be1..00f2490 100644
--- a/mojo/nacl/sfi/nacl_bindings_generator/interface.py
+++ b/mojo/nacl/sfi/nacl_bindings_generator/interface.py
@@ -82,6 +82,17 @@
   f.Param('data_pipe_producer_handle').In('MojoHandle')
   f.Param('num_bytes_written').In('uint32_t')
 
+  f = mojo.Func('MojoSetDataPipeConsumerOptions', 'MojoResult')
+  f.Param('data_pipe_consumer_handle').In('MojoHandle')
+  p = f.Param('options')
+  p.InExtensibleStruct('MojoDataPipeConsumerOptions').Optional()
+
+  f = mojo.Func('MojoGetDataPipeConsumerOptions', 'MojoResult')
+  f.Param('data_pipe_consumer_handle').In('MojoHandle')
+  p = f.Param('options')
+  p.OutExtensibleStruct('MojoDataPipeConsumerOptions', 'options_num_bytes')
+  f.Param('options_num_bytes').In('uint32_t')
+
   f = mojo.Func('MojoReadData', 'MojoResult')
   f.Param('data_pipe_consumer_handle').In('MojoHandle')
   f.Param('elements').OutArray('void', 'num_bytes')
diff --git a/mojo/public/c/system/tests/core_unittest.cc b/mojo/public/c/system/tests/core_unittest.cc
index b64f14b..f718633 100644
--- a/mojo/public/c/system/tests/core_unittest.cc
+++ b/mojo/public/c/system/tests/core_unittest.cc
@@ -74,8 +74,6 @@
   EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT,
             MojoEndWriteData(MOJO_HANDLE_INVALID, 1u));
   buffer_size = static_cast<uint32_t>(sizeof(buffer));
-// TODO(vtl): Enable once I've added support for NaCl.
-#ifndef __native_client__
   MojoDataPipeConsumerOptions dpc_options = {
       sizeof(MojoDataPipeConsumerOptions), 0u};
   EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT,
@@ -84,7 +82,6 @@
             MojoGetDataPipeConsumerOptions(
                 MOJO_HANDLE_INVALID, &dpc_options,
                 static_cast<uint32_t>(sizeof(dpc_options))));
-#endif
   EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT,
             MojoReadData(MOJO_HANDLE_INVALID, buffer, &buffer_size,
                          MOJO_READ_DATA_FLAG_NONE));
@@ -318,8 +315,6 @@
   // the producer never-writable?
 }
 
-// TODO(vtl): Enable once I've added support for NaCl.
-#ifndef __native_client__
 TEST(CoreTest, DataPipeReadThreshold) {
   MojoHandle hp = MOJO_HANDLE_INVALID;
   MojoHandle hc = MOJO_HANDLE_INVALID;
@@ -419,7 +414,6 @@
   EXPECT_EQ(MOJO_RESULT_OK, MojoClose(hp));
   EXPECT_EQ(MOJO_RESULT_OK, MojoClose(hc));
 }
-#endif
 
 // TODO(ncbray): enable this test once NaCl supports the corresponding APIs.
 #ifdef __native_client__
diff --git a/mojo/public/platform/nacl/libmojo.cc b/mojo/public/platform/nacl/libmojo.cc
index bb96760..bcd9cf3 100644
--- a/mojo/public/platform/nacl/libmojo.cc
+++ b/mojo/public/platform/nacl/libmojo.cc
@@ -154,6 +154,27 @@
                                     num_bytes_written);
 }
 
+MojoResult MojoSetDataPipeConsumerOptions(
+    MojoHandle data_pipe_consumer_handle,
+    const struct MojoDataPipeConsumerOptions* options) {
+  struct nacl_irt_mojo* irt_mojo = get_irt_mojo();
+  if (!irt_mojo)
+    abort();
+  return irt_mojo->MojoSetDataPipeConsumerOptions(data_pipe_consumer_handle,
+                                                  options);
+}
+
+MojoResult MojoGetDataPipeConsumerOptions(
+    MojoHandle data_pipe_consumer_handle,
+    struct MojoDataPipeConsumerOptions* options,
+    uint32_t options_num_bytes) {
+  struct nacl_irt_mojo* irt_mojo = get_irt_mojo();
+  if (!irt_mojo)
+    abort();
+  return irt_mojo->MojoGetDataPipeConsumerOptions(data_pipe_consumer_handle,
+                                                  options, options_num_bytes);
+}
+
 MojoResult MojoReadData(MojoHandle data_pipe_consumer_handle,
                         void* elements,
                         uint32_t* num_bytes,
diff --git a/mojo/public/platform/nacl/mojo_irt.h b/mojo/public/platform/nacl/mojo_irt.h
index 4d23403..92ad744 100644
--- a/mojo/public/platform/nacl/mojo_irt.h
+++ b/mojo/public/platform/nacl/mojo_irt.h
@@ -61,6 +61,13 @@
                                    MojoWriteDataFlags flags);
   MojoResult (*MojoEndWriteData)(MojoHandle data_pipe_producer_handle,
                                  uint32_t num_bytes_written);
+  MojoResult (*MojoSetDataPipeConsumerOptions)(
+      MojoHandle data_pipe_consumer_handle,
+      const struct MojoDataPipeConsumerOptions* options);
+  MojoResult (*MojoGetDataPipeConsumerOptions)(
+      MojoHandle data_pipe_consumer_handle,
+      struct MojoDataPipeConsumerOptions* options,
+      uint32_t options_num_bytes);
   MojoResult (*MojoReadData)(MojoHandle data_pipe_consumer_handle,
                              void* elements,
                              uint32_t* num_bytes,
diff --git a/mojo/public/platform/native/system_impl_private.h b/mojo/public/platform/native/system_impl_private.h
index 0540cca..3ebe2c1 100644
--- a/mojo/public/platform/native/system_impl_private.h
+++ b/mojo/public/platform/native/system_impl_private.h
@@ -101,6 +101,15 @@
 MojoResult MojoSystemImplEndWriteData(MojoSystemImpl system,
                                       MojoHandle data_pipe_producer_handle,
                                       uint32_t num_elements_written);
+MojoResult MojoSystemImplSetDataPipeConsumerOptions(
+    MojoSystemImpl system,
+    MojoHandle data_pipe_consumer_handle,
+    const struct MojoDataPipeConsumerOptions* options);
+MojoResult MojoSystemImplGetDataPipeConsumerOptions(
+    MojoSystemImpl system,
+    MojoHandle data_pipe_consumer_handle,
+    struct MojoDataPipeConsumerOptions* options,
+    uint32_t options_num_bytes);
 MojoResult MojoSystemImplReadData(MojoSystemImpl system,
                                   MojoHandle data_pipe_consumer_handle,
                                   void* elements,
diff --git a/mojo/public/platform/native/system_impl_private_thunks.c b/mojo/public/platform/native/system_impl_private_thunks.c
index 61a945f..3129f5e 100644
--- a/mojo/public/platform/native/system_impl_private_thunks.c
+++ b/mojo/public/platform/native/system_impl_private_thunks.c
@@ -138,6 +138,25 @@
                                            num_elements_written);
 }
 
+MojoResult MojoSystemImplSetDataPipeConsumerOptions(
+    MojoSystemImpl system,
+    MojoHandle data_pipe_consumer_handle,
+    const struct MojoDataPipeConsumerOptions* options) {
+  assert(g_system_impl_thunks.SetDataPipeConsumerOptions);
+  return g_system_impl_thunks.SetDataPipeConsumerOptions(
+      system, data_pipe_consumer_handle, options);
+}
+
+MojoResult MojoSystemImplGetDataPipeConsumerOptions(
+    MojoSystemImpl system,
+    MojoHandle data_pipe_consumer_handle,
+    struct MojoDataPipeConsumerOptions* options,
+    uint32_t options_num_bytes) {
+  assert(g_system_impl_thunks.GetDataPipeConsumerOptions);
+  return g_system_impl_thunks.GetDataPipeConsumerOptions(
+      system, data_pipe_consumer_handle, options, options_num_bytes);
+}
+
 MojoResult MojoSystemImplReadData(MojoSystemImpl system,
                                   MojoHandle data_pipe_consumer_handle,
                                   void* elements,
diff --git a/mojo/public/platform/native/system_impl_private_thunks.h b/mojo/public/platform/native/system_impl_private_thunks.h
index 565bc6d..09d0ce0 100644
--- a/mojo/public/platform/native/system_impl_private_thunks.h
+++ b/mojo/public/platform/native/system_impl_private_thunks.h
@@ -82,6 +82,15 @@
   MojoResult (*EndWriteData)(MojoSystemImpl system,
                              MojoHandle data_pipe_producer_handle,
                              uint32_t num_elements_written);
+  MojoResult (*SetDataPipeConsumerOptions)(
+      MojoSystemImpl system,
+      MojoHandle data_pipe_consumer_handle,
+      const struct MojoDataPipeConsumerOptions* options);
+  MojoResult (*GetDataPipeConsumerOptions)(
+      MojoSystemImpl system,
+      MojoHandle data_pipe_consumer_handle,
+      struct MojoDataPipeConsumerOptions* options,
+      uint32_t options_num_bytes);
   MojoResult (*ReadData)(MojoSystemImpl system,
                          MojoHandle data_pipe_consumer_handle,
                          void* elements,
@@ -144,6 +153,8 @@
       MojoSystemImplWriteData,
       MojoSystemImplBeginWriteData,
       MojoSystemImplEndWriteData,
+      MojoSystemImplSetDataPipeConsumerOptions,
+      MojoSystemImplGetDataPipeConsumerOptions,
       MojoSystemImplReadData,
       MojoSystemImplBeginReadData,
       MojoSystemImplEndReadData,
diff --git a/mojo/public/platform/native/system_thunks.c b/mojo/public/platform/native/system_thunks.c
index 467f8e5..8c5a4a8 100644
--- a/mojo/public/platform/native/system_thunks.c
+++ b/mojo/public/platform/native/system_thunks.c
@@ -102,6 +102,23 @@
   return g_thunks.EndWriteData(data_pipe_producer_handle, num_elements_written);
 }
 
+MojoResult MojoSetDataPipeConsumerOptions(
+    MojoHandle data_pipe_consumer_handle,
+    const struct MojoDataPipeConsumerOptions* options) {
+  assert(g_thunks.SetDataPipeConsumerOptions);
+  return g_thunks.SetDataPipeConsumerOptions(data_pipe_consumer_handle,
+                                             options);
+}
+
+MojoResult MojoGetDataPipeConsumerOptions(
+    MojoHandle data_pipe_consumer_handle,
+    struct MojoDataPipeConsumerOptions* options,
+    uint32_t options_num_bytes) {
+  assert(g_thunks.GetDataPipeConsumerOptions);
+  return g_thunks.GetDataPipeConsumerOptions(data_pipe_consumer_handle,
+                                             options, options_num_bytes);
+}
+
 MojoResult MojoReadData(MojoHandle data_pipe_consumer_handle,
                         void* elements,
                         uint32_t* num_elements,