/* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #if defined(MOZ_PROFILE_GENERATE) && defined(XP_LINUX) && !defined(ANDROID) # include # include # include # include # include # include "mozilla/Attributes.h" # if defined(__cplusplus) extern "C" { # endif void __llvm_profile_initialize(void); void __llvm_profile_initialize_file(void); void __llvm_profile_set_filename(const char*); // Use the API to force a different filename, then set back the original one. // This will make sure the pattern is re-parsed and thus the PID properly // updated within the lprofCurFilename struct. static void updateFilenameAfterFork(void) { __llvm_profile_set_filename("default.profraw"); __llvm_profile_initialize_file(); __llvm_profile_set_filename(getenv("LLVM_PROFILE_FILE")); __llvm_profile_initialize_file(); } static int CustomRegisterRuntime(void) { __llvm_profile_initialize(); if (pthread_atfork(NULL, NULL, updateFilenameAfterFork) < 0) { fprintf(stderr, "[%d] [%s] pthread_atfork()=%d\n", getpid(), __PRETTY_FUNCTION__, errno); } return 0; } MOZ_RUNINIT int __llvm_profile_runtime = CustomRegisterRuntime(); # if defined(__cplusplus) } # endif #endif // defined(MOZ_PROFILE_GENERATE) && defined(XP_LINUX) && // !defined(ANDROID)