This is an automated email from the ASF dual-hosted git repository.

asekretenko pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/mesos.git


The following commit(s) were added to refs/heads/master by this push:
     new a2c5cb8  Consolidated protobuf construction by the JNI scheduler 
driver.
a2c5cb8 is described below

commit a2c5cb8d571dc0b967b469263ce236f977e11f4c
Author: Andrei Sekretenko <asekrete...@mesosphere.com>
AuthorDate: Tue Sep 15 18:20:44 2020 +0200

    Consolidated protobuf construction by the JNI scheduler driver.
    
    This patch converts the copy-pasted internals of numerous
    `construct<>()` specializations for protobufs into a single
    template.
    
    Review: https://reviews.apache.org/r/72875
---
 src/java/jni/construct.cpp | 276 ++++++---------------------------------------
 1 file changed, 36 insertions(+), 240 deletions(-)

diff --git a/src/java/jni/construct.cpp b/src/java/jni/construct.cpp
index 8d8f76e..a48ca07 100644
--- a/src/java/jni/construct.cpp
+++ b/src/java/jni/construct.cpp
@@ -52,6 +52,26 @@ T parse(const void* data, int size)
 }
 
 
+template <class TMessage>
+TMessage constructViaProtobufSerialization(JNIEnv* env, jobject jobj)
+{
+  jclass clazz = env->GetObjectClass(jobj);
+
+  // byte[] data = obj.toByteArray();
+  jmethodID toByteArray = env->GetMethodID(clazz, "toByteArray", "()[B");
+
+  jbyteArray jdata = (jbyteArray) env->CallObjectMethod(jobj, toByteArray);
+
+  jbyte* data = env->GetByteArrayElements(jdata, nullptr);
+  jsize length = env->GetArrayLength(jdata);
+
+  TMessage result = parse<TMessage>(data, length);
+
+  env->ReleaseByteArrayElements(jdata, data, 0);
+  return result;
+}
+
+
 bool construct(JNIEnv* env, jboolean jbool)
 {
   return jbool == JNI_TRUE;
@@ -124,168 +144,56 @@ map<string, string> construct(JNIEnv *env, jobject jobj)
 template <>
 FrameworkInfo construct(JNIEnv* env, jobject jobj)
 {
-  jclass clazz = env->GetObjectClass(jobj);
-
-  // byte[] data = obj.toByteArray();
-  jmethodID toByteArray = env->GetMethodID(clazz, "toByteArray", "()[B");
-
-  jbyteArray jdata = (jbyteArray) env->CallObjectMethod(jobj, toByteArray);
-
-  jbyte* data = env->GetByteArrayElements(jdata, nullptr);
-  jsize length = env->GetArrayLength(jdata);
-
-  const FrameworkInfo& framework = parse<FrameworkInfo>(data, length);
-
-  env->ReleaseByteArrayElements(jdata, data, 0);
-
-  return framework;
+  return constructViaProtobufSerialization<FrameworkInfo>(env, jobj);
 }
 
 
 template <>
 Credential construct(JNIEnv* env, jobject jobj)
 {
-  jclass clazz = env->GetObjectClass(jobj);
-
-  // byte[] data = obj.toByteArray();
-  jmethodID toByteArray = env->GetMethodID(clazz, "toByteArray", "()[B");
-
-  jbyteArray jdata = (jbyteArray) env->CallObjectMethod(jobj, toByteArray);
-
-  jbyte* data = env->GetByteArrayElements(jdata, nullptr);
-  jsize length = env->GetArrayLength(jdata);
-
-  const Credential& credential = parse<Credential>(data, length);
-
-  env->ReleaseByteArrayElements(jdata, data, 0);
-
-  return credential;
+  return constructViaProtobufSerialization<Credential>(env, jobj);
 }
 
 
 template <>
 Filters construct(JNIEnv* env, jobject jobj)
 {
-  jclass clazz = env->GetObjectClass(jobj);
-
-  // byte[] data = obj.toByteArray();
-  jmethodID toByteArray = env->GetMethodID(clazz, "toByteArray", "()[B");
-
-  jbyteArray jdata = (jbyteArray) env->CallObjectMethod(jobj, toByteArray);
-
-  jbyte* data = env->GetByteArrayElements(jdata, nullptr);
-  jsize length = env->GetArrayLength(jdata);
-
-  const Filters& filters = parse<Filters>(data, length);
-
-  env->ReleaseByteArrayElements(jdata, data, 0);
-
-  return filters;
+  return constructViaProtobufSerialization<Filters>(env, jobj);
 }
 
 
 template <>
 FrameworkID construct(JNIEnv* env, jobject jobj)
 {
-  jclass clazz = env->GetObjectClass(jobj);
-
-  // byte[] data = obj.toByteArray();
-  jmethodID toByteArray = env->GetMethodID(clazz, "toByteArray", "()[B");
-
-  jbyteArray jdata = (jbyteArray) env->CallObjectMethod(jobj, toByteArray);
-
-  jbyte* data = env->GetByteArrayElements(jdata, nullptr);
-  jsize length = env->GetArrayLength(jdata);
-
-  const FrameworkID& frameworkId = parse<FrameworkID>(data, length);
-
-  env->ReleaseByteArrayElements(jdata, data, 0);
-
-  return frameworkId;
+  return constructViaProtobufSerialization<FrameworkID>(env, jobj);
 }
 
 
 template <>
 ExecutorID construct(JNIEnv* env, jobject jobj)
 {
-  jclass clazz = env->GetObjectClass(jobj);
-
-  // byte[] data = obj.toByteArray();
-  jmethodID toByteArray = env->GetMethodID(clazz, "toByteArray", "()[B");
-
-  jbyteArray jdata = (jbyteArray) env->CallObjectMethod(jobj, toByteArray);
-
-  jbyte* data = env->GetByteArrayElements(jdata, nullptr);
-  jsize length = env->GetArrayLength(jdata);
-
-  const ExecutorID& executorId = parse<ExecutorID>(data, length);
-
-  env->ReleaseByteArrayElements(jdata, data, 0);
-
-  return executorId;
+  return constructViaProtobufSerialization<ExecutorID>(env, jobj);
 }
 
 
 template <>
 TaskID construct(JNIEnv* env, jobject jobj)
 {
-  jclass clazz = env->GetObjectClass(jobj);
-
-  // byte[] data = obj.toByteArray();
-  jmethodID toByteArray = env->GetMethodID(clazz, "toByteArray", "()[B");
-
-  jbyteArray jdata = (jbyteArray) env->CallObjectMethod(jobj, toByteArray);
-
-  jbyte* data = env->GetByteArrayElements(jdata, nullptr);
-  jsize length = env->GetArrayLength(jdata);
-
-  const TaskID& taskId = parse<TaskID>(data, length);
-
-  env->ReleaseByteArrayElements(jdata, data, 0);
-
-  return taskId;
+  return constructViaProtobufSerialization<TaskID>(env, jobj);
 }
 
 
 template <>
 SlaveID construct(JNIEnv* env, jobject jobj)
 {
-  jclass clazz = env->GetObjectClass(jobj);
-
-  // byte[] data = obj.toByteArray();
-  jmethodID toByteArray = env->GetMethodID(clazz, "toByteArray", "()[B");
-
-  jbyteArray jdata = (jbyteArray) env->CallObjectMethod(jobj, toByteArray);
-
-  jbyte* data = env->GetByteArrayElements(jdata, nullptr);
-  jsize length = env->GetArrayLength(jdata);
-
-  const SlaveID& slaveId = parse<SlaveID>(data, length);
-
-  env->ReleaseByteArrayElements(jdata, data, 0);
-
-  return slaveId;
+  return constructViaProtobufSerialization<SlaveID>(env, jobj);
 }
 
 
 template <>
 OfferID construct(JNIEnv* env, jobject jobj)
 {
-  jclass clazz = env->GetObjectClass(jobj);
-
-  // byte[] data = obj.toByteArray();
-  jmethodID toByteArray = env->GetMethodID(clazz, "toByteArray", "()[B");
-
-  jbyteArray jdata = (jbyteArray) env->CallObjectMethod(jobj, toByteArray);
-
-  jbyte* data = env->GetByteArrayElements(jdata, nullptr);
-  jsize length = env->GetArrayLength(jdata);
-
-  const OfferID& offerId = parse<OfferID>(data, length);
-
-  env->ReleaseByteArrayElements(jdata, data, 0);
-
-  return offerId;
+  return constructViaProtobufSerialization<OfferID>(env, jobj);
 }
 
 
@@ -306,166 +214,54 @@ TaskState construct(JNIEnv* env, jobject jobj)
 template <>
 TaskInfo construct(JNIEnv* env, jobject jobj)
 {
-  jclass clazz = env->GetObjectClass(jobj);
-
-  // byte[] data = obj.toByteArray();
-  jmethodID toByteArray = env->GetMethodID(clazz, "toByteArray", "()[B");
-
-  jbyteArray jdata = (jbyteArray) env->CallObjectMethod(jobj, toByteArray);
-
-  jbyte* data = env->GetByteArrayElements(jdata, nullptr);
-  jsize length = env->GetArrayLength(jdata);
-
-  const TaskInfo& task = parse<TaskInfo>(data, length);
-
-  env->ReleaseByteArrayElements(jdata, data, 0);
-
-  return task;
+  return constructViaProtobufSerialization<TaskInfo>(env, jobj);
 }
 
 
 template <>
 TaskStatus construct(JNIEnv* env, jobject jobj)
 {
-  jclass clazz = env->GetObjectClass(jobj);
-
-  // byte[] data = obj.toByteArray();
-  jmethodID toByteArray = env->GetMethodID(clazz, "toByteArray", "()[B");
-
-  jbyteArray jdata = (jbyteArray) env->CallObjectMethod(jobj, toByteArray);
-
-  jbyte* data = env->GetByteArrayElements(jdata, nullptr);
-  jsize length = env->GetArrayLength(jdata);
-
-  const TaskStatus& status = parse<TaskStatus>(data, length);
-
-  env->ReleaseByteArrayElements(jdata, data, 0);
-
-  return status;
+  return constructViaProtobufSerialization<TaskStatus>(env, jobj);
 }
 
 
 template <>
 ExecutorInfo construct(JNIEnv* env, jobject jobj)
 {
-  jclass clazz = env->GetObjectClass(jobj);
-
-  // byte[] data = obj.toByteArray();
-  jmethodID toByteArray = env->GetMethodID(clazz, "toByteArray", "()[B");
-
-  jbyteArray jdata = (jbyteArray) env->CallObjectMethod(jobj, toByteArray);
-
-  jbyte* data = env->GetByteArrayElements(jdata, nullptr);
-  jsize length = env->GetArrayLength(jdata);
-
-  const ExecutorInfo& executor = parse<ExecutorInfo>(data, length);
-
-  env->ReleaseByteArrayElements(jdata, data, 0);
-
-  return executor;
+  return constructViaProtobufSerialization<ExecutorInfo>(env, jobj);
 }
 
 
 template <>
 Request construct(JNIEnv* env, jobject jobj)
 {
-  jclass clazz = env->GetObjectClass(jobj);
-
-  // byte[] data = obj.toByteArray();
-  jmethodID toByteArray = env->GetMethodID(clazz, "toByteArray", "()[B");
-
-  jbyteArray jdata = (jbyteArray) env->CallObjectMethod(jobj, toByteArray);
-
-  jbyte* data = env->GetByteArrayElements(jdata, nullptr);
-  jsize length = env->GetArrayLength(jdata);
-
-  const Request& request = parse<Request>(data, length);
-
-  env->ReleaseByteArrayElements(jdata, data, 0);
-
-  return request;
+  return constructViaProtobufSerialization<Request>(env, jobj);
 }
 
 
 template <>
 Offer::Operation construct(JNIEnv* env, jobject jobj)
 {
-  jclass clazz = env->GetObjectClass(jobj);
-
-  // byte[] data = obj.toByteArray();
-  jmethodID toByteArray = env->GetMethodID(clazz, "toByteArray", "()[B");
-
-  jbyteArray jdata = (jbyteArray) env->CallObjectMethod(jobj, toByteArray);
-
-  jbyte* data = env->GetByteArrayElements(jdata, nullptr);
-  jsize length = env->GetArrayLength(jdata);
-
-  const Offer::Operation& operation = parse<Offer::Operation>(data, length);
-
-  env->ReleaseByteArrayElements(jdata, data, 0);
-
-  return operation;
+  return constructViaProtobufSerialization<Offer::Operation>(env, jobj);
 }
 
 
 template <>
 v1::Credential construct(JNIEnv* env, jobject jobj)
 {
-  jclass clazz = env->GetObjectClass(jobj);
-
-  // byte[] data = obj.toByteArray();
-  jmethodID toByteArray = env->GetMethodID(clazz, "toByteArray", "()[B");
-
-  jbyteArray jdata = (jbyteArray) env->CallObjectMethod(jobj, toByteArray);
-
-  jbyte* data = env->GetByteArrayElements(jdata, nullptr);
-  jsize length = env->GetArrayLength(jdata);
-
-  const v1::Credential& credential = parse<v1::Credential>(data, length);
-
-  env->ReleaseByteArrayElements(jdata, data, 0);
-
-  return credential;
+  return constructViaProtobufSerialization<v1::Credential>(env, jobj);
 }
 
 
 template <>
 v1::FrameworkInfo construct(JNIEnv* env, jobject jobj)
 {
-  jclass clazz = env->GetObjectClass(jobj);
-
-  // byte[] data = obj.toByteArray();
-  jmethodID toByteArray = env->GetMethodID(clazz, "toByteArray", "()[B");
-
-  jbyteArray jdata = (jbyteArray) env->CallObjectMethod(jobj, toByteArray);
-
-  jbyte* data = env->GetByteArrayElements(jdata, nullptr);
-  jsize length = env->GetArrayLength(jdata);
-
-  const v1::FrameworkInfo& framework = parse<v1::FrameworkInfo>(data, length);
-
-  env->ReleaseByteArrayElements(jdata, data, 0);
-
-  return framework;
+  return constructViaProtobufSerialization<v1::FrameworkInfo>(env, jobj);
 }
 
 
 template<>
 v1::scheduler::Call construct(JNIEnv* env, jobject jobj)
 {
-  jclass clazz = env->GetObjectClass(jobj);
-
-  // byte[] data = obj.toByteArray();
-  jmethodID toByteArray = env->GetMethodID(clazz, "toByteArray", "()[B");
-
-  jbyteArray jdata = (jbyteArray) env->CallObjectMethod(jobj, toByteArray);
-
-  jbyte* data = env->GetByteArrayElements(jdata, nullptr);
-  jsize length = env->GetArrayLength(jdata);
-
-  const v1::scheduler::Call& call = parse<v1::scheduler::Call>(data, length);
-
-  env->ReleaseByteArrayElements(jdata, data, 0);
-
-  return call;
+  return constructViaProtobufSerialization<v1::scheduler::Call>(env, jobj);
 }

Reply via email to