From 2f3406517d1fd4486b8b90eb2635d784fad17a48 Mon Sep 17 00:00:00 2001 From: Narayan Kamath Date: Tue, 9 Jun 2015 17:42:34 +0100 Subject: 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 --- media/mediaserver/Android.mk | 4 +++- media/mediaserver/IcuUtils.h | 25 ++++++++++++++++++++ media/mediaserver/icuutils.cpp | 42 ++++++++++++++++++++++++++++++++++ media/mediaserver/main_mediaserver.cpp | 2 ++ 4 files changed, 72 insertions(+), 1 deletion(-) create mode 100644 media/mediaserver/IcuUtils.h create mode 100644 media/mediaserver/icuutils.cpp (limited to 'media/mediaserver') 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 + +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(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 proc(ProcessState::self()); sp sm = defaultServiceManager(); ALOGI("ServiceManager: %p", sm.get()); -- cgit v1.1