Home | History | Annotate | Download | only in runtime
      1 /*
      2  * Copyright (C) 2011 The Android Open Source Project
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *      http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License.
     15  */
     16 
     17 #ifndef ART_RUNTIME_UTILS_H_
     18 #define ART_RUNTIME_UTILS_H_
     19 
     20 #include <pthread.h>
     21 
     22 #include <string>
     23 #include <vector>
     24 
     25 #include "base/logging.h"
     26 #include "base/stringpiece.h"
     27 #include "base/stringprintf.h"
     28 #include "globals.h"
     29 #include "primitive.h"
     30 
     31 namespace art {
     32 
     33 class DexFile;
     34 
     35 namespace mirror {
     36 class ArtField;
     37 class ArtMethod;
     38 class Class;
     39 class Object;
     40 class String;
     41 }  // namespace mirror
     42 
     43 enum TimeUnit {
     44   kTimeUnitNanosecond,
     45   kTimeUnitMicrosecond,
     46   kTimeUnitMillisecond,
     47   kTimeUnitSecond,
     48 };
     49 
     50 template<typename T>
     51 static inline bool IsPowerOfTwo(T x) {
     52   return (x & (x - 1)) == 0;
     53 }
     54 
     55 template<int n, typename T>
     56 static inline bool IsAligned(T x) {
     57   COMPILE_ASSERT((n & (n - 1)) == 0, n_not_power_of_two);
     58   return (x & (n - 1)) == 0;
     59 }
     60 
     61 template<int n, typename T>
     62 static inline bool IsAligned(T* x) {
     63   return IsAligned<n>(reinterpret_cast<const uintptr_t>(x));
     64 }
     65 
     66 #define CHECK_ALIGNED(value, alignment) \
     67   CHECK(::art::IsAligned<alignment>(value)) << reinterpret_cast<const void*>(value)
     68 
     69 #define DCHECK_ALIGNED(value, alignment) \
     70   DCHECK(::art::IsAligned<alignment>(value)) << reinterpret_cast<const void*>(value)
     71 
     72 // Check whether an N-bit two's-complement representation can hold value.
     73 static inline bool IsInt(int N, word value) {
     74   CHECK_LT(0, N);
     75   CHECK_LT(N, kBitsPerWord);
     76   word limit = static_cast<word>(1) << (N - 1);
     77   return (-limit <= value) && (value < limit);
     78 }
     79 
     80 static inline bool IsUint(int N, word value) {
     81   CHECK_LT(0, N);
     82   CHECK_LT(N, kBitsPerWord);
     83   word limit = static_cast<word>(1) << N;
     84   return (0 <= value) && (value < limit);
     85 }
     86 
     87 static inline bool IsAbsoluteUint(int N, word value) {
     88   CHECK_LT(0, N);
     89   CHECK_LT(N, kBitsPerWord);
     90   if (value < 0) value = -value;
     91   return IsUint(N, value);
     92 }
     93 
     94 static inline uint16_t Low16Bits(uint32_t value) {
     95   return static_cast<uint16_t>(value);
     96 }
     97 
     98 static inline uint16_t High16Bits(uint32_t value) {
     99   return static_cast<uint16_t>(value >> 16);
    100 }
    101 
    102 static inline uint32_t Low32Bits(uint64_t value) {
    103   return static_cast<uint32_t>(value);
    104 }
    105 
    106 static inline uint32_t High32Bits(uint64_t value) {
    107   return static_cast<uint32_t>(value >> 32);
    108 }
    109 
    110 // A static if which determines whether to return type A or B based on the condition boolean.
    111 template <const bool condition, typename A, typename B>
    112 struct TypeStaticIf {
    113   typedef A value;
    114 };
    115 
    116 // Specialization to handle the false case.
    117 template <typename A, typename B>
    118 struct TypeStaticIf<false, A,  B> {
    119   typedef B value;
    120 };
    121 
    122 template<typename T>
    123 static inline T RoundDown(T x, int n) {
    124   CHECK(IsPowerOfTwo(n));
    125   return (x & -n);
    126 }
    127 
    128 template<typename T>
    129 static inline T RoundUp(T x, int n) {
    130   return RoundDown(x + n - 1, n);
    131 }
    132 
    133 // Implementation is from "Hacker's Delight" by Henry S. Warren, Jr.,
    134 // figure 3-3, page 48, where the function is called clp2.
    135 static inline uint32_t RoundUpToPowerOfTwo(uint32_t x) {
    136   x = x - 1;
    137   x = x | (x >> 1);
    138   x = x | (x >> 2);
    139   x = x | (x >> 4);
    140   x = x | (x >> 8);
    141   x = x | (x >> 16);
    142   return x + 1;
    143 }
    144 
    145 // Implementation is from "Hacker's Delight" by Henry S. Warren, Jr.,
    146 // figure 5-2, page 66, where the function is called pop.
    147 static inline int CountOneBits(uint32_t x) {
    148   x = x - ((x >> 1) & 0x55555555);
    149   x = (x & 0x33333333) + ((x >> 2) & 0x33333333);
    150   x = (x + (x >> 4)) & 0x0F0F0F0F;
    151   x = x + (x >> 8);
    152   x = x + (x >> 16);
    153   return static_cast<int>(x & 0x0000003F);
    154 }
    155 
    156 #define CLZ(x) __builtin_clz(x)
    157 #define CTZ(x) __builtin_ctz(x)
    158 
    159 static inline bool NeedsEscaping(uint16_t ch) {
    160   return (ch < ' ' || ch > '~');
    161 }
    162 
    163 static inline std::string PrintableChar(uint16_t ch) {
    164   std::string result;
    165   result += '\'';
    166   if (NeedsEscaping(ch)) {
    167     StringAppendF(&result, "\\u%04x", ch);
    168   } else {
    169     result += ch;
    170   }
    171   result += '\'';
    172   return result;
    173 }
    174 
    175 // Returns an ASCII string corresponding to the given UTF-8 string.
    176 // Java escapes are used for non-ASCII characters.
    177 std::string PrintableString(const std::string& utf8);
    178 
    179 // Tests whether 's' starts with 'prefix'.
    180 bool StartsWith(const std::string& s, const char* prefix);
    181 
    182 // Tests whether 's' starts with 'suffix'.
    183 bool EndsWith(const std::string& s, const char* suffix);
    184 
    185 // Used to implement PrettyClass, PrettyField, PrettyMethod, and PrettyTypeOf,
    186 // one of which is probably more useful to you.
    187 // Returns a human-readable equivalent of 'descriptor'. So "I" would be "int",
    188 // "[[I" would be "int[][]", "[Ljava/lang/String;" would be
    189 // "java.lang.String[]", and so forth.
    190 std::string PrettyDescriptor(const mirror::String* descriptor);
    191 std::string PrettyDescriptor(const std::string& descriptor);
    192 std::string PrettyDescriptor(Primitive::Type type);
    193 std::string PrettyDescriptor(const mirror::Class* klass)
    194     SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
    195 
    196 // Returns a human-readable signature for 'f'. Something like "a.b.C.f" or
    197 // "int a.b.C.f" (depending on the value of 'with_type').
    198 std::string PrettyField(const mirror::ArtField* f, bool with_type = true)
    199     SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
    200 std::string PrettyField(uint32_t field_idx, const DexFile& dex_file, bool with_type = true);
    201 
    202 // Returns a human-readable signature for 'm'. Something like "a.b.C.m" or
    203 // "a.b.C.m(II)V" (depending on the value of 'with_signature').
    204 std::string PrettyMethod(const mirror::ArtMethod* m, bool with_signature = true)
    205     SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
    206 std::string PrettyMethod(uint32_t method_idx, const DexFile& dex_file, bool with_signature = true);
    207 
    208 // Returns a human-readable form of the name of the *class* of the given object.
    209 // So given an instance of java.lang.String, the output would
    210 // be "java.lang.String". Given an array of int, the output would be "int[]".
    211 // Given String.class, the output would be "java.lang.Class<java.lang.String>".
    212 std::string PrettyTypeOf(const mirror::Object* obj)
    213     SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
    214 
    215 // Returns a human-readable form of the type at an index in the specified dex file.
    216 // Example outputs: char[], java.lang.String.
    217 std::string PrettyType(uint32_t type_idx, const DexFile& dex_file);
    218 
    219 // Returns a human-readable form of the name of the given class.
    220 // Given String.class, the output would be "java.lang.Class<java.lang.String>".
    221 std::string PrettyClass(const mirror::Class* c)
    222     SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
    223 
    224 // Returns a human-readable form of the name of the given class with its class loader.
    225 std::string PrettyClassAndClassLoader(const mirror::Class* c)
    226     SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
    227 
    228 // Returns a human-readable size string such as "1MB".
    229 std::string PrettySize(size_t size_in_bytes);
    230 
    231 // Returns a human-readable time string which prints every nanosecond while trying to limit the
    232 // number of trailing zeros. Prints using the largest human readable unit up to a second.
    233 // e.g. "1ms", "1.000000001s", "1.001us"
    234 std::string PrettyDuration(uint64_t nano_duration);
    235 
    236 // Format a nanosecond time to specified units.
    237 std::string FormatDuration(uint64_t nano_duration, TimeUnit time_unit);
    238 
    239 // Get the appropriate unit for a nanosecond duration.
    240 TimeUnit GetAppropriateTimeUnit(uint64_t nano_duration);
    241 
    242 // Get the divisor to convert from a nanoseconds to a time unit
    243 uint64_t GetNsToTimeUnitDivisor(TimeUnit time_unit);
    244 
    245 // Performs JNI name mangling as described in section 11.3 "Linking Native Methods"
    246 // of the JNI spec.
    247 std::string MangleForJni(const std::string& s);
    248 
    249 // Turn "java.lang.String" into "Ljava/lang/String;".
    250 std::string DotToDescriptor(const char* class_name);
    251 
    252 // Turn "Ljava/lang/String;" into "java.lang.String".
    253 std::string DescriptorToDot(const char* descriptor);
    254 
    255 // Turn "Ljava/lang/String;" into "java/lang/String".
    256 std::string DescriptorToName(const char* descriptor);
    257 
    258 // Tests for whether 's' is a valid class name in the three common forms:
    259 bool IsValidBinaryClassName(const char* s);  // "java.lang.String"
    260 bool IsValidJniClassName(const char* s);     // "java/lang/String"
    261 bool IsValidDescriptor(const char* s);       // "Ljava/lang/String;"
    262 
    263 // Returns whether the given string is a valid field or method name,
    264 // additionally allowing names that begin with '<' and end with '>'.
    265 bool IsValidMemberName(const char* s);
    266 
    267 // Returns the JNI native function name for the non-overloaded method 'm'.
    268 std::string JniShortName(const mirror::ArtMethod* m)
    269     SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
    270 // Returns the JNI native function name for the overloaded method 'm'.
    271 std::string JniLongName(const mirror::ArtMethod* m)
    272     SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
    273 
    274 bool ReadFileToString(const std::string& file_name, std::string* result);
    275 
    276 // Returns the current date in ISO yyyy-mm-dd hh:mm:ss format.
    277 std::string GetIsoDate();
    278 
    279 // Returns the monotonic time since some unspecified starting point in milliseconds.
    280 uint64_t MilliTime();
    281 
    282 // Returns the monotonic time since some unspecified starting point in microseconds.
    283 uint64_t MicroTime();
    284 
    285 // Returns the monotonic time since some unspecified starting point in nanoseconds.
    286 uint64_t NanoTime();
    287 
    288 // Returns the thread-specific CPU-time clock in nanoseconds or -1 if unavailable.
    289 uint64_t ThreadCpuNanoTime();
    290 
    291 // Converts the given number of nanoseconds to milliseconds.
    292 static constexpr inline uint64_t NsToMs(uint64_t ns) {
    293   return ns / 1000 / 1000;
    294 }
    295 
    296 // Converts the given number of milliseconds to nanoseconds
    297 static constexpr inline uint64_t MsToNs(uint64_t ns) {
    298   return ns * 1000 * 1000;
    299 }
    300 
    301 #if defined(__APPLE__)
    302 // No clocks to specify on OS/X, fake value to pass to routines that require a clock.
    303 #define CLOCK_REALTIME 0xebadf00d
    304 #endif
    305 
    306 // Sleep for the given number of nanoseconds, a bad way to handle contention.
    307 void NanoSleep(uint64_t ns);
    308 
    309 // Initialize a timespec to either an absolute or relative time.
    310 void InitTimeSpec(bool absolute, int clock, int64_t ms, int32_t ns, timespec* ts);
    311 
    312 // Splits a string using the given separator character into a vector of
    313 // strings. Empty strings will be omitted.
    314 void Split(const std::string& s, char separator, std::vector<std::string>& result);
    315 
    316 // Joins a vector of strings into a single string, using the given separator.
    317 template <typename StringT> std::string Join(std::vector<StringT>& strings, char separator);
    318 
    319 // Returns the calling thread's tid. (The C libraries don't expose this.)
    320 pid_t GetTid();
    321 
    322 // Returns the given thread's name.
    323 std::string GetThreadName(pid_t tid);
    324 
    325 // Returns details of the given thread's stack.
    326 void GetThreadStack(pthread_t thread, void*& stack_base, size_t& stack_size);
    327 
    328 // Reads data from "/proc/self/task/${tid}/stat".
    329 void GetTaskStats(pid_t tid, char& state, int& utime, int& stime, int& task_cpu);
    330 
    331 // Returns the name of the scheduler group for the given thread the current process, or the empty string.
    332 std::string GetSchedulerGroupName(pid_t tid);
    333 
    334 // Sets the name of the current thread. The name may be truncated to an
    335 // implementation-defined limit.
    336 void SetThreadName(const char* thread_name);
    337 
    338 // Dumps the native stack for thread 'tid' to 'os'.
    339 void DumpNativeStack(std::ostream& os, pid_t tid, const char* prefix = "", bool include_count = true);
    340 
    341 // Dumps the kernel stack for thread 'tid' to 'os'. Note that this is only available on linux-x86.
    342 void DumpKernelStack(std::ostream& os, pid_t tid, const char* prefix = "", bool include_count = true);
    343 
    344 // Find $ANDROID_ROOT, /system, or abort
    345 const char* GetAndroidRoot();
    346 
    347 // Find $ANDROID_DATA, /data, or abort
    348 const char* GetAndroidData();
    349 
    350 // Returns the dalvik-cache location, or dies trying.
    351 std::string GetDalvikCacheOrDie(const char* android_data);
    352 
    353 // Returns the dalvik-cache location for a DexFile or OatFile, or dies trying.
    354 std::string GetDalvikCacheFilenameOrDie(const std::string& location);
    355 
    356 // Check whether the given magic matches a known file type.
    357 bool IsZipMagic(uint32_t magic);
    358 bool IsDexMagic(uint32_t magic);
    359 bool IsOatMagic(uint32_t magic);
    360 
    361 class VoidFunctor {
    362  public:
    363   template <typename A>
    364   inline void operator() (A a) const {
    365     UNUSED(a);
    366   }
    367 
    368   template <typename A, typename B>
    369   inline void operator() (A a, B b) const {
    370     UNUSED(a);
    371     UNUSED(b);
    372   }
    373 
    374   template <typename A, typename B, typename C>
    375   inline void operator() (A a, B b, C c) const {
    376     UNUSED(a);
    377     UNUSED(b);
    378     UNUSED(c);
    379   }
    380 };
    381 
    382 }  // namespace art
    383 
    384 #endif  // ART_RUNTIME_UTILS_H_
    385