You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@mnemonic.apache.org by ga...@apache.org on 2016/07/05 16:06:37 UTC

incubator-mnemonic git commit: MNEMONIC-71: Create a native data struct for ValueInfo with a conversion function

Repository: incubator-mnemonic
Updated Branches:
  refs/heads/master 750846d1c -> a39d10970


MNEMONIC-71: Create a native data struct for ValueInfo with a conversion function


Project: http://git-wip-us.apache.org/repos/asf/incubator-mnemonic/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-mnemonic/commit/a39d1097
Tree: http://git-wip-us.apache.org/repos/asf/incubator-mnemonic/tree/a39d1097
Diff: http://git-wip-us.apache.org/repos/asf/incubator-mnemonic/diff/a39d1097

Branch: refs/heads/master
Commit: a39d1097095693c8e5bda0422ce3b459538ffabe
Parents: 750846d
Author: Wang, Gang(Gary) <ga...@intel.com>
Authored: Fri Jul 1 09:28:09 2016 -0700
Committer: Wang, Gang(Gary) <ga...@intel.com>
Committed: Sat Jul 2 18:29:15 2016 -0700

----------------------------------------------------------------------
 .../src/main/native/common.c                    | 221 +++++++++++++++++++
 .../src/main/native/common.h                    |  29 +++
 ...computingservice_internal_PrintServiceImpl.c |  31 +--
 .../DurableNodeValueNGPrintTest.java            |   4 +-
 .../service/computingservice/ValueInfo.java     |   2 +-
 5 files changed, 260 insertions(+), 27 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-mnemonic/blob/a39d1097/mnemonic-computing-services/mnemonic-utilities-service/src/main/native/common.c
----------------------------------------------------------------------
diff --git a/mnemonic-computing-services/mnemonic-utilities-service/src/main/native/common.c b/mnemonic-computing-services/mnemonic-utilities-service/src/main/native/common.c
index 143743e..fc63ccc 100644
--- a/mnemonic-computing-services/mnemonic-utilities-service/src/main/native/common.c
+++ b/mnemonic-computing-services/mnemonic-utilities-service/src/main/native/common.c
@@ -18,6 +18,9 @@
 
 #include <common.h>
 
+#define TRANSTABLEITEMLEN 3
+#define FRAMESITEMLEN 4
+
 /******************************************************************************
  ** Generally-useful functions for JNI programming.
  *****************************************************************************/
@@ -47,3 +50,221 @@ jlong addr_to_java(void* p) {
   return (long) (uintptr_t) p;
 }
 
