44 // independent, therefore the BasicLock is free to move. 45 // 46 // During OSR we may need to relocate a BasicLock (which contains a 47 // displaced word) from a location in an interpreter frame to a 48 // new location in a compiled frame. "this" refers to the source 49 // basiclock in the interpreter frame. "dest" refers to the destination 50 // basiclock in the new compiled frame. We *always* inflate in move_to(). 51 // The always-Inflate policy works properly, but in 1.5.0 it can sometimes 52 // cause performance problems in code that makes heavy use of a small # of 53 // uncontended locks. (We'd inflate during OSR, and then sync performance 54 // would subsequently plummet because the thread would be forced thru the slow-path). 55 // This problem has been made largely moot on IA32 by inlining the inflated fast-path 56 // operations in Fast_Lock and Fast_Unlock in i486.ad. 57 // 58 // Note that there is a way to safely swing the object's markword from 59 // one stack location to another. This avoids inflation. Obviously, 60 // we need to ensure that both locations refer to the current thread's stack. 61 // There are some subtle concurrency issues, however, and since the benefit is 62 // is small (given the support for inflated fast-path locking in the fast_lock, etc) 63 // we'll leave that optimization for another time. 64 65 if (displaced_header()->is_neutral()) { 66 ObjectSynchronizer::inflate_helper(obj); 67 // WARNING: We can not put check here, because the inflation 68 // will not update the displaced header. Once BasicLock is inflated, 69 // no one should ever look at its content. 70 } else { 71 // Typically the displaced header will be 0 (recursive stack lock) or 72 // unused_mark. Naively we'd like to assert that the displaced mark 73 // value is either 0, neutral, or 3. But with the advent of the 74 // store-before-CAS avoidance in fast_lock/compiler_lock_object 75 // we can find any flavor mark in the displaced mark. 76 } 77 // [RGV] The next line appears to do nothing! 78 intptr_t dh = (intptr_t) displaced_header(); 79 dest->set_displaced_header(displaced_header()); 80 } | 44 // independent, therefore the BasicLock is free to move. 45 // 46 // During OSR we may need to relocate a BasicLock (which contains a 47 // displaced word) from a location in an interpreter frame to a 48 // new location in a compiled frame. "this" refers to the source 49 // basiclock in the interpreter frame. "dest" refers to the destination 50 // basiclock in the new compiled frame. We *always* inflate in move_to(). 51 // The always-Inflate policy works properly, but in 1.5.0 it can sometimes 52 // cause performance problems in code that makes heavy use of a small # of 53 // uncontended locks. (We'd inflate during OSR, and then sync performance 54 // would subsequently plummet because the thread would be forced thru the slow-path). 55 // This problem has been made largely moot on IA32 by inlining the inflated fast-path 56 // operations in Fast_Lock and Fast_Unlock in i486.ad. 57 // 58 // Note that there is a way to safely swing the object's markword from 59 // one stack location to another. This avoids inflation. Obviously, 60 // we need to ensure that both locations refer to the current thread's stack. 61 // There are some subtle concurrency issues, however, and since the benefit is 62 // is small (given the support for inflated fast-path locking in the fast_lock, etc) 63 // we'll leave that optimization for another time. 64 if (obj->is_value()) { 65 // Ignore value types 66 return; 67 } 68 69 if (displaced_header()->is_neutral()) { 70 ObjectSynchronizer::inflate_helper(obj); 71 // WARNING: We can not put check here, because the inflation 72 // will not update the displaced header. Once BasicLock is inflated, 73 // no one should ever look at its content. 74 } else { 75 // Typically the displaced header will be 0 (recursive stack lock) or 76 // unused_mark. Naively we'd like to assert that the displaced mark 77 // value is either 0, neutral, or 3. But with the advent of the 78 // store-before-CAS avoidance in fast_lock/compiler_lock_object 79 // we can find any flavor mark in the displaced mark. 80 } 81 // [RGV] The next line appears to do nothing! 82 intptr_t dh = (intptr_t) displaced_header(); 83 dest->set_displaced_header(displaced_header()); 84 } |