23 #include <rtl/byteseq.h>
24 #include <rtl/byteseq.hxx>
25 #include <rtl/ref.hxx>
27 #include <uno/threadpool.h>
41 jmethodID theExecute, uno_ThreadPool thePool):
42 virtualMachine(theVirtualMachine), execute(theExecute), pool(thePool) {}
50 Job(Pool * thePool, jobject theJob): pool(thePool), job(theJob) {}
56 void throwOutOfMemory(JNIEnv * env) {
57 jclass c = env->FindClass(
"java/lang/OutOfMemoryError");
68 Job * job =
static_cast< Job *
>(data);
75 env->CallObjectMethod(job->job, job->pool->execute);
76 env->DeleteGlobalRef(job->job);
86 extern "C" SAL_JNI_EXPORT jbyteArray JNICALL
93 rtl::ByteSequence seq(s);
94 rtl_byte_sequence_release(s);
95 sal_Int32
n = seq.getLength();
96 jbyteArray
a = env->NewByteArray(n);
101 void *
p = env->GetPrimitiveArrayCritical(a,
nullptr);
105 memcpy(p, seq.getConstArray(),
n);
107 env->ReleasePrimitiveArrayCritical(a, p, 0);
111 extern "C" SAL_JNI_EXPORT jlong JNICALL
116 if (env->GetJavaVM(&vm) != JNI_OK) {
117 jclass c = env->FindClass(
"java/lang/RuntimeException");
119 env->ThrowNew(c,
"JNI GetJavaVM failed");
123 jclass c = env->FindClass(
"com/sun/star/lib/uno/environments/remote/Job");
127 jmethodID execute = env->GetMethodID(c,
"execute",
"()Ljava/lang/Object;");
128 if (execute ==
nullptr) {
132 return reinterpret_cast< jlong
>(
new Pool(
135 }
catch (
const std::bad_alloc &) {
136 throwOutOfMemory(env);
141 extern "C" SAL_JNI_EXPORT
void JNICALL
143 SAL_UNUSED_PARAMETER JNIEnv *, SAL_UNUSED_PARAMETER jclass, jlong pool)
149 extern "C" SAL_JNI_EXPORT jobject JNICALL
155 reinterpret_cast< Pool * >(pool)->pool,
156 reinterpret_cast< void ** >(&job));
157 if (job ==
nullptr) {
160 jobject ref = env->NewLocalRef(job);
161 env->DeleteGlobalRef(job);
165 extern "C" SAL_JNI_EXPORT
void JNICALL
167 SAL_UNUSED_PARAMETER JNIEnv *, SAL_UNUSED_PARAMETER jclass, jlong pool)
173 extern "C" SAL_JNI_EXPORT
void JNICALL
175 JNIEnv * env, SAL_UNUSED_PARAMETER jclass, jlong pool, jbyteArray threadId,
178 void * s = env->GetPrimitiveArrayCritical(threadId,
nullptr);
182 rtl::ByteSequence seq(
183 static_cast< sal_Int8 * >(s), env->GetArrayLength(threadId));
187 env->ReleasePrimitiveArrayCritical(threadId, s, JNI_ABORT);
188 Pool *
p =
reinterpret_cast< Pool *
>(pool);
189 jobject ref = env->NewGlobalRef(job);
190 if (ref ==
nullptr) {
195 j =
new(std::nothrow)
Job(p, ref);
197 env->DeleteGlobalRef(ref);
198 throwOutOfMemory(env);
203 p->pool, seq.getHandle(),
204 request ?
static_cast< void *
>(j) : static_cast< void * >(ref),
208 extern "C" SAL_JNI_EXPORT
void JNICALL
210 SAL_UNUSED_PARAMETER JNIEnv *, SAL_UNUSED_PARAMETER jclass, jlong pool)
216 extern "C" SAL_JNI_EXPORT
void JNICALL
218 SAL_UNUSED_PARAMETER JNIEnv *, SAL_UNUSED_PARAMETER jclass, jlong pool)
221 Pool *
p =
reinterpret_cast< Pool *
>(pool);
SAL_JNI_EXPORT void JNICALL Java_com_sun_star_lib_uno_environments_remote_NativeThreadPool_destroy(SAL_UNUSED_PARAMETER JNIEnv *, SAL_UNUSED_PARAMETER jclass, jlong pool) SAL_THROW_EXTERN_C()
SAL_JNI_EXPORT void JNICALL Java_com_sun_star_lib_uno_environments_remote_NativeThreadPool_dispose(SAL_UNUSED_PARAMETER JNIEnv *, SAL_UNUSED_PARAMETER jclass, jlong pool) SAL_THROW_EXTERN_C()
void SAL_CALL uno_threadpool_putJob(uno_ThreadPool hPool, sal_Sequence *pThreadId, void *pJob, void(SAL_CALL *doRequest)(void *pThreadSpecificData), sal_Bool bIsOneway) SAL_THROW_EXTERN_C()
SAL_JNI_EXPORT jobject JNICALL Java_com_sun_star_lib_uno_environments_remote_NativeThreadPool_enter(JNIEnv *env, SAL_UNUSED_PARAMETER jclass, jlong pool) SAL_THROW_EXTERN_C()
SAL_JNI_EXPORT void JNICALL Java_com_sun_star_lib_uno_environments_remote_NativeThreadPool_detach(SAL_UNUSED_PARAMETER JNIEnv *, SAL_UNUSED_PARAMETER jclass, jlong pool) SAL_THROW_EXTERN_C()
void SAL_CALL uno_threadpool_detach(SAL_UNUSED_PARAMETER uno_ThreadPool) SAL_THROW_EXTERN_C()
void SAL_CALL uno_releaseIdFromCurrentThread() SAL_THROW_EXTERN_C()
#define SAL_THROW_EXTERN_C()
void SAL_CALL uno_getIdOfCurrentThread(sal_Sequence **ppThreadId) SAL_THROW_EXTERN_C()
static void executeRequest(void *data)
SAL_JNI_EXPORT void JNICALL Java_com_sun_star_lib_uno_environments_remote_NativeThreadPool_putJob(JNIEnv *env, SAL_UNUSED_PARAMETER jclass, jlong pool, jbyteArray threadId, jobject job, jboolean request, jboolean oneWay) SAL_THROW_EXTERN_C()
void SAL_CALL uno_threadpool_enter(uno_ThreadPool hPool, void **ppJob) SAL_THROW_EXTERN_C()
void SAL_CALL uno_threadpool_destroy(uno_ThreadPool hPool) SAL_THROW_EXTERN_C()
SAL_JNI_EXPORT void JNICALL Java_com_sun_star_lib_uno_environments_remote_NativeThreadPool_attach(SAL_UNUSED_PARAMETER JNIEnv *, SAL_UNUSED_PARAMETER jclass, jlong pool) SAL_THROW_EXTERN_C()
uno_ThreadPool SAL_CALL uno_threadpool_create() SAL_THROW_EXTERN_C()
void SAL_CALL uno_threadpool_dispose(uno_ThreadPool hPool) SAL_THROW_EXTERN_C()
void SAL_CALL uno_threadpool_attach(uno_ThreadPool hPool) SAL_THROW_EXTERN_C()
JNIEnv * getEnvironment() const
SAL_JNI_EXPORT jbyteArray JNICALL Java_com_sun_star_lib_uno_environments_remote_NativeThreadPool_threadId(JNIEnv *env, SAL_UNUSED_PARAMETER jclass) SAL_THROW_EXTERN_C()
SAL_JNI_EXPORT jlong JNICALL Java_com_sun_star_lib_uno_environments_remote_NativeThreadPool_create(JNIEnv *env, SAL_UNUSED_PARAMETER jclass) SAL_THROW_EXTERN_C()