Home | History | Annotate | Download | only in openjdkjvmti
      1 /* Copyright (C) 2018 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_logging.h"
     33 
     34 #include "art_jvmti.h"
     35 
     36 #include "base/mutex.h"
     37 #include "base/strlcpy.h"
     38 #include "thread-current-inl.h"
     39 
     40 namespace openjdkjvmti {
     41 
     42 jvmtiError LogUtil::GetLastError(jvmtiEnv* env, char** data) {
     43   if (env == nullptr || data == nullptr) {
     44     return ERR(INVALID_ENVIRONMENT);
     45   }
     46   ArtJvmTiEnv* tienv = ArtJvmTiEnv::AsArtJvmTiEnv(env);
     47   art::MutexLock mu(art::Thread::Current(), tienv->last_error_mutex_);
     48   if (tienv->last_error_.empty()) {
     49     return ERR(ABSENT_INFORMATION);
     50   }
     51   const size_t size = tienv->last_error_.size() + 1;
     52   char* out;
     53   jvmtiError err = tienv->Allocate(size, reinterpret_cast<unsigned char**>(&out));
     54   if (err != OK) {
     55     return err;
     56   }
     57   strlcpy(out, tienv->last_error_.c_str(), size);
     58   *data = out;
     59   return OK;
     60 }
     61 
     62 jvmtiError LogUtil::ClearLastError(jvmtiEnv* env) {
     63   if (env == nullptr) {
     64     return ERR(INVALID_ENVIRONMENT);
     65   }
     66   ArtJvmTiEnv* tienv = ArtJvmTiEnv::AsArtJvmTiEnv(env);
     67   art::MutexLock mu(art::Thread::Current(), tienv->last_error_mutex_);
     68   tienv->last_error_.clear();
     69   return OK;
     70 }
     71 
     72 }  // namespace openjdkjvmti
     73