summaryrefslogtreecommitdiffstats
path: root/media/mediaserver
diff options
context:
space:
mode:
authorNarayan Kamath <narayan@google.com>2015-06-09 17:42:34 +0100
committerNarayan Kamath <narayan@google.com>2015-06-10 08:52:17 +0000
commit2f3406517d1fd4486b8b90eb2635d784fad17a48 (patch)
tree55ff130219cf9ac6b68ebf58b0aa848159852b90 /media/mediaserver
parent356f08476db6191cdcbad20caf69d7bd642a09b2 (diff)
downloadframeworks_av-2f3406517d1fd4486b8b90eb2635d784fad17a48.zip
frameworks_av-2f3406517d1fd4486b8b90eb2635d784fad17a48.tar.gz
frameworks_av-2f3406517d1fd4486b8b90eb2635d784fad17a48.tar.bz2
mediaserver : Initialize ICU on startup.
In change 2b29e461c in external/icu, we stopped hardcoding the ICU data path at compile time to avoid two sets of mappings in zygote forked processes. This means we'll have to tell ICU where its data is if the process in question isn't forked from the zygote. bug: 21705078 Change-Id: I829d9fa34fe8209aa8a6d55145ca26fdf0d934e8
Diffstat (limited to 'media/mediaserver')
-rw-r--r--media/mediaserver/Android.mk4
-rw-r--r--media/mediaserver/IcuUtils.h25
-rw-r--r--media/mediaserver/icuutils.cpp42
-rw-r--r--media/mediaserver/main_mediaserver.cpp2
4 files changed, 72 insertions, 1 deletions
diff --git a/media/mediaserver/Android.mk b/media/mediaserver/Android.mk
index ba47172..78dfbb1 100644
--- a/media/mediaserver/Android.mk
+++ b/media/mediaserver/Android.mk
@@ -11,13 +11,15 @@ endif
include $(CLEAR_VARS)
LOCAL_SRC_FILES:= \
- main_mediaserver.cpp
+ main_mediaserver.cpp \
+ icuutils.cpp
LOCAL_SHARED_LIBRARIES := \
libaudioflinger \
libaudiopolicyservice \
libcamera_metadata\
libcameraservice \
+ libicuuc \
libmedialogservice \
libresourcemanagerservice \
libcutils \
diff --git a/media/mediaserver/IcuUtils.h b/media/mediaserver/IcuUtils.h
new file mode 100644
index 0000000..52fab6d
--- /dev/null
+++ b/media/mediaserver/IcuUtils.h
@@ -0,0 +1,25 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef ICU_UTILS_H
+#define ICU_UTILS_H
+
+// Initializes ICU or dies trying. This must be called when the process
+// is single threaded.
+void initializeIcuOrDie();
+
+#endif // ICU_UTILS_H
+
diff --git a/media/mediaserver/icuutils.cpp b/media/mediaserver/icuutils.cpp
new file mode 100644
index 0000000..4015849
--- /dev/null
+++ b/media/mediaserver/icuutils.cpp
@@ -0,0 +1,42 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "IcuUtils.h"
+
+#include "unicode/putil.h"
+#include "unicode/uclean.h"
+#include "unicode/utypes.h"
+#include "utils/Log.h"
+
+#include <stdlib.h>
+
+void initializeIcuOrDie() {
+ const char* systemPathPrefix = getenv("ANDROID_ROOT");
+ LOG_ALWAYS_FATAL_IF(systemPathPrefix == NULL, "ANDROID_ROOT environment variable not set");
+
+ char buf[256];
+ const int num_written = snprintf(buf, sizeof(buf), "%s/usr/icu/", systemPathPrefix);
+ LOG_ALWAYS_FATAL_IF((num_written < 0 || static_cast<size_t>(num_written) >= sizeof(buf)),
+ "Unable to construct ICU path.");
+
+ u_setDataDirectory(buf);
+ UErrorCode status = U_ZERO_ERROR;
+
+ // u_setDataDirectory doesn't try doing anything with the directory we gave
+ // it, so we'll have to call u_init to make sure it was successful.
+ u_init(&status);
+ LOG_ALWAYS_FATAL_IF(!U_SUCCESS(status), "Failed to initialize ICU %s", u_errorName(status));
+}
diff --git a/media/mediaserver/main_mediaserver.cpp b/media/mediaserver/main_mediaserver.cpp
index 06b3c6e..27a40b2 100644
--- a/media/mediaserver/main_mediaserver.cpp
+++ b/media/mediaserver/main_mediaserver.cpp
@@ -31,6 +31,7 @@
// from LOCAL_C_INCLUDES
#include "AudioFlinger.h"
#include "CameraService.h"
+#include "IcuUtils.h"
#include "MediaLogService.h"
#include "MediaPlayerService.h"
#include "ResourceManagerService.h"
@@ -124,6 +125,7 @@ int main(int argc __unused, char** argv)
prctl(PR_SET_PDEATHSIG, SIGKILL); // if parent media.log dies before me, kill me also
setpgid(0, 0); // but if I die first, don't kill my parent
}
+ initializeIcuOrDie();
sp<ProcessState> proc(ProcessState::self());
sp<IServiceManager> sm = defaultServiceManager();
ALOGI("ServiceManager: %p", sm.get());