hotspot/src/share/vm/memory/resourceArea.hpp
changeset 18928 ac0163dd0a50
parent 14583 d70ee55535f4
child 22551 9bf46d16dcc6
equal deleted inserted replaced
18696:9f928b94b877 18928:ac0163dd0a50
     1 /*
     1 /*
     2  * Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved.
     2  * Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved.
     3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
     3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
     4  *
     4  *
     5  * This code is free software; you can redistribute it and/or modify it
     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
     6  * under the terms of the GNU General Public License version 2 only, as
     7  * published by the Free Software Foundation.
     7  * published by the Free Software Foundation.
    81 protected:
    81 protected:
    82   ResourceArea *_area;          // Resource area to stack allocate
    82   ResourceArea *_area;          // Resource area to stack allocate
    83   Chunk *_chunk;                // saved arena chunk
    83   Chunk *_chunk;                // saved arena chunk
    84   char *_hwm, *_max;
    84   char *_hwm, *_max;
    85   size_t _size_in_bytes;
    85   size_t _size_in_bytes;
       
    86 #ifdef ASSERT
       
    87   Thread* _thread;
       
    88   ResourceMark* _previous_resource_mark;
       
    89 #endif //ASSERT
    86 
    90 
    87   void initialize(Thread *thread) {
    91   void initialize(Thread *thread) {
    88     _area = thread->resource_area();
    92     _area = thread->resource_area();
    89     _chunk = _area->_chunk;
    93     _chunk = _area->_chunk;
    90     _hwm = _area->_hwm;
    94     _hwm = _area->_hwm;
    91     _max= _area->_max;
    95     _max= _area->_max;
    92     _size_in_bytes = _area->size_in_bytes();
    96     _size_in_bytes = _area->size_in_bytes();
    93     debug_only(_area->_nesting++;)
    97     debug_only(_area->_nesting++;)
    94     assert( _area->_nesting > 0, "must stack allocate RMs" );
    98     assert( _area->_nesting > 0, "must stack allocate RMs" );
       
    99 #ifdef ASSERT
       
   100     _thread = thread;
       
   101     _previous_resource_mark = thread->current_resource_mark();
       
   102     thread->set_current_resource_mark(this);
       
   103 #endif // ASSERT
    95   }
   104   }
    96  public:
   105  public:
    97 
   106 
    98 #ifndef ASSERT
   107 #ifndef ASSERT
    99   ResourceMark(Thread *thread) {
   108   ResourceMark(Thread *thread) {
   109   ResourceMark( ResourceArea *r ) :
   118   ResourceMark( ResourceArea *r ) :
   110     _area(r), _chunk(r->_chunk), _hwm(r->_hwm), _max(r->_max) {
   119     _area(r), _chunk(r->_chunk), _hwm(r->_hwm), _max(r->_max) {
   111     _size_in_bytes = r->_size_in_bytes;
   120     _size_in_bytes = r->_size_in_bytes;
   112     debug_only(_area->_nesting++;)
   121     debug_only(_area->_nesting++;)
   113     assert( _area->_nesting > 0, "must stack allocate RMs" );
   122     assert( _area->_nesting > 0, "must stack allocate RMs" );
       
   123 #ifdef ASSERT
       
   124     Thread* thread = ThreadLocalStorage::thread();
       
   125     if (thread != NULL) {
       
   126       _thread = thread;
       
   127       _previous_resource_mark = thread->current_resource_mark();
       
   128       thread->set_current_resource_mark(this);
       
   129     } else {
       
   130       _thread = NULL;
       
   131       _previous_resource_mark = NULL;
       
   132     }
       
   133 #endif // ASSERT
   114   }
   134   }
   115 
   135 
   116   void reset_to_mark() {
   136   void reset_to_mark() {
   117     if (UseMallocOnly) free_malloced_objects();
   137     if (UseMallocOnly) free_malloced_objects();
   118 
   138 
   135 
   155 
   136   ~ResourceMark() {
   156   ~ResourceMark() {
   137     assert( _area->_nesting > 0, "must stack allocate RMs" );
   157     assert( _area->_nesting > 0, "must stack allocate RMs" );
   138     debug_only(_area->_nesting--;)
   158     debug_only(_area->_nesting--;)
   139     reset_to_mark();
   159     reset_to_mark();
       
   160 #ifdef ASSERT
       
   161     if (_thread != NULL) {
       
   162       _thread->set_current_resource_mark(_previous_resource_mark);
       
   163     }
       
   164 #endif // ASSERT
   140   }
   165   }
   141 
   166 
   142 
   167 
   143  private:
   168  private:
   144   void free_malloced_objects()                                         PRODUCT_RETURN;
   169   void free_malloced_objects()                                         PRODUCT_RETURN;