comparison src/share/vm/gc_implementation/concurrentMarkSweep/compactibleFreeListSpace.cpp @ 14443:3205e78d8193

8029396: PPC64 (part 212): Several memory ordering fixes in C-code. Summary: memory ordering fixes in GC and other runtime code showing on PPC64. Reviewed-by: kvn, coleenp
author goetz
date Mon, 02 Dec 2013 10:26:14 +0100
parents 71180a6e5080
children 8a9bb7821e28 bbfbe9b06038
comparison
equal deleted inserted replaced
14442:1174c8abbdb6 14443:3205e78d8193
995 while (true) { 995 while (true) {
996 // We must do this until we get a consistent view of the object. 996 // We must do this until we get a consistent view of the object.
997 if (FreeChunk::indicatesFreeChunk(p)) { 997 if (FreeChunk::indicatesFreeChunk(p)) {
998 volatile FreeChunk* fc = (volatile FreeChunk*)p; 998 volatile FreeChunk* fc = (volatile FreeChunk*)p;
999 size_t res = fc->size(); 999 size_t res = fc->size();
1000
1001 // Bugfix for systems with weak memory model (PPC64/IA64). The
1002 // block's free bit was set and we have read the size of the
1003 // block. Acquire and check the free bit again. If the block is
1004 // still free, the read size is correct.
1005 OrderAccess::acquire();
1006
1000 // If the object is still a free chunk, return the size, else it 1007 // If the object is still a free chunk, return the size, else it
1001 // has been allocated so try again. 1008 // has been allocated so try again.
1002 if (FreeChunk::indicatesFreeChunk(p)) { 1009 if (FreeChunk::indicatesFreeChunk(p)) {
1003 assert(res != 0, "Block size should not be 0"); 1010 assert(res != 0, "Block size should not be 0");
1004 return res; 1011 return res;
1008 Klass* k = ((volatile oopDesc*)p)->klass_or_null(); 1015 Klass* k = ((volatile oopDesc*)p)->klass_or_null();
1009 if (k != NULL) { 1016 if (k != NULL) {
1010 assert(k->is_klass(), "Should really be klass oop."); 1017 assert(k->is_klass(), "Should really be klass oop.");
1011 oop o = (oop)p; 1018 oop o = (oop)p;
1012 assert(o->is_oop(true /* ignore mark word */), "Should be an oop."); 1019 assert(o->is_oop(true /* ignore mark word */), "Should be an oop.");
1020
1021 // Bugfix for systems with weak memory model (PPC64/IA64).
1022 // The object o may be an array. Acquire to make sure that the array
1023 // size (third word) is consistent.
1024 OrderAccess::acquire();
1025
1013 size_t res = o->size_given_klass(k); 1026 size_t res = o->size_given_klass(k);
1014 res = adjustObjectSize(res); 1027 res = adjustObjectSize(res);
1015 assert(res != 0, "Block size should not be 0"); 1028 assert(res != 0, "Block size should not be 0");
1016 return res; 1029 return res;
1017 } 1030 }
1038 while (true) { 1051 while (true) {
1039 // We must do this until we get a consistent view of the object. 1052 // We must do this until we get a consistent view of the object.
1040 if (FreeChunk::indicatesFreeChunk(p)) { 1053 if (FreeChunk::indicatesFreeChunk(p)) {
1041 volatile FreeChunk* fc = (volatile FreeChunk*)p; 1054 volatile FreeChunk* fc = (volatile FreeChunk*)p;
1042 size_t res = fc->size(); 1055 size_t res = fc->size();
1056
1057 // Bugfix for systems with weak memory model (PPC64/IA64). The
1058 // free bit of the block was set and we have read the size of
1059 // the block. Acquire and check the free bit again. If the
1060 // block is still free, the read size is correct.
1061 OrderAccess::acquire();
1062
1043 if (FreeChunk::indicatesFreeChunk(p)) { 1063 if (FreeChunk::indicatesFreeChunk(p)) {
1044 assert(res != 0, "Block size should not be 0"); 1064 assert(res != 0, "Block size should not be 0");
1045 assert(loops == 0, "Should be 0"); 1065 assert(loops == 0, "Should be 0");
1046 return res; 1066 return res;
1047 } 1067 }
1053 // -- irrespective of its conc_safe-ty. 1073 // -- irrespective of its conc_safe-ty.
1054 if (k != NULL) { 1074 if (k != NULL) {
1055 assert(k->is_klass(), "Should really be klass oop."); 1075 assert(k->is_klass(), "Should really be klass oop.");
1056 oop o = (oop)p; 1076 oop o = (oop)p;
1057 assert(o->is_oop(), "Should be an oop"); 1077 assert(o->is_oop(), "Should be an oop");
1078
1079 // Bugfix for systems with weak memory model (PPC64/IA64).
1080 // The object o may be an array. Acquire to make sure that the array
1081 // size (third word) is consistent.
1082 OrderAccess::acquire();
1083
1058 size_t res = o->size_given_klass(k); 1084 size_t res = o->size_given_klass(k);
1059 res = adjustObjectSize(res); 1085 res = adjustObjectSize(res);
1060 assert(res != 0, "Block size should not be 0"); 1086 assert(res != 0, "Block size should not be 0");
1061 return res; 1087 return res;
1062 } else { 1088 } else {