+void destructNValInfo(struct NValueInfo *nvinfo) {
+  if (NULL != nvinfo) {
+    if (NULL != nvinfo->transtable) {
+      free(nvinfo->transtable);
+    }
+    if (NULL != nvinfo->frames) {
+      free(nvinfo->frames);
+    }
+    free(nvinfo);
+  }
+}
+
+struct NValueInfo *constructNValInfo(JNIEnv* env, jobject vinfoobj) {
+  struct NValueInfo *ret = NULL;
+
+  static int inited = 0;
+  static jclass vinfocls = NULL, dutenum = NULL;
+  static jfieldID handler_fid = NULL, transtable_fid = NULL, frames_fid = NULL, dtype_fid = NULL;
+  static jmethodID getval_mtd = NULL;
+
+  if (NULL == vinfoobj) {
+    return NULL;
+  }
+
+  if (0 == inited) {
+    inited = 1;
+    vinfocls = (*env)->FindClass(env, "org/apache/mnemonic/service/computingservice/ValueInfo");
+    dutenum = (*env)->FindClass(env, "org/apache/mnemonic/DurableType");
+    if (NULL != vinfocls && NULL != dutenum) {
+      handler_fid = (*env)->GetFieldID(env, vinfocls, "handler", "J");
+      transtable_fid = (*env)->GetFieldID(env, vinfocls, "transtable", "[[J");
+      frames_fid = (*env)->GetFieldID(env, vinfocls, "frames", "[[J");
+      dtype_fid = (*env)->GetFieldID(env, vinfocls, "dtype",
+          "Lorg/apache/mnemonic/DurableType;");
+      getval_mtd = (*env)->GetMethodID(env, dutenum, "getValue", "()I");
+    } else {
+      return NULL;
+    }
+  }
+
+  if (NULL == vinfocls || NULL == handler_fid ||
+      NULL == transtable_fid || NULL == frames_fid ||
+      NULL == dtype_fid || NULL == getval_mtd) {
+    return NULL;
+  }
+
+  ret = (struct NValueInfo *)calloc(1, sizeof(struct NValueInfo));
+  if (NULL != ret) {
+    jlongArray itmarr;
+    jlong *itms;
+    jsize itmarrlen, i;
+    ret->handler = (*env)->GetLongField(env, vinfoobj, handler_fid);
+    jobject dutobj = (*env)->GetObjectField(env, vinfoobj, dtype_fid);
+    ret->dtype = (*env)->CallIntMethod(env, dutobj, getval_mtd);
+
+    jobjectArray tbarr = (*env)->GetObjectField(env, vinfoobj, transtable_fid);
+    jsize tbarrlen = (*env)->GetArrayLength(env, tbarr);
+    if (NULL != tbarr && tbarrlen > 0){
+      ret->transtable = (struct transitem *)calloc(
+          tbarrlen, sizeof(struct transitem));
+      if (NULL != ret->transtable) {
+        ret->transtablesz = tbarrlen;
+        for (i = 0; i < tbarrlen; ++i) {
+          itmarr = (jlongArray)((*env)->GetObjectArrayElement(env, tbarr, i));
+          itmarrlen = (*env)->GetArrayLength(env, itmarr);
+          if (NULL != itmarr && TRANSTABLEITEMLEN == itmarrlen) {
+            itms = (*env)->GetLongArrayElements(env, itmarr, NULL);
+            (ret->transtable + i)->hdlbase = addr_from_java(itms[0]);
+            (ret->transtable + i)->size = itms[1];
+            (ret->transtable + i)->base = addr_from_java(itms[2]);
+            (*env)->ReleaseLongArrayElements(env, itmarr, itms, JNI_ABORT);
+          } else {
+            return NULL;
+          }
+        }
+      } else {
+        destructNValInfo(ret);
+        return NULL;
+      }
+    }
+
+    jobjectArray fmarr = (*env)->GetObjectField(env, vinfoobj, frames_fid);
+    jsize fmarrlen = (*env)->GetArrayLength(env, fmarr);
+    if (NULL != fmarr && fmarrlen > 0){
+      ret->frames = (struct frameitem *)calloc(
+          fmarrlen, sizeof(struct frameitem));
+      if (NULL != ret->frames) {
+        ret->framessz = fmarrlen;
+        for (i = 0; i < fmarrlen; ++i) {
+          itmarr = (jlongArray)((*env)->GetObjectArrayElement(env, fmarr, i));
+          itmarrlen = (*env)->GetArrayLength(env, itmarr);
+          if (NULL != itmarr && FRAMESITEMLEN == itmarrlen) {
+            itms = (*env)->GetLongArrayElements(env, itmarr, NULL);
+            (ret->frames + i)->nextoff = itms[0];
+            (ret->frames + i)->nextsz = itms[1];
+            (ret->frames + i)->nlvloff = itms[2];
+            (ret->frames + i)->nlvlsz = itms[3];
+            (*env)->ReleaseLongArrayElements(env, itmarr, itms, JNI_ABORT);
+          } else {
+            return NULL;
+          }
+        }
+      } else {
+        destructNValInfo(ret);
+        return NULL;
+      }
+    }
+  } else {
+    return NULL;
+  }
+  return ret;
+}
+
+struct NValueInfo **constructNValueInfos(JNIEnv* env,
+    jobjectArray vinfos, size_t *sz) {
+  if (NULL == sz) {
+    return NULL;
+  }
+  size_t idx;
+  struct NValueInfo **ret = NULL;
+  struct NValueInfo *curnvi = NULL;
+  jobject curviobj;
+
+  *sz = (*env)->GetArrayLength(env, vinfos);
+  if (0 >= *sz) {
+    return NULL;
+  }
+  ret = (struct NValueInfo **)calloc(*sz, sizeof(struct NValueInfo*));
+  if (NULL == ret) {
+    return NULL;
+  }
+
+  for(idx = 0; idx < *sz; ++idx) {
+    curviobj = (*env)->GetObjectArrayElement(env, vinfos, idx);
+    if (NULL == curviobj) {
+      continue;
+    }
+    curnvi = constructNValInfo(env, curviobj);
+    if (NULL == curnvi) {
+      destructNValueInfos(ret, *sz);
+      return NULL;
+    }
+    *(ret + idx) = curnvi;
+  }
+
+  return ret;
+}
+
+void destructNValueInfos(struct NValueInfo **nvalinfos, size_t sz) {
+  size_t idx;
+  if (NULL != nvalinfos) {
+    for(idx = 0; idx < sz; ++idx) {
+      destructNValInfo(*(nvalinfos + idx));
+    }
+    free(nvalinfos);
+  }
+}
+
+void printNValueInfos(struct NValueInfo **nvalinfos, size_t sz) {
+  size_t idx, i;
+  struct NValueInfo *itm;
+  struct transitem *ttitm;
+  struct frameitem *fitm;
+  printf("\n--- Native ValueInfo List, Addr:%p, Size: %d ---\n", nvalinfos, sz);
+  if (NULL != nvalinfos) {
+    for(idx = 0; idx < sz; ++idx) {
+      itm = *(nvalinfos + idx);
+      printf("** Item %2d, Addr:%p ** \n", idx, itm);
+      if (NULL != itm) {
+        printf("Handler:%p, DType Value:%d\n", itm->handler, itm->dtype);
+        printf(">> TransTable: Addr:%p, Size:%d <<\n", itm->transtable, itm->transtablesz);
+        if (NULL != itm->transtable && itm->transtablesz > 0) {
+          for (i = 0; i < itm->transtablesz; ++i) {
+            ttitm = (itm->transtable + i);
+            printf("%2d)", i);
+            if (NULL != ttitm) {
+              printf("hdlbase:%p, size:%ld, base:%p\n",
+                  ttitm->hdlbase, ttitm->size, ttitm->base);
+            } else {
+              printf("NULL\n");
+            }
+          }
+        } else {
+          printf("NULL\n");
+        }
+        printf(">> Frames: Addr:%p, Size:%d <<\n", itm->frames, itm->framessz);
+        if (NULL != itm->frames && itm->framessz > 0) {
+          for (i = 0; i < itm->framessz; ++i) {
+            fitm = (itm->frames + i);
+            printf("%2d)", i);
+            if (NULL != fitm) {
+              printf("nextoff:%ld, nextsz:%ld, nlvloff:%ld, nlvlsz:%ld\n",
+                  fitm->nextoff, fitm->nextsz, fitm->nlvloff, fitm->nlvlsz);
+            } else {
+              printf("NULL\n");
+            }
+          }
+        } else {
+          printf("NULL\n");
+        }
+      } else {
+        printf("NULL\n");
+      }
+    }
+  } else {
+    printf("NULL\n");
+  }
+  printf("------------------------\n");
+}
+
+jlongArray constructJLongArray(JNIEnv* env, long arr[], size_t sz) {
+  jlongArray ret = (*env)->NewLongArray(env, sz);
+  if (NULL == ret) {
+    return NULL;
+  }
+  (*env)->SetLongArrayRegion(env, ret, 0, sz, arr);
+  return ret;
+}

