view test/runtime/6929067/invoke.c @ 4225:339cf8d4904d

Made mx.run work properly when stderr is redirected to stdout. Made outputparser redirect stderr to stdout. Added copyright headers to outputparser.py and sanitycheck.py. Reverted class path construction in mx.build() to use includeSelf=True to fix regression when running 'mx build -c'.
author Doug Simon <doug.simon@oracle.com>
date Thu, 05 Jan 2012 11:31:46 +0100
parents 3b3d12e645e7
children
line wrap: on
line source

#include <assert.h>
#include <jni.h>
#include <alloca.h>

#include <pthread.h>

union env_union
{
  void *void_env;
  JNIEnv *jni_env;
};

union env_union tmp;
JNIEnv* env;
JavaVM* jvm;
JavaVMInitArgs vm_args;
JavaVMOption options[1];
jclass class_id;
jmethodID method_id;
jint result;

long product(unsigned long n, unsigned long m) {
    if (m == 1) {
      return n;
    } else {
      int *p = alloca(sizeof (int));
      *p = n;
      return product (n, m-1) + *p;
    }
}

void *
floobydust (void *p)
{
  (*jvm)->AttachCurrentThread(jvm, &tmp.void_env, NULL);
  env = tmp.jni_env;

  class_id = (*env)->FindClass (env, "T");
  assert (class_id);

  method_id = (*env)->GetStaticMethodID (env, class_id, "printIt", "()V");
  assert (method_id);

  (*env)->CallStaticVoidMethod (env, class_id, method_id, NULL);

  (*jvm)->DetachCurrentThread(jvm);

  printf("%ld\n", product(5000,5000));

  (*jvm)->AttachCurrentThread(jvm, &tmp.void_env, NULL);
  env = tmp.jni_env;

  class_id = (*env)->FindClass (env, "T");
  assert (class_id);

  method_id = (*env)->GetStaticMethodID (env, class_id, "printIt", "()V");
  assert (method_id);

  (*env)->CallStaticVoidMethod (env, class_id, method_id, NULL);

  (*jvm)->DetachCurrentThread(jvm);

  printf("%ld\n", product(5000,5000));

  return NULL;
}

int
main (int argc, const char** argv)
{
  options[0].optionString = "-Xss320k";

  vm_args.version = JNI_VERSION_1_2;
  vm_args.ignoreUnrecognized = JNI_TRUE;
  vm_args.options = options;
  vm_args.nOptions = 1;

  result = JNI_CreateJavaVM (&jvm, &tmp.void_env, &vm_args);
  assert (result >= 0);

  env = tmp.jni_env;

  floobydust (NULL);

  pthread_t thr;
  pthread_create (&thr, NULL, floobydust, NULL);
  pthread_join (thr, NULL);

  return 0;
}