src/share/vm/prims/jniFastGetField.hpp

Print this page


   1 /*
   2  * Copyright (c) 2004, Oracle and/or its affiliates. All rights reserved.
   3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
   4  *
   5  * This code is free software; you can redistribute it and/or modify it
   6  * under the terms of the GNU General Public License version 2 only, as
   7  * published by the Free Software Foundation.
   8  *
   9  * This code is distributed in the hope that it will be useful, but WITHOUT
  10  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  11  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
  12  * version 2 for more details (a copy is included in the LICENSE file that
  13  * accompanied this code).
  14  *
  15  * You should have received a copy of the GNU General Public License version
  16  * 2 along with this work; if not, write to the Free Software Foundation,
  17  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
  18  *
  19  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
  20  * or visit www.oracle.com if you need additional information or have any
  21  * questions.
  22  *
  23  */
  24 






  25 // Basic logic of a fast version of jni_Get<Primitive>Field:
  26 //
  27 // (See safepoint.hpp for a description of _safepoint_counter)
  28 //
  29 // load _safepoint_counter into old_counter
  30 // IF old_counter is odd THEN
  31 //   a safepoint is going on, return jni_GetXXXField
  32 // ELSE
  33 //   load the primitive field value into result (speculatively)
  34 //   load _safepoint_counter into new_counter
  35 //   IF (old_counter == new_counter) THEN
  36 //     no safepoint happened during the field access, return result
  37 //   ELSE
  38 //     a safepoint might have happened in-between, return jni_GetXXXField()
  39 //   ENDIF
  40 // ENDIF
  41 //
  42 // LoadLoad membars to maintain the load order may be necessary
  43 // for some platforms.
  44 //


  75   static address generate_fast_get_byte_field();
  76   static address generate_fast_get_char_field();
  77   static address generate_fast_get_short_field();
  78   static address generate_fast_get_int_field();
  79   static address generate_fast_get_long_field();
  80   static address generate_fast_get_float_field();
  81   static address generate_fast_get_double_field();
  82 
  83   // If pc is in speculative_load_pclist, return the corresponding
  84   // slow case entry pc. Otherwise, return -1.
  85   // This is used by signal/exception handler to handle such case:
  86   // After an even safepoint counter is loaded and a fast field access
  87   // is about to begin, a GC kicks in and shrinks the heap. Then the
  88   // field access may fault. The signal/exception handler needs to
  89   // return to the slow case.
  90   //
  91   // The GC may decide to temporarily stuff some bad values into handles,
  92   // for example, for debugging purpose, in which case we need the mapping also.
  93   static address find_slowcase_pc(address pc);
  94 };


   1 /*
   2  * Copyright (c) 2004, 2010, Oracle and/or its affiliates. All rights reserved.
   3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
   4  *
   5  * This code is free software; you can redistribute it and/or modify it
   6  * under the terms of the GNU General Public License version 2 only, as
   7  * published by the Free Software Foundation.
   8  *
   9  * This code is distributed in the hope that it will be useful, but WITHOUT
  10  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  11  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
  12  * version 2 for more details (a copy is included in the LICENSE file that
  13  * accompanied this code).
  14  *
  15  * You should have received a copy of the GNU General Public License version
  16  * 2 along with this work; if not, write to the Free Software Foundation,
  17  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
  18  *
  19  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
  20  * or visit www.oracle.com if you need additional information or have any
  21  * questions.
  22  *
  23  */
  24 
  25 #ifndef SHARE_VM_PRIMS_JNIFASTGETFIELD_HPP
  26 #define SHARE_VM_PRIMS_JNIFASTGETFIELD_HPP
  27 
  28 #include "memory/allocation.hpp"
  29 #include "prims/jvm_misc.hpp"
  30 
  31 // Basic logic of a fast version of jni_Get<Primitive>Field:
  32 //
  33 // (See safepoint.hpp for a description of _safepoint_counter)
  34 //
  35 // load _safepoint_counter into old_counter
  36 // IF old_counter is odd THEN
  37 //   a safepoint is going on, return jni_GetXXXField
  38 // ELSE
  39 //   load the primitive field value into result (speculatively)
  40 //   load _safepoint_counter into new_counter
  41 //   IF (old_counter == new_counter) THEN
  42 //     no safepoint happened during the field access, return result
  43 //   ELSE
  44 //     a safepoint might have happened in-between, return jni_GetXXXField()
  45 //   ENDIF
  46 // ENDIF
  47 //
  48 // LoadLoad membars to maintain the load order may be necessary
  49 // for some platforms.
  50 //


  81   static address generate_fast_get_byte_field();
  82   static address generate_fast_get_char_field();
  83   static address generate_fast_get_short_field();
  84   static address generate_fast_get_int_field();
  85   static address generate_fast_get_long_field();
  86   static address generate_fast_get_float_field();
  87   static address generate_fast_get_double_field();
  88 
  89   // If pc is in speculative_load_pclist, return the corresponding
  90   // slow case entry pc. Otherwise, return -1.
  91   // This is used by signal/exception handler to handle such case:
  92   // After an even safepoint counter is loaded and a fast field access
  93   // is about to begin, a GC kicks in and shrinks the heap. Then the
  94   // field access may fault. The signal/exception handler needs to
  95   // return to the slow case.
  96   //
  97   // The GC may decide to temporarily stuff some bad values into handles,
  98   // for example, for debugging purpose, in which case we need the mapping also.
  99   static address find_slowcase_pc(address pc);
 100 };
 101 
 102 #endif // SHARE_VM_PRIMS_JNIFASTGETFIELD_HPP