summaryrefslogtreecommitdiffstats
path: root/luni-kernel/src
diff options
context:
space:
mode:
authorElliott Hughes <enh@google.com>2009-10-23 18:10:44 -0700
committerElliott Hughes <enh@google.com>2009-10-23 18:10:44 -0700
commit94367e0ead84fc2228799a78ec207ea52e203f1a (patch)
tree78746c1ddf814d69aac118b8789fbf62f477beaf /luni-kernel/src
parent954754fc999fb5fb747f7928302639d16dd3ac7e (diff)
downloadlibcore-94367e0ead84fc2228799a78ec207ea52e203f1a.zip
libcore-94367e0ead84fc2228799a78ec207ea52e203f1a.tar.gz
libcore-94367e0ead84fc2228799a78ec207ea52e203f1a.tar.bz2
Switch ProcessManager and System over to C++.
Bug 2180063 will require changes to ProcessManager, so now's a good time to make the switch in this directory.
Diffstat (limited to 'luni-kernel/src')
-rw-r--r--luni-kernel/src/main/native/java_lang_ProcessManager.cpp (renamed from luni-kernel/src/main/native/java_lang_ProcessManager.c)63
-rw-r--r--luni-kernel/src/main/native/java_lang_System.cpp (renamed from luni-kernel/src/main/native/java_lang_System.c)54
-rw-r--r--luni-kernel/src/main/native/sub.mk4
3 files changed, 50 insertions, 71 deletions
diff --git a/luni-kernel/src/main/native/java_lang_ProcessManager.c b/luni-kernel/src/main/native/java_lang_ProcessManager.cpp
index 46e78f5..8aa793c 100644
--- a/luni-kernel/src/main/native/java_lang_ProcessManager.c
+++ b/luni-kernel/src/main/native/java_lang_ProcessManager.cpp
@@ -51,19 +51,10 @@ static int androidSystemPropertiesFd = -1;
#define WAIT_STATUS_STRANGE_ERRNO (-3) // observed an undocumented errno
/** Closes a file descriptor. */
-static int closeNow(int fd) {
- int result;
- do {
- result = close(fd);
- } while (result == -1 && errno == EINTR);
- return result;
-}
-
-/** Closes a file descriptor. */
static void java_lang_ProcessManager_close(JNIEnv* env,
- jclass clazz, jobject javaDescriptor) {
- int fd = (*env)->GetIntField(env, javaDescriptor, descriptorField);
- if (closeNow(fd) == -1) {
+ jclass, jobject javaDescriptor) {
+ int fd = env->GetIntField(javaDescriptor, descriptorField);
+ if (TEMP_FAILURE_RETRY(close(fd)) == -1) {
jniThrowIOException(env, errno);
}
}
@@ -143,9 +134,8 @@ static void java_lang_ProcessManager_watchChildren(JNIEnv* env, jobject o) {
}
}
- (*env)->CallVoidMethod(env, o, onExitMethod, pid, status);
-
- if ((*env)->ExceptionOccurred(env)) {
+ env->CallVoidMethod(o, onExitMethod, pid, status);
+ if (env->ExceptionOccurred()) {
/*
* The callback threw, so break out of the loop and return,
* letting the exception percolate up.
@@ -157,11 +147,11 @@ static void java_lang_ProcessManager_watchChildren(JNIEnv* env, jobject o) {
/** Close all open fds > 2 (i.e. everything but stdin/out/err), != skipFd. */
static void closeNonStandardFds(int skipFd) {
+ // TODO: rather than close all these non-open files, we could look in /proc/self/fd.
struct rlimit rlimit;
getrlimit(RLIMIT_NOFILE, &rlimit);
-
- int fd;
- for (fd = 3; fd < rlimit.rlim_max; fd++) {
+ const int max_fd = rlimit.rlim_max;
+ for (int fd = 3; fd < max_fd; ++fd) {
if (fd != skipFd
#ifdef ANDROID
&& fd != androidSystemPropertiesFd
@@ -306,15 +296,14 @@ static char** convertStrings(JNIEnv* env, jobjectArray javaArray) {
}
char** array = NULL;
- jsize length = (*env)->GetArrayLength(env, javaArray);
+ jsize length = env->GetArrayLength(javaArray);
array = (char**) malloc(sizeof(char*) * (length + 1));
array[length] = 0;
jsize index;
for (index = 0; index < length; index++) {
- jstring javaEntry = (jstring) (*env)->GetObjectArrayElement(
- env, javaArray, index);
- char* entry = (char*) (*env)->GetStringUTFChars(
- env, javaEntry, NULL);
+ jstring javaEntry =
+ (jstring) env->GetObjectArrayElement(javaArray, index);
+ char* entry = (char*) env->GetStringUTFChars(javaEntry, NULL);
array[index] = entry;
}
@@ -327,12 +316,12 @@ static void freeStrings(JNIEnv* env, jobjectArray javaArray, char** array) {
return;
}
- jsize length = (*env)->GetArrayLength(env, javaArray);
+ jsize length = env->GetArrayLength(javaArray);
jsize index;
for (index = 0; index < length; index++) {
- jstring javaEntry = (jstring) (*env)->GetObjectArrayElement(
- env, javaArray, index);
- (*env)->ReleaseStringUTFChars(env, javaEntry, array[index]);
+ jstring javaEntry =
+ (jstring) env->GetObjectArrayElement(javaArray, index);
+ env->ReleaseStringUTFChars(javaEntry, array[index]);
}
free(array);
@@ -352,8 +341,7 @@ static pid_t java_lang_ProcessManager_exec(
// Extract working directory string.
const char* workingDirectory = NULL;
if (javaWorkingDirectory != NULL) {
- workingDirectory = (const char*) (*env)->GetStringUTFChars(
- env, javaWorkingDirectory, NULL);
+ workingDirectory = env->GetStringUTFChars(javaWorkingDirectory, NULL);
}
// Convert environment array.
@@ -364,22 +352,21 @@ static pid_t java_lang_ProcessManager_exec(
inDescriptor, outDescriptor, errDescriptor);
// Temporarily clear exception so we can clean up.
- jthrowable exception = (*env)->ExceptionOccurred(env);
- (*env)->ExceptionClear(env);
+ jthrowable exception = env->ExceptionOccurred();
+ env->ExceptionClear();
freeStrings(env, javaEnvironment, environment);
// Clean up working directory string.
if (javaWorkingDirectory != NULL) {
- (*env)->ReleaseStringUTFChars(
- env, javaWorkingDirectory, workingDirectory);
+ env->ReleaseStringUTFChars(javaWorkingDirectory, workingDirectory);
}
freeStrings(env, javaCommands, commands);
// Re-throw exception if present.
if (exception != NULL) {
- if ((*env)->Throw(env, exception) < 0) {
+ if (env->Throw(exception) < 0) {
LOGE("Error rethrowing exception!");
}
}
@@ -399,18 +386,16 @@ static void java_lang_ProcessManager_staticInitialize(JNIEnv* env,
}
#endif
- onExitMethod = (*env)->GetMethodID(env, clazz, "onExit", "(II)V");
+ onExitMethod = env->GetMethodID(clazz, "onExit", "(II)V");
if (onExitMethod == NULL) {
return;
}
- jclass fileDescriptorClass
- = (*env)->FindClass(env, "java/io/FileDescriptor");
+ jclass fileDescriptorClass = env->FindClass("java/io/FileDescriptor");
if (fileDescriptorClass == NULL) {
return;
}
- descriptorField = (*env)->GetFieldID(env, fileDescriptorClass,
- "descriptor", "I");
+ descriptorField = env->GetFieldID(fileDescriptorClass, "descriptor", "I");
if (descriptorField == NULL) {
return;
}
diff --git a/luni-kernel/src/main/native/java_lang_System.c b/luni-kernel/src/main/native/java_lang_System.cpp
index 1c06a40..d02481c 100644
--- a/luni-kernel/src/main/native/java_lang_System.c
+++ b/luni-kernel/src/main/native/java_lang_System.cpp
@@ -14,6 +14,7 @@
* limitations under the License.
*/
+#include "AndroidSystemNatives.h"
#include "JNIHelp.h"
#include <stdlib.h>
@@ -26,20 +27,16 @@
* (Calling it plain "getenv" might confuse GDB if you try to put a breakpoint
* on the libc version.)
*/
-static jstring java_getEnvByName(JNIEnv* env, jclass clazz, jstring nameStr)
-{
+static jstring java_getEnvByName(JNIEnv* env, jclass, jstring nameStr) {
jstring valueStr = NULL;
if (nameStr != NULL) {
- const char* name;
- const char* val;
-
- name = (*env)->GetStringUTFChars(env, nameStr, NULL);
- val = getenv(name);
- if (val != NULL)
- valueStr = (*env)->NewStringUTF(env, val);
-
- (*env)->ReleaseStringUTFChars(env, nameStr, name);
+ const char* name = env->GetStringUTFChars(nameStr, NULL);
+ const char* val = getenv(name);
+ if (val != NULL) {
+ valueStr = env->NewStringUTF(val);
+ }
+ env->ReleaseStringUTFChars(nameStr, name);
} else {
jniThrowException(env, "java/lang/NullPointerException", NULL);
}
@@ -58,13 +55,12 @@ extern char** environ;
* (Calling it plain "getenv" might confuse GDB if you try to put a breakpoint
* on the libc version.)
*/
-static jstring java_getEnvByIndex(JNIEnv* env, jclass clazz, jint index)
-{
+static jstring java_getEnvByIndex(JNIEnv* env, jclass, jint index) {
jstring valueStr = NULL;
char* entry = environ[index];
if (entry != NULL) {
- valueStr = (*env)->NewStringUTF(env, entry);
+ valueStr = env->NewStringUTF(entry);
}
return valueStr;
@@ -76,16 +72,16 @@ static jstring java_getEnvByIndex(JNIEnv* env, jclass clazz, jint index)
* Sets a field via JNI. Used for the standard streams, which are r/o
* otherwise.
*/
-static void java_setFieldImpl(JNIEnv* env, jclass clazz, jstring name, jstring sig, jobject object)
-{
- const char* fieldName = (*env)->GetStringUTFChars(env, name, NULL);
- const char* fieldSig = (*env)->GetStringUTFChars(env, sig, NULL);
+static void java_setFieldImpl(JNIEnv* env, jclass clazz,
+ jstring name, jstring sig, jobject object) {
+ const char* fieldName = env->GetStringUTFChars(name, NULL);
+ const char* fieldSig = env->GetStringUTFChars(sig, NULL);
- jfieldID fieldID = (*env)->GetStaticFieldID(env, clazz, fieldName, fieldSig);
- (*env)->SetStaticObjectField(env, clazz, fieldID, object);
+ jfieldID fieldID = env->GetStaticFieldID(clazz, fieldName, fieldSig);
+ env->SetStaticObjectField(clazz, fieldID, object);
- (*env)->ReleaseStringUTFChars(env, name, fieldName);
- (*env)->ReleaseStringUTFChars(env, sig, fieldSig);
+ env->ReleaseStringUTFChars(name, fieldName);
+ env->ReleaseStringUTFChars(sig, fieldSig);
}
/*
@@ -93,14 +89,12 @@ static void java_setFieldImpl(JNIEnv* env, jclass clazz, jstring name, jstring s
*/
static JNINativeMethod gMethods[] = {
/* name, signature, funcPtr */
- { "getEnvByName", "(Ljava/lang/String;)Ljava/lang/String;", java_getEnvByName },
- { "getEnvByIndex", "(I)Ljava/lang/String;", java_getEnvByIndex },
- { "setFieldImpl", "(Ljava/lang/String;Ljava/lang/String;Ljava/lang/Object;)V", java_setFieldImpl },
+ { "getEnvByName", "(Ljava/lang/String;)Ljava/lang/String;", (void*) java_getEnvByName },
+ { "getEnvByIndex", "(I)Ljava/lang/String;", (void*) java_getEnvByIndex },
+ { "setFieldImpl", "(Ljava/lang/String;Ljava/lang/String;Ljava/lang/Object;)V", (void*) java_setFieldImpl },
};
-int register_java_lang_System(JNIEnv* env)
-{
- return jniRegisterNativeMethods(env, "java/lang/System",
- gMethods, NELEM(gMethods));
+int register_java_lang_System(JNIEnv* env) {
+ return jniRegisterNativeMethods(env, "java/lang/System",
+ gMethods, NELEM(gMethods));
}
-
diff --git a/luni-kernel/src/main/native/sub.mk b/luni-kernel/src/main/native/sub.mk
index cd4ce92..fcb7d0d 100644
--- a/luni-kernel/src/main/native/sub.mk
+++ b/luni-kernel/src/main/native/sub.mk
@@ -3,8 +3,8 @@
# or BUILD_*_LIBRARY.
LOCAL_SRC_FILES := \
- java_lang_ProcessManager.c \
- java_lang_System.c
+ java_lang_ProcessManager.cpp \
+ java_lang_System.cpp
LOCAL_C_INCLUDES +=