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