process_name.c revision 14d0c6c7c0e9abd39e4b4d0a384d12de5ecbdbfc
165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn/* 265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn * Copyright (C) 2008 The Android Open Source Project 365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn * 465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn * Licensed under the Apache License, Version 2.0 (the "License"); 565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn * you may not use this file except in compliance with the License. 665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn * You may obtain a copy of the License at 765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn * 865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn * http://www.apache.org/licenses/LICENSE-2.0 965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn * 1065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn * Unless required by applicable law or agreed to in writing, software 1165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn * distributed under the License is distributed on an "AS IS" BASIS, 1265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn * See the License for the specific language governing permissions and 1465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn * limitations under the License. 1565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn */ 1665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn 1765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn#include <stdlib.h> 1865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn#include <string.h> 1965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn#include <cutils/process_name.h> 2065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn#include <cutils/properties.h> 2165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn#include <unistd.h> 2265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn#include <sys/types.h> 2365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn#include <sys/stat.h> 2465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn#include <fcntl.h> 2565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn 2665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn#if defined(HAVE_PRCTL) 2765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn#include <sys/prctl.h> 2865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn#endif 2965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn 3065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn#define PROCESS_NAME_DEVICE "/sys/qemu_trace/process_name" 3165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn 3265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Rennstatic const char* process_name = "unknown"; 3365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Rennstatic int running_in_emulator = -1; 3465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn 3565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Rennvoid set_process_name(const char* new_name) { 3665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn char propBuf[PROPERTY_VALUE_MAX]; 3765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn 3865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn if (new_name == NULL) { 3965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn return; 4065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn } 4165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn 4265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn // We never free the old name. Someone else could be using it. 4365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn int len = strlen(new_name); 4465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn char* copy = (char*) malloc(len + 1); 4565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn strcpy(copy, new_name); 4665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn process_name = (const char*) copy; 4765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn 4865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn#if defined(HAVE_PRCTL) 4965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn if (len < 16) { 5065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn prctl(PR_SET_NAME, (unsigned long) new_name, 0, 0, 0); 5165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn } else { 5265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn prctl(PR_SET_NAME, (unsigned long) new_name + len - 15, 0, 0, 0); 5365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn } 5465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn#endif 5565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn 5665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn // If we know we are not running in the emulator, then return. 5765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn if (running_in_emulator == 0) { 5865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn return; 5965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn } 6065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn 6165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn // If the "running_in_emulator" variable has not been initialized, 6265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn // then do it now. 6365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn if (running_in_emulator == -1) { 6465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn property_get("ro.kernel.qemu", propBuf, ""); 6565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn if (propBuf[0] == '1') { 6665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn running_in_emulator = 1; 6765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn } else { 6865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn running_in_emulator = 0; 6965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn return; 7065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn } 7165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn } 7265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn 7365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn // If the emulator was started with the "-trace file" command line option 7465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn // then we want to record the process name in the trace even if we are 7565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn // not currently tracing instructions (so that we will know the process 7665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn // name when we do start tracing instructions). We do not need to execute 7765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn // this code if we are just running in the emulator without the "-trace" 7865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn // command line option, but we don't know that here and this function 7965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn // isn't called frequently enough to bother optimizing that case. 8065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn int fd = open(PROCESS_NAME_DEVICE, O_RDWR); 8165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn if (fd < 0) 8265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn return; 8365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn write(fd, process_name, strlen(process_name) + 1); 8465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn close(fd); 85} 86 87const char* get_process_name(void) { 88 return process_name; 89} 90