1
2 #include "xmlvm.h"
3 #include "org_xmlvm_runtime_Condition.h"
4
5
6 //XMLVM_BEGIN_NATIVE_IMPLEMENTATION
7
8 #include "java_lang_Object_AddedMembers.h"
9 #include "org_xmlvm_runtime_Mutex.h"
10 #include <errno.h>
11 #include <sys/time.h>
12
getConditionPtr(org_xmlvm_runtime_Condition * me)13 pthread_cond_t* getConditionPtr(org_xmlvm_runtime_Condition* me)
14 {
15 return (pthread_cond_t*)(me->fields.org_xmlvm_runtime_Condition.pthreadCondT_);
16 }
17
nativeConditionCleanup(void * me,void * client_data)18 void nativeConditionCleanup(void* me, void* client_data)
19 {
20 pthread_cond_t* condPtr = getConditionPtr((org_xmlvm_runtime_Condition*)me);
21 pthread_cond_destroy(condPtr);
22 free(condPtr);
23 }
24
25 //XMLVM_END_NATIVE_IMPLEMENTATION
26
org_xmlvm_runtime_Condition_initNativeConditionInstance__(JAVA_OBJECT me)27 void org_xmlvm_runtime_Condition_initNativeConditionInstance__(JAVA_OBJECT me)
28 {
29 //XMLVM_BEGIN_NATIVE[org_xmlvm_runtime_Condition_initNativeConditionInstance__]
30 ((org_xmlvm_runtime_Condition*)me)->fields.org_xmlvm_runtime_Condition.pthreadCondT_ = malloc(sizeof(pthread_cond_t));
31 pthread_cond_init(getConditionPtr(me), NULL);
32
33 // Register a finalizer for native cleanup
34 XMLVM_FINALIZE(me, nativeConditionCleanup);
35 //XMLVM_END_NATIVE
36 }
37
org_xmlvm_runtime_Condition_wait___org_xmlvm_runtime_Mutex(JAVA_OBJECT me,JAVA_OBJECT n1)38 void org_xmlvm_runtime_Condition_wait___org_xmlvm_runtime_Mutex(JAVA_OBJECT me, JAVA_OBJECT n1)
39 {
40 //XMLVM_BEGIN_NATIVE[org_xmlvm_runtime_Condition_wait___org_xmlvm_runtime_Mutex]
41 pthread_cond_t* condPtr = getConditionPtr(me);
42 JAVA_OBJECT mutex = ((org_xmlvm_runtime_Mutex*)n1)->fields.org_xmlvm_runtime_Mutex.nativeMutex_;
43 int result = pthread_cond_wait(condPtr, mutex);
44 if (result != 0) {
45 printf("ERROR: pthread_cond_wait response was %i\n", result);
46 }
47 //XMLVM_END_NATIVE
48 }
49
org_xmlvm_runtime_Condition_waitOrTimeout___org_xmlvm_runtime_Mutex_long(JAVA_OBJECT me,JAVA_OBJECT n1,JAVA_LONG n2)50 JAVA_BOOLEAN org_xmlvm_runtime_Condition_waitOrTimeout___org_xmlvm_runtime_Mutex_long(JAVA_OBJECT me, JAVA_OBJECT n1, JAVA_LONG n2)
51 {
52 //XMLVM_BEGIN_NATIVE[org_xmlvm_runtime_Condition_waitOrTimeout___org_xmlvm_runtime_Mutex_long]
53 pthread_cond_t* condPtr = getConditionPtr(me);
54 JAVA_OBJECT mutex = ((org_xmlvm_runtime_Mutex*)n1)->fields.org_xmlvm_runtime_Mutex.nativeMutex_;
55
56 struct timeval now;
57 gettimeofday(&now, NULL);
58
59 struct timespec to;
60 // To avoid an overflow error, we drop precision on microseconds (usec) in favor of milliseconds.
61 // The loss of precision at the microsecond level is not of concern.
62 JAVA_LONG msec = (now.tv_usec / 1000) + n2;
63 to.tv_sec = now.tv_sec + (msec / 1000);
64 to.tv_nsec = (msec % 1000) * 1000000;
65
66 int result = pthread_cond_timedwait(condPtr, mutex, &to);
67 int timedOut = 0;
68 if (result == ETIMEDOUT) {
69 timedOut = 1;
70 } else if (result != 0) {
71 printf("ERROR: pthread_cond_timedwait response was %i\n", result);
72 }
73 return timedOut;
74 //XMLVM_END_NATIVE
75 }
76
org_xmlvm_runtime_Condition_signal__(JAVA_OBJECT me)77 void org_xmlvm_runtime_Condition_signal__(JAVA_OBJECT me)
78 {
79 //XMLVM_BEGIN_NATIVE[org_xmlvm_runtime_Condition_signal__]
80 XMLVM_UNIMPLEMENTED_NATIVE_METHOD();
81 //XMLVM_END_NATIVE
82 }
83
org_xmlvm_runtime_Condition_broadcast__(JAVA_OBJECT me)84 void org_xmlvm_runtime_Condition_broadcast__(JAVA_OBJECT me)
85 {
86 //XMLVM_BEGIN_NATIVE[org_xmlvm_runtime_Condition_broadcast__]
87 pthread_cond_t* condPtr = getConditionPtr(me);
88 int result = pthread_cond_broadcast(condPtr);
89 if (result != 0) {
90 printf("ERROR: pthread_cond_broadcast response was %i\n", result);
91 }
92 //XMLVM_END_NATIVE
93 }
94
95
xmlvm_init_native_org_xmlvm_runtime_Condition()96 void xmlvm_init_native_org_xmlvm_runtime_Condition()
97 {
98 //XMLVM_BEGIN_NATIVE_IMPLEMENTATION_INIT
99 //XMLVM_END_NATIVE_IMPLEMENTATION_INIT
100 #ifdef XMLVM_VTABLE_IDX_org_xmlvm_runtime_Condition_wait___org_xmlvm_runtime_Mutex
101 __TIB_org_xmlvm_runtime_Condition.vtable[XMLVM_VTABLE_IDX_org_xmlvm_runtime_Condition_wait___org_xmlvm_runtime_Mutex] =
102 (VTABLE_PTR) org_xmlvm_runtime_Condition_wait___org_xmlvm_runtime_Mutex;
103 #endif
104 #ifdef XMLVM_VTABLE_IDX_org_xmlvm_runtime_Condition_waitOrTimeout___org_xmlvm_runtime_Mutex_long
105 __TIB_org_xmlvm_runtime_Condition.vtable[XMLVM_VTABLE_IDX_org_xmlvm_runtime_Condition_waitOrTimeout___org_xmlvm_runtime_Mutex_long] =
106 (VTABLE_PTR) org_xmlvm_runtime_Condition_waitOrTimeout___org_xmlvm_runtime_Mutex_long;
107 #endif
108 #ifdef XMLVM_VTABLE_IDX_org_xmlvm_runtime_Condition_signal__
109 __TIB_org_xmlvm_runtime_Condition.vtable[XMLVM_VTABLE_IDX_org_xmlvm_runtime_Condition_signal__] =
110 (VTABLE_PTR) org_xmlvm_runtime_Condition_signal__;
111 #endif
112 #ifdef XMLVM_VTABLE_IDX_org_xmlvm_runtime_Condition_broadcast__
113 __TIB_org_xmlvm_runtime_Condition.vtable[XMLVM_VTABLE_IDX_org_xmlvm_runtime_Condition_broadcast__] =
114 (VTABLE_PTR) org_xmlvm_runtime_Condition_broadcast__;
115 #endif
116 }
117