Home | History | Annotate | Download | only in openjdkjvmti
      1 /* Copyright (C) 2017 The Android Open Source Project
      2  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
      3  *
      4  * This file implements interfaces from the file jvmti.h. This implementation
      5  * is licensed under the same terms as the file jvmti.h.  The
      6  * copyright and license information for the file jvmti.h follows.
      7  *
      8  * Copyright (c) 2003, 2011, Oracle and/or its affiliates. All rights reserved.
      9  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
     10  *
     11  * This code is free software; you can redistribute it and/or modify it
     12  * under the terms of the GNU General Public License version 2 only, as
     13  * published by the Free Software Foundation.  Oracle designates this
     14  * particular file as subject to the "Classpath" exception as provided
     15  * by Oracle in the LICENSE file that accompanied this code.
     16  *
     17  * This code is distributed in the hope that it will be useful, but WITHOUT
     18  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
     19  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
     20  * version 2 for more details (a copy is included in the LICENSE file that
     21  * accompanied this code).
     22  *
     23  * You should have received a copy of the GNU General Public License version
     24  * 2 along with this work; if not, write to the Free Software Foundation,
     25  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
     26  *
     27  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
     28  * or visit www.oracle.com if you need additional information or have any
     29  * questions.
     30  */
     31 
     32 #include "ti_timers.h"
     33 
     34 #include <limits>
     35 
     36 #ifndef __APPLE__
     37 #include <time.h>
     38 #else
     39 #include <sys/time.h>
     40 #endif
     41 #include <unistd.h>
     42 
     43 #include "art_jvmti.h"
     44 #include "base/macros.h"
     45 
     46 namespace openjdkjvmti {
     47 
     48 jvmtiError TimerUtil::GetAvailableProcessors(jvmtiEnv* env ATTRIBUTE_UNUSED,
     49                                              jint* processor_count_ptr) {
     50   if (processor_count_ptr == nullptr) {
     51     return ERR(NULL_POINTER);
     52   }
     53 
     54   *processor_count_ptr = static_cast<jint>(sysconf(_SC_NPROCESSORS_CONF));
     55 
     56   return ERR(NONE);
     57 }
     58 
     59 jvmtiError TimerUtil::GetTimerInfo(jvmtiEnv* env ATTRIBUTE_UNUSED, jvmtiTimerInfo* info_ptr) {
     60   if (info_ptr == nullptr) {
     61     return ERR(NULL_POINTER);
     62   }
     63 
     64   info_ptr->max_value = static_cast<jlong>(std::numeric_limits<uint64_t>::max());
     65   info_ptr->may_skip_forward = JNI_TRUE;
     66   info_ptr->may_skip_backward = JNI_TRUE;
     67   info_ptr->kind = jvmtiTimerKind::JVMTI_TIMER_ELAPSED;
     68 
     69   return ERR(NONE);
     70 }
     71 
     72 jvmtiError TimerUtil::GetTime(jvmtiEnv* env ATTRIBUTE_UNUSED, jlong* nanos_ptr) {
     73   if (nanos_ptr == nullptr) {
     74     return ERR(NULL_POINTER);
     75   }
     76 
     77 #ifndef __APPLE__
     78   // Use the same implementation as System.nanoTime.
     79   struct timespec now;
     80   clock_gettime(CLOCK_MONOTONIC, &now);
     81   *nanos_ptr = now.tv_sec * 1000000000LL + now.tv_nsec;
     82 #else
     83   // No CLOCK_MONOTONIC support on older Mac OS.
     84   struct timeval t;
     85   t.tv_sec = t.tv_usec = 0;
     86   gettimeofday(&t, NULL);
     87   *nanos_ptr = static_cast<jlong>(t.tv_sec)*1000000000LL + static_cast<jlong>(t.tv_usec)*1000LL;
     88 #endif
     89 
     90   return ERR(NONE);
     91 }
     92 
     93 }  // namespace openjdkjvmti
     94