diff options
author | Elliott Hughes <enh@google.com> | 2009-10-23 18:10:44 -0700 |
---|---|---|
committer | Elliott Hughes <enh@google.com> | 2009-10-23 18:10:44 -0700 |
commit | 94367e0ead84fc2228799a78ec207ea52e203f1a (patch) | |
tree | 78746c1ddf814d69aac118b8789fbf62f477beaf /luni-kernel/src | |
parent | 954754fc999fb5fb747f7928302639d16dd3ac7e (diff) | |
download | libcore-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.mk | 4 |
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 += |