/*------------------------------------------------------------------------ * (The MIT License) * * Copyright (c) 2008-2011 Rhomobile, Inc. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. * * http://rhomobile.com *------------------------------------------------------------------------*/ #ifndef _RHOSYSTEM_H_ #define _RHOSYSTEM_H_ #include "RhoPort.h" #if defined OS_LINUX || defined OS_FREEBSD || defined OS_MACOSX #include #endif namespace rho{ namespace common{ class CSystem{ public: CSystem(){} static unsigned int getThreadID(); }; inline unsigned int CSystem::getThreadID(){ // On Linux and FreeBSD, we try to use gettid(). #if defined OS_LINUX || defined OS_FREEBSD || defined OS_MACOSX #ifndef __NR_gettid #ifdef OS_MACOSX #define __NR_gettid SYS_gettid #elif ! defined __i386__ #error "Must define __NR_gettid for non-x86 platforms" #else #define __NR_gettid 224 #endif #endif static bool lacks_gettid = false; if (!lacks_gettid) { pid_t tid = syscall(__NR_gettid); if (tid != -1) { return tid; } // Technically, this variable has to be volatile, but there is a small // performance penalty in accessing volatile variables and there should // not be any serious adverse effect if a thread does not immediately see // the value change to "true". lacks_gettid = true; } #endif // OS_LINUX || OS_FREEBSD // If gettid() could not be used, we use one of the following. #if defined OS_LINUX return getpid(); // Linux: getpid returns thread ID when gettid is absent #elif defined(WINDOWS_PLATFORM) || defined(OS_CYGWIN) return GetCurrentThreadId(); #else // If none of the techniques above worked, we use pthread_self(). return (pid_t)(int64)pthread_self(); #endif } } } #endif //_RHOFILEPATH_H_