diff options
author | Alon Zakai <alonzakai@gmail.com> | 2013-05-08 16:06:26 -0700 |
---|---|---|
committer | Alon Zakai <alonzakai@gmail.com> | 2013-05-08 16:06:26 -0700 |
commit | 693682fc225e60c9c335ee910fb3c8bb5cf85470 (patch) | |
tree | b2c1285adf65b68a7b20aa231c4c5665966b2c18 /tests/nbody-java/native_org_xmlvm_runtime_Condition.c | |
parent | b41b535aeac53740dec416f617378ec4e4e382ce (diff) |
add nbody-java code
Diffstat (limited to 'tests/nbody-java/native_org_xmlvm_runtime_Condition.c')
-rw-r--r-- | tests/nbody-java/native_org_xmlvm_runtime_Condition.c | 116 |
1 files changed, 116 insertions, 0 deletions
diff --git a/tests/nbody-java/native_org_xmlvm_runtime_Condition.c b/tests/nbody-java/native_org_xmlvm_runtime_Condition.c new file mode 100644 index 00000000..9d5daa0d --- /dev/null +++ b/tests/nbody-java/native_org_xmlvm_runtime_Condition.c @@ -0,0 +1,116 @@ + +#include "xmlvm.h" +#include "org_xmlvm_runtime_Condition.h" + + +//XMLVM_BEGIN_NATIVE_IMPLEMENTATION + +#include "java_lang_Object_AddedMembers.h" +#include "org_xmlvm_runtime_Mutex.h" +#include <errno.h> +#include <sys/time.h> + +pthread_cond_t* getConditionPtr(org_xmlvm_runtime_Condition* me) +{ + return (pthread_cond_t*)(me->fields.org_xmlvm_runtime_Condition.pthreadCondT_); +} + +void nativeConditionCleanup(void* me, void* client_data) +{ + pthread_cond_t* condPtr = getConditionPtr((org_xmlvm_runtime_Condition*)me); + pthread_cond_destroy(condPtr); + free(condPtr); +} + +//XMLVM_END_NATIVE_IMPLEMENTATION + +void org_xmlvm_runtime_Condition_initNativeConditionInstance__(JAVA_OBJECT me) +{ + //XMLVM_BEGIN_NATIVE[org_xmlvm_runtime_Condition_initNativeConditionInstance__] + ((org_xmlvm_runtime_Condition*)me)->fields.org_xmlvm_runtime_Condition.pthreadCondT_ = malloc(sizeof(pthread_cond_t)); + pthread_cond_init(getConditionPtr(me), NULL); + + // Register a finalizer for native cleanup + XMLVM_FINALIZE(me, nativeConditionCleanup); + //XMLVM_END_NATIVE +} + +void org_xmlvm_runtime_Condition_wait___org_xmlvm_runtime_Mutex(JAVA_OBJECT me, JAVA_OBJECT n1) +{ + //XMLVM_BEGIN_NATIVE[org_xmlvm_runtime_Condition_wait___org_xmlvm_runtime_Mutex] + pthread_cond_t* condPtr = getConditionPtr(me); + JAVA_OBJECT mutex = ((org_xmlvm_runtime_Mutex*)n1)->fields.org_xmlvm_runtime_Mutex.nativeMutex_; + int result = pthread_cond_wait(condPtr, mutex); + if (result != 0) { + printf("ERROR: pthread_cond_wait response was %i\n", result); + } + //XMLVM_END_NATIVE +} + +JAVA_BOOLEAN org_xmlvm_runtime_Condition_waitOrTimeout___org_xmlvm_runtime_Mutex_long(JAVA_OBJECT me, JAVA_OBJECT n1, JAVA_LONG n2) +{ + //XMLVM_BEGIN_NATIVE[org_xmlvm_runtime_Condition_waitOrTimeout___org_xmlvm_runtime_Mutex_long] + pthread_cond_t* condPtr = getConditionPtr(me); + JAVA_OBJECT mutex = ((org_xmlvm_runtime_Mutex*)n1)->fields.org_xmlvm_runtime_Mutex.nativeMutex_; + + struct timeval now; + gettimeofday(&now, NULL); + + struct timespec to; + // To avoid an overflow error, we drop precision on microseconds (usec) in favor of milliseconds. + // The loss of precision at the microsecond level is not of concern. + JAVA_LONG msec = (now.tv_usec / 1000) + n2; + to.tv_sec = now.tv_sec + (msec / 1000); + to.tv_nsec = (msec % 1000) * 1000000; + + int result = pthread_cond_timedwait(condPtr, mutex, &to); + int timedOut = 0; + if (result == ETIMEDOUT) { + timedOut = 1; + } else if (result != 0) { + printf("ERROR: pthread_cond_timedwait response was %i\n", result); + } + return timedOut; + //XMLVM_END_NATIVE +} + +void org_xmlvm_runtime_Condition_signal__(JAVA_OBJECT me) +{ + //XMLVM_BEGIN_NATIVE[org_xmlvm_runtime_Condition_signal__] + XMLVM_UNIMPLEMENTED_NATIVE_METHOD(); + //XMLVM_END_NATIVE +} + +void org_xmlvm_runtime_Condition_broadcast__(JAVA_OBJECT me) +{ + //XMLVM_BEGIN_NATIVE[org_xmlvm_runtime_Condition_broadcast__] + pthread_cond_t* condPtr = getConditionPtr(me); + int result = pthread_cond_broadcast(condPtr); + if (result != 0) { + printf("ERROR: pthread_cond_broadcast response was %i\n", result); + } + //XMLVM_END_NATIVE +} + + +void xmlvm_init_native_org_xmlvm_runtime_Condition() +{ + //XMLVM_BEGIN_NATIVE_IMPLEMENTATION_INIT + //XMLVM_END_NATIVE_IMPLEMENTATION_INIT +#ifdef XMLVM_VTABLE_IDX_org_xmlvm_runtime_Condition_wait___org_xmlvm_runtime_Mutex + __TIB_org_xmlvm_runtime_Condition.vtable[XMLVM_VTABLE_IDX_org_xmlvm_runtime_Condition_wait___org_xmlvm_runtime_Mutex] = + (VTABLE_PTR) org_xmlvm_runtime_Condition_wait___org_xmlvm_runtime_Mutex; +#endif +#ifdef XMLVM_VTABLE_IDX_org_xmlvm_runtime_Condition_waitOrTimeout___org_xmlvm_runtime_Mutex_long + __TIB_org_xmlvm_runtime_Condition.vtable[XMLVM_VTABLE_IDX_org_xmlvm_runtime_Condition_waitOrTimeout___org_xmlvm_runtime_Mutex_long] = + (VTABLE_PTR) org_xmlvm_runtime_Condition_waitOrTimeout___org_xmlvm_runtime_Mutex_long; +#endif +#ifdef XMLVM_VTABLE_IDX_org_xmlvm_runtime_Condition_signal__ + __TIB_org_xmlvm_runtime_Condition.vtable[XMLVM_VTABLE_IDX_org_xmlvm_runtime_Condition_signal__] = + (VTABLE_PTR) org_xmlvm_runtime_Condition_signal__; +#endif +#ifdef XMLVM_VTABLE_IDX_org_xmlvm_runtime_Condition_broadcast__ + __TIB_org_xmlvm_runtime_Condition.vtable[XMLVM_VTABLE_IDX_org_xmlvm_runtime_Condition_broadcast__] = + (VTABLE_PTR) org_xmlvm_runtime_Condition_broadcast__; +#endif +} |