http://git-wip-us.apache.org/repos/asf/incubator-mnemonic/blob/a39d1097/mnemonic-computing-services/mnemonic-utilities-service/src/main/native/common.h
----------------------------------------------------------------------
diff --git a/mnemonic-computing-services/mnemonic-utilities-service/src/main/native/common.h b/mnemonic-computing-services/mnemonic-utilities-service/src/main/native/common.h
index f03dbff..ce4809d 100644
--- a/mnemonic-computing-services/mnemonic-utilities-service/src/main/native/common.h
+++ b/mnemonic-computing-services/mnemonic-utilities-service/src/main/native/common.h
@@ -42,6 +42,35 @@ void* addr_from_java(jlong addr);
 
 jlong addr_to_java(void* p);
 
+struct transitem {
+  void* hdlbase;
+  long size;
+  void* base;
+};
+
+struct frameitem {
+  long nextoff;
+  long nextsz;
+  long nlvloff;
+  long nlvlsz;
+};
+
+struct NValueInfo {
+  long handler;
+  struct transitem *transtable;
+  size_t transtablesz;
+  struct frameitem *frames;
+  size_t framessz;
+  int dtype;
+};
+
+struct NValueInfo **constructNValueInfos(JNIEnv* env,
+    jobjectArray vinfos, size_t *sz);
+
+void destructNValueInfos(struct NValueInfo **nvalinfos, size_t sz);
+
+jlongArray constructJLongArray(JNIEnv* env, long arr[], size_t sz);
+
 #ifdef __cplusplus
 }
 #endif

http://git-wip-us.apache.org/repos/asf/incubator-mnemonic/blob/a39d1097/mnemonic-computing-services/mnemonic-utilities-service/src/main/native/org_apache_mnemonic_service_computingservice_internal_PrintServiceImpl.c
----------------------------------------------------------------------
diff --git a/mnemonic-computing-services/mnemonic-utilities-service/src/main/native/org_apache_mnemonic_service_computingservice_internal_PrintServiceImpl.c b/mnemonic-computing-services/mnemonic-utilities-service/src/main/native/org_apache_mnemonic_service_computingservice_internal_PrintServiceImpl.c
index 37badd3..f3e72fb 100644
--- a/mnemonic-computing-services/mnemonic-utilities-service/src/main/native/org_apache_mnemonic_service_computingservice_internal_PrintServiceImpl.c
+++ b/mnemonic-computing-services/mnemonic-utilities-service/src/main/native/org_apache_mnemonic_service_computingservice_internal_PrintServiceImpl.c
@@ -32,32 +32,15 @@ jlongArray JNICALL Java_org_apache_mnemonic_service_computingservice_internal_Pr
   for(idx = 0; idx < retsz; ++idx) {
     nret[idx] = 0L;
   }
-  ret = (*env)->NewLongArray(env, retsz);
-  if (NULL == ret) {
-    return NULL;
-  }
-  printf("----Service Native Parameters----\n");
-  for(idx = 0; idx < (*env)->GetArrayLength(env, vinfos); ++idx) {
+  size_t visz;
+  struct NValueInfo **nvinfos = constructNValueInfos(env, vinfos, &visz);
 
-//    printf("Handler --> %p \n", addr_from_java(hdr));
-//    jsize i, j; jlong *vals;
-//    jlongArray *larr;
-//    jsize len1 = (*env)->GetArrayLength(env, arr);
-//    jsize len2;
-//    for (i = 0; i < len1; ++i) {
-//      larr = (jlongArray)((*env)->GetObjectArrayElement(env, arr, i));
-//      len2 = (*env)->GetArrayLength(env, larr);
-//      vals = (*env)->GetLongArrayElements(env, larr, 0);
-//      printf("Stack Row %d - ", i);
-//      for (j = 0; j < len2; ++j) {
-//        printf("[%d]:%p ", j, vals[j]);
-//      }
-//      printf("\n");
-//      (*env)->ReleaseLongArrayElements(env, larr, vals, 0);
-//    }
-  }
 
-  (*env)->SetIntArrayRegion(env, ret, 0, retsz, nret);
+  printf("----Service Native Parameters----\n");
+  printNValueInfos(nvinfos, visz);
+
+  ret = constructJLongArray(env, nret, retsz);
+  destructNValueInfos(nvinfos, visz);
   return ret;
 }
 

http://git-wip-us.apache.org/repos/asf/incubator-mnemonic/blob/a39d1097/mnemonic-computing-services/mnemonic-utilities-service/src/test/java/org/apache/mnemonic/service/computingservice/DurableNodeValueNGPrintTest.java
----------------------------------------------------------------------
diff --git a/mnemonic-computing-services/mnemonic-utilities-service/src/test/java/org/apache/mnemonic/service/computingservice/DurableNodeValueNGPrintTest.java b/mnemonic-computing-services/mnemonic-utilities-service/src/test/java/org/apache/mnemonic/service/computingservice/DurableNodeValueNGPrintTest.java
index 47b4bb2..99ef331 100644
--- a/mnemonic-computing-services/mnemonic-utilities-service/src/test/java/org/apache/mnemonic/service/computingservice/DurableNodeValueNGPrintTest.java
+++ b/mnemonic-computing-services/mnemonic-utilities-service/src/test/java/org/apache/mnemonic/service/computingservice/DurableNodeValueNGPrintTest.java
@@ -129,7 +129,7 @@ public class DurableNodeValueNGPrintTest {
     long[][] fidinfostack = {{2L, 1L}, {0L, 1L}};
     vinfo.handler = handler;
     vinfo.transtable = m_act.getTranslateTable();
-    vinfo.type = DurableType.INTEGER;
+    vinfo.dtype = DurableType.INTEGER;
     vinfo.frames = Utils.genNativeParamForm(objstack, fidinfostack);
     ValueInfo[] vinfos = {vinfo};
     gcsvr.perform(vinfos);
@@ -226,7 +226,7 @@ public class DurableNodeValueNGPrintTest {
     long[][] fidinfostack = {{2L, 1L}, {2L, 1L}};
     vinfo.handler = handler;
     vinfo.transtable = m_act.getTranslateTable();
-    vinfo.type = DurableType.DOUBLE;
+    vinfo.dtype = DurableType.DOUBLE;
     vinfo.frames = Utils.genNativeParamForm(objstack, fidinfostack);
     ValueInfo[] vinfos = {vinfo};
     gcsvr.perform(vinfos);

http://git-wip-us.apache.org/repos/asf/incubator-mnemonic/blob/a39d1097/mnemonic-core/src/main/java/org/apache/mnemonic/service/computingservice/ValueInfo.java
----------------------------------------------------------------------
diff --git a/mnemonic-core/src/main/java/org/apache/mnemonic/service/computingservice/ValueInfo.java b/mnemonic-core/src/main/java/org/apache/mnemonic/service/computingservice/ValueInfo.java
index d88d5db..afb915f 100644
--- a/mnemonic-core/src/main/java/org/apache/mnemonic/service/computingservice/ValueInfo.java
+++ b/mnemonic-core/src/main/java/org/apache/mnemonic/service/computingservice/ValueInfo.java
@@ -39,6 +39,6 @@ public class ValueInfo {
   /**
    * a type of this specified value
    */
-  public DurableType type;
+  public DurableType dtype;
 
 }