1942 if (PrintFLSStatistics != 0) {
1943 gclog_or_tty->print("After GC:\n");
1944 reportFreeListStatistics();
1945 }
1946 }
1947
1948 // Iteration support, mostly delegated from a CMS generation
1949
1950 void CompactibleFreeListSpace::save_marks() {
1951 assert(Thread::current()->is_VM_thread(),
1952 "Global variable should only be set when single-threaded");
1953 // Mark the "end" of the used space at the time of this call;
1954 // note, however, that promoted objects from this point
1955 // on are tracked in the _promoInfo below.
1956 set_saved_mark_word(unallocated_block());
1957 #ifdef ASSERT
1958 // Check the sanity of save_marks() etc.
1959 MemRegion ur = used_region();
1960 MemRegion urasm = used_region_at_save_marks();
1961 assert(ur.contains(urasm),
1962 err_msg(" Error at save_marks(): [" PTR_FORMAT "," PTR_FORMAT ")"
1963 " should contain [" PTR_FORMAT "," PTR_FORMAT ")",
1964 p2i(ur.start()), p2i(ur.end()), p2i(urasm.start()), p2i(urasm.end())));
1965 #endif
1966 // inform allocator that promotions should be tracked.
1967 assert(_promoInfo.noPromotions(), "_promoInfo inconsistency");
1968 _promoInfo.startTrackingPromotions();
1969 }
1970
1971 bool CompactibleFreeListSpace::no_allocs_since_save_marks() {
1972 assert(_promoInfo.tracking(), "No preceding save_marks?");
1973 return _promoInfo.noPromotions();
1974 }
1975
1976 #define CFLS_OOP_SINCE_SAVE_MARKS_DEFN(OopClosureType, nv_suffix) \
1977 \
1978 void CompactibleFreeListSpace:: \
1979 oop_since_save_marks_iterate##nv_suffix(OopClosureType* blk) { \
1980 _promoInfo.promoted_oops_iterate##nv_suffix(blk); \
1981 /* \
1982 * This also restores any displaced headers and removes the elements from \
1983 * the iteration set as they are processed, so that we have a clean slate \
1984 * at the end of the iteration. Note, thus, that if new objects are \
2858 OrderAccess::storestore();
2859 _bt.split_block((HeapWord*)fc, fc->size(), prefix_size);
2860 assert(fc->is_free(), "Error");
2861 fc->set_size(prefix_size);
2862 if (rem >= IndexSetSize) {
2863 returnChunkToDictionary(rem_fc);
2864 dictionary()->dict_census_update(rem, true /*split*/, true /*birth*/);
2865 rem_fc = NULL;
2866 }
2867 // Otherwise, return it to the small list below.
2868 }
2869 }
2870 if (rem_fc != NULL) {
2871 MutexLockerEx x(_indexedFreeListParLocks[rem],
2872 Mutex::_no_safepoint_check_flag);
2873 _bt.verify_not_unallocated((HeapWord*)rem_fc, rem_fc->size());
2874 _indexedFreeList[rem].return_chunk_at_head(rem_fc);
2875 smallSplitBirth(rem);
2876 }
2877 assert(n * word_sz == fc->size(),
2878 err_msg("Chunk size " SIZE_FORMAT " is not exactly splittable by "
2879 SIZE_FORMAT " sized chunks of size " SIZE_FORMAT,
2880 fc->size(), n, word_sz));
2881 return fc;
2882 }
2883
2884 void CompactibleFreeListSpace:: par_get_chunk_of_blocks_dictionary(size_t word_sz, size_t targetted_number_of_chunks, AdaptiveFreeList<FreeChunk>* fl) {
2885
2886 FreeChunk* fc = get_n_way_chunk_to_split(word_sz, targetted_number_of_chunks);
2887
2888 if (fc == NULL) {
2889 return;
2890 }
2891
2892 size_t n = fc->size() / word_sz;
2893
2894 assert((ssize_t)n > 0, "Consistency");
2895 // Now do the splitting up.
2896 // Must do this in reverse order, so that anybody attempting to
2897 // access the main chunk sees it as a single free block until we
2898 // change it.
2899 size_t fc_size = n * word_sz;
2900 // All but first chunk in this loop
|
1942 if (PrintFLSStatistics != 0) {
1943 gclog_or_tty->print("After GC:\n");
1944 reportFreeListStatistics();
1945 }
1946 }
1947
1948 // Iteration support, mostly delegated from a CMS generation
1949
1950 void CompactibleFreeListSpace::save_marks() {
1951 assert(Thread::current()->is_VM_thread(),
1952 "Global variable should only be set when single-threaded");
1953 // Mark the "end" of the used space at the time of this call;
1954 // note, however, that promoted objects from this point
1955 // on are tracked in the _promoInfo below.
1956 set_saved_mark_word(unallocated_block());
1957 #ifdef ASSERT
1958 // Check the sanity of save_marks() etc.
1959 MemRegion ur = used_region();
1960 MemRegion urasm = used_region_at_save_marks();
1961 assert(ur.contains(urasm),
1962 " Error at save_marks(): [" PTR_FORMAT "," PTR_FORMAT ")"
1963 " should contain [" PTR_FORMAT "," PTR_FORMAT ")",
1964 p2i(ur.start()), p2i(ur.end()), p2i(urasm.start()), p2i(urasm.end()));
1965 #endif
1966 // inform allocator that promotions should be tracked.
1967 assert(_promoInfo.noPromotions(), "_promoInfo inconsistency");
1968 _promoInfo.startTrackingPromotions();
1969 }
1970
1971 bool CompactibleFreeListSpace::no_allocs_since_save_marks() {
1972 assert(_promoInfo.tracking(), "No preceding save_marks?");
1973 return _promoInfo.noPromotions();
1974 }
1975
1976 #define CFLS_OOP_SINCE_SAVE_MARKS_DEFN(OopClosureType, nv_suffix) \
1977 \
1978 void CompactibleFreeListSpace:: \
1979 oop_since_save_marks_iterate##nv_suffix(OopClosureType* blk) { \
1980 _promoInfo.promoted_oops_iterate##nv_suffix(blk); \
1981 /* \
1982 * This also restores any displaced headers and removes the elements from \
1983 * the iteration set as they are processed, so that we have a clean slate \
1984 * at the end of the iteration. Note, thus, that if new objects are \
2858 OrderAccess::storestore();
2859 _bt.split_block((HeapWord*)fc, fc->size(), prefix_size);
2860 assert(fc->is_free(), "Error");
2861 fc->set_size(prefix_size);
2862 if (rem >= IndexSetSize) {
2863 returnChunkToDictionary(rem_fc);
2864 dictionary()->dict_census_update(rem, true /*split*/, true /*birth*/);
2865 rem_fc = NULL;
2866 }
2867 // Otherwise, return it to the small list below.
2868 }
2869 }
2870 if (rem_fc != NULL) {
2871 MutexLockerEx x(_indexedFreeListParLocks[rem],
2872 Mutex::_no_safepoint_check_flag);
2873 _bt.verify_not_unallocated((HeapWord*)rem_fc, rem_fc->size());
2874 _indexedFreeList[rem].return_chunk_at_head(rem_fc);
2875 smallSplitBirth(rem);
2876 }
2877 assert(n * word_sz == fc->size(),
2878 "Chunk size " SIZE_FORMAT " is not exactly splittable by "
2879 SIZE_FORMAT " sized chunks of size " SIZE_FORMAT,
2880 fc->size(), n, word_sz);
2881 return fc;
2882 }
2883
2884 void CompactibleFreeListSpace:: par_get_chunk_of_blocks_dictionary(size_t word_sz, size_t targetted_number_of_chunks, AdaptiveFreeList<FreeChunk>* fl) {
2885
2886 FreeChunk* fc = get_n_way_chunk_to_split(word_sz, targetted_number_of_chunks);
2887
2888 if (fc == NULL) {
2889 return;
2890 }
2891
2892 size_t n = fc->size() / word_sz;
2893
2894 assert((ssize_t)n > 0, "Consistency");
2895 // Now do the splitting up.
2896 // Must do this in reverse order, so that anybody attempting to
2897 // access the main chunk sees it as a single free block until we
2898 // change it.
2899 size_t fc_size = n * word_sz;
2900 // All but first chunk in this loop
|