 |
HDF5
1.12.0
|
Go to the documentation of this file.
29 #if !(defined H5C_FRIEND || defined H5C_MODULE)
30 #error "Do not include this file outside the H5C package!"
48 #define H5C__MAX_EPOCH_MARKERS 10
51 #define H5C__HASH_TABLE_LEN (64 * 1024)
52 #define H5C__H5C_T_MAGIC 0x005CAC0E
55 #define H5C_FLUSH_DEP_PARENT_INIT 8
161 #if H5C_DO_SANITY_CHECKS
163 #define H5C__DLL_PRE_REMOVE_SC(entry_ptr, head_ptr, tail_ptr, len, Size, fv) \
164 if ( ( (head_ptr) == NULL ) || \
165 ( (tail_ptr) == NULL ) || \
166 ( (entry_ptr) == NULL ) || \
168 ( (Size) < (entry_ptr)->size ) || \
169 ( ( (entry_ptr)->prev == NULL ) && ( (head_ptr) != (entry_ptr) ) ) || \
170 ( ( (entry_ptr)->next == NULL ) && ( (tail_ptr) != (entry_ptr) ) ) || \
171 ( ( (len) == 1 ) && \
172 ( ! ( ( (head_ptr) == (entry_ptr) ) && \
173 ( (tail_ptr) == (entry_ptr) ) && \
174 ( (entry_ptr)->next == NULL ) && \
175 ( (entry_ptr)->prev == NULL ) && \
176 ( (Size) == (entry_ptr)->size ) \
181 HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, (fv), "DLL pre remove SC failed") \
184 #define H5C__DLL_SC(head_ptr, tail_ptr, len, Size, fv) \
185 if ( ( ( ( (head_ptr) == NULL ) || ( (tail_ptr) == NULL ) ) && \
186 ( (head_ptr) != (tail_ptr) ) \
190 ( ( (len) == 1 ) && \
191 ( ( (head_ptr) != (tail_ptr) ) || \
192 ( (head_ptr) == NULL ) || ( (head_ptr)->size != (Size) ) \
195 ( ( (len) >= 1 ) && \
196 ( ( (head_ptr) == NULL ) || ( (head_ptr)->prev != NULL ) || \
197 ( (tail_ptr) == NULL ) || ( (tail_ptr)->next != NULL ) \
201 HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, (fv), "DLL sanity check failed") \
204 #define H5C__DLL_PRE_INSERT_SC(entry_ptr, head_ptr, tail_ptr, len, Size, fv) \
205 if ( ( (entry_ptr) == NULL ) || \
206 ( (entry_ptr)->next != NULL ) || \
207 ( (entry_ptr)->prev != NULL ) || \
208 ( ( ( (head_ptr) == NULL ) || ( (tail_ptr) == NULL ) ) && \
209 ( (head_ptr) != (tail_ptr) ) \
211 ( ( (len) == 1 ) && \
212 ( ( (head_ptr) != (tail_ptr) ) || \
213 ( (head_ptr) == NULL ) || ( (head_ptr)->size != (Size) ) \
216 ( ( (len) >= 1 ) && \
217 ( ( (head_ptr) == NULL ) || ( (head_ptr)->prev != NULL ) || \
218 ( (tail_ptr) == NULL ) || ( (tail_ptr)->next != NULL ) \
222 HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, (fv), "DLL pre insert SC failed") \
225 #define H5C__DLL_PRE_SIZE_UPDATE_SC(dll_len, dll_size, old_size, new_size) \
226 if ( ( (dll_len) <= 0 ) || \
227 ( (dll_size) <= 0 ) || \
228 ( (old_size) <= 0 ) || \
229 ( (old_size) > (dll_size) ) || \
230 ( (new_size) <= 0 ) || \
231 ( ( (dll_len) == 1 ) && ( (old_size) != (dll_size) ) ) ) { \
232 HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "DLL pre size update SC failed") \
235 #define H5C__DLL_POST_SIZE_UPDATE_SC(dll_len, dll_size, old_size, new_size) \
236 if ( ( (new_size) > (dll_size) ) || \
237 ( ( (dll_len) == 1 ) && ( (new_size) != (dll_size) ) ) ) { \
238 HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "DLL post size update SC failed") \
243 #define H5C__DLL_PRE_REMOVE_SC(entry_ptr, head_ptr, tail_ptr, len, Size, fv)
244 #define H5C__DLL_SC(head_ptr, tail_ptr, len, Size, fv)
245 #define H5C__DLL_PRE_INSERT_SC(entry_ptr, head_ptr, tail_ptr, len, Size, fv)
246 #define H5C__DLL_PRE_SIZE_UPDATE_SC(dll_len, dll_size, old_size, new_size)
247 #define H5C__DLL_POST_SIZE_UPDATE_SC(dll_len, dll_size, old_size, new_size)
252 #define H5C__DLL_APPEND(entry_ptr, head_ptr, tail_ptr, len, Size, fail_val) \
254 H5C__DLL_PRE_INSERT_SC(entry_ptr, head_ptr, tail_ptr, len, Size, \
256 if ( (head_ptr) == NULL ) \
258 (head_ptr) = (entry_ptr); \
259 (tail_ptr) = (entry_ptr); \
263 (tail_ptr)->next = (entry_ptr); \
264 (entry_ptr)->prev = (tail_ptr); \
265 (tail_ptr) = (entry_ptr); \
268 (Size) += (entry_ptr)->size; \
271 #define H5C__DLL_PREPEND(entry_ptr, head_ptr, tail_ptr, len, Size, fail_val) \
273 H5C__DLL_PRE_INSERT_SC(entry_ptr, head_ptr, tail_ptr, len, Size, \
275 if ( (head_ptr) == NULL ) \
277 (head_ptr) = (entry_ptr); \
278 (tail_ptr) = (entry_ptr); \
282 (head_ptr)->prev = (entry_ptr); \
283 (entry_ptr)->next = (head_ptr); \
284 (head_ptr) = (entry_ptr); \
287 (Size) += entry_ptr->size; \
290 #define H5C__DLL_REMOVE(entry_ptr, head_ptr, tail_ptr, len, Size, fail_val) \
292 H5C__DLL_PRE_REMOVE_SC(entry_ptr, head_ptr, tail_ptr, len, Size, \
295 if ( (head_ptr) == (entry_ptr) ) \
297 (head_ptr) = (entry_ptr)->next; \
298 if ( (head_ptr) != NULL ) \
299 (head_ptr)->prev = NULL; \
302 (entry_ptr)->prev->next = (entry_ptr)->next; \
303 if ( (tail_ptr) == (entry_ptr) ) \
305 (tail_ptr) = (entry_ptr)->prev; \
306 if ( (tail_ptr) != NULL ) \
307 (tail_ptr)->next = NULL; \
310 (entry_ptr)->next->prev = (entry_ptr)->prev; \
311 entry_ptr->next = NULL; \
312 entry_ptr->prev = NULL; \
314 (Size) -= entry_ptr->size; \
318 #define H5C__DLL_UPDATE_FOR_SIZE_CHANGE(dll_len, dll_size, old_size, new_size) \
320 H5C__DLL_PRE_SIZE_UPDATE_SC(dll_len, dll_size, old_size, new_size) \
321 (dll_size) -= (old_size); \
322 (dll_size) += (new_size); \
323 H5C__DLL_POST_SIZE_UPDATE_SC(dll_len, dll_size, old_size, new_size) \
326 #if H5C_DO_SANITY_CHECKS
328 #define H5C__AUX_DLL_PRE_REMOVE_SC(entry_ptr, hd_ptr, tail_ptr, len, Size, fv) \
329 if ( ( (hd_ptr) == NULL ) || \
330 ( (tail_ptr) == NULL ) || \
331 ( (entry_ptr) == NULL ) || \
333 ( (Size) < (entry_ptr)->size ) || \
334 ( ( (Size) == (entry_ptr)->size ) && ( ! ( (len) == 1 ) ) ) || \
335 ( ( (entry_ptr)->aux_prev == NULL ) && ( (hd_ptr) != (entry_ptr) ) ) || \
336 ( ( (entry_ptr)->aux_next == NULL ) && ( (tail_ptr) != (entry_ptr) ) ) || \
337 ( ( (len) == 1 ) && \
338 ( ! ( ( (hd_ptr) == (entry_ptr) ) && ( (tail_ptr) == (entry_ptr) ) && \
339 ( (entry_ptr)->aux_next == NULL ) && \
340 ( (entry_ptr)->aux_prev == NULL ) && \
341 ( (Size) == (entry_ptr)->size ) \
346 HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, (fv), "aux DLL pre remove SC failed") \
349 #define H5C__AUX_DLL_SC(head_ptr, tail_ptr, len, Size, fv) \
350 if ( ( ( ( (head_ptr) == NULL ) || ( (tail_ptr) == NULL ) ) && \
351 ( (head_ptr) != (tail_ptr) ) \
355 ( ( (len) == 1 ) && \
356 ( ( (head_ptr) != (tail_ptr) ) || ( (Size) <= 0 ) || \
357 ( (head_ptr) == NULL ) || ( (head_ptr)->size != (Size) ) \
360 ( ( (len) >= 1 ) && \
361 ( ( (head_ptr) == NULL ) || ( (head_ptr)->aux_prev != NULL ) || \
362 ( (tail_ptr) == NULL ) || ( (tail_ptr)->aux_next != NULL ) \
366 HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, (fv), "AUX DLL sanity check failed") \
369 #define H5C__AUX_DLL_PRE_INSERT_SC(entry_ptr, hd_ptr, tail_ptr, len, Size, fv) \
370 if ( ( (entry_ptr) == NULL ) || \
371 ( (entry_ptr)->aux_next != NULL ) || \
372 ( (entry_ptr)->aux_prev != NULL ) || \
373 ( ( ( (hd_ptr) == NULL ) || ( (tail_ptr) == NULL ) ) && \
374 ( (hd_ptr) != (tail_ptr) ) \
376 ( ( (len) == 1 ) && \
377 ( ( (hd_ptr) != (tail_ptr) ) || ( (Size) <= 0 ) || \
378 ( (hd_ptr) == NULL ) || ( (hd_ptr)->size != (Size) ) \
381 ( ( (len) >= 1 ) && \
382 ( ( (hd_ptr) == NULL ) || ( (hd_ptr)->aux_prev != NULL ) || \
383 ( (tail_ptr) == NULL ) || ( (tail_ptr)->aux_next != NULL ) \
387 HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, (fv), "AUX DLL pre insert SC failed") \
392 #define H5C__AUX_DLL_PRE_REMOVE_SC(entry_ptr, hd_ptr, tail_ptr, len, Size, fv)
393 #define H5C__AUX_DLL_SC(head_ptr, tail_ptr, len, Size, fv)
394 #define H5C__AUX_DLL_PRE_INSERT_SC(entry_ptr, hd_ptr, tail_ptr, len, Size, fv)
399 #define H5C__AUX_DLL_APPEND(entry_ptr, head_ptr, tail_ptr, len, Size, fail_val)\
401 H5C__AUX_DLL_PRE_INSERT_SC(entry_ptr, head_ptr, tail_ptr, len, Size, \
403 if ( (head_ptr) == NULL ) \
405 (head_ptr) = (entry_ptr); \
406 (tail_ptr) = (entry_ptr); \
410 (tail_ptr)->aux_next = (entry_ptr); \
411 (entry_ptr)->aux_prev = (tail_ptr); \
412 (tail_ptr) = (entry_ptr); \
415 (Size) += entry_ptr->size; \
418 #define H5C__AUX_DLL_PREPEND(entry_ptr, head_ptr, tail_ptr, len, Size, fv) \
420 H5C__AUX_DLL_PRE_INSERT_SC(entry_ptr, head_ptr, tail_ptr, len, Size, fv) \
421 if ( (head_ptr) == NULL ) \
423 (head_ptr) = (entry_ptr); \
424 (tail_ptr) = (entry_ptr); \
428 (head_ptr)->aux_prev = (entry_ptr); \
429 (entry_ptr)->aux_next = (head_ptr); \
430 (head_ptr) = (entry_ptr); \
433 (Size) += entry_ptr->size; \
436 #define H5C__AUX_DLL_REMOVE(entry_ptr, head_ptr, tail_ptr, len, Size, fv) \
438 H5C__AUX_DLL_PRE_REMOVE_SC(entry_ptr, head_ptr, tail_ptr, len, Size, fv) \
440 if ( (head_ptr) == (entry_ptr) ) \
442 (head_ptr) = (entry_ptr)->aux_next; \
443 if ( (head_ptr) != NULL ) \
444 (head_ptr)->aux_prev = NULL; \
447 (entry_ptr)->aux_prev->aux_next = (entry_ptr)->aux_next; \
448 if ( (tail_ptr) == (entry_ptr) ) \
450 (tail_ptr) = (entry_ptr)->aux_prev; \
451 if ( (tail_ptr) != NULL ) \
452 (tail_ptr)->aux_next = NULL; \
455 (entry_ptr)->aux_next->aux_prev = (entry_ptr)->aux_prev; \
456 entry_ptr->aux_next = NULL; \
457 entry_ptr->aux_prev = NULL; \
459 (Size) -= entry_ptr->size; \
463 #if H5C_DO_SANITY_CHECKS
465 #define H5C__IL_DLL_PRE_REMOVE_SC(entry_ptr, hd_ptr, tail_ptr, len, Size, fv) \
466 if ( ( (hd_ptr) == NULL ) || \
467 ( (tail_ptr) == NULL ) || \
468 ( (entry_ptr) == NULL ) || \
470 ( (Size) < (entry_ptr)->size ) || \
471 ( ( (Size) == (entry_ptr)->size ) && ( ! ( (len) == 1 ) ) ) || \
472 ( ( (entry_ptr)->il_prev == NULL ) && ( (hd_ptr) != (entry_ptr) ) ) || \
473 ( ( (entry_ptr)->il_next == NULL ) && ( (tail_ptr) != (entry_ptr) ) ) || \
474 ( ( (len) == 1 ) && \
475 ( ! ( ( (hd_ptr) == (entry_ptr) ) && ( (tail_ptr) == (entry_ptr) ) && \
476 ( (entry_ptr)->il_next == NULL ) && \
477 ( (entry_ptr)->il_prev == NULL ) && \
478 ( (Size) == (entry_ptr)->size ) \
483 HDassert(0 && "il DLL pre remove SC failed"); \
484 HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, (fv), "il DLL pre remove SC failed") \
487 #define H5C__IL_DLL_PRE_INSERT_SC(entry_ptr, hd_ptr, tail_ptr, len, Size, fv) \
488 if ( ( (entry_ptr) == NULL ) || \
489 ( (entry_ptr)->il_next != NULL ) || \
490 ( (entry_ptr)->il_prev != NULL ) || \
491 ( ( ( (hd_ptr) == NULL ) || ( (tail_ptr) == NULL ) ) && \
492 ( (hd_ptr) != (tail_ptr) ) \
494 ( ( (len) == 1 ) && \
495 ( ( (hd_ptr) != (tail_ptr) ) || ( (Size) <= 0 ) || \
496 ( (hd_ptr) == NULL ) || ( (hd_ptr)->size != (Size) ) \
499 ( ( (len) >= 1 ) && \
500 ( ( (hd_ptr) == NULL ) || ( (hd_ptr)->il_prev != NULL ) || \
501 ( (tail_ptr) == NULL ) || ( (tail_ptr)->il_next != NULL ) \
505 HDassert(0 && "IL DLL pre insert SC failed"); \
506 HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, (fv), "IL DLL pre insert SC failed") \
509 #define H5C__IL_DLL_SC(head_ptr, tail_ptr, len, Size, fv) \
510 if ( ( ( ( (head_ptr) == NULL ) || ( (tail_ptr) == NULL ) ) && \
511 ( (head_ptr) != (tail_ptr) ) \
513 ( ( (len) == 1 ) && \
514 ( ( (head_ptr) != (tail_ptr) ) || \
515 ( (head_ptr) == NULL ) || ( (head_ptr)->size != (Size) ) \
518 ( ( (len) >= 1 ) && \
519 ( ( (head_ptr) == NULL ) || ( (head_ptr)->il_prev != NULL ) || \
520 ( (tail_ptr) == NULL ) || ( (tail_ptr)->il_next != NULL ) \
524 HDassert(0 && "IL DLL sanity check failed"); \
525 HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, (fv), "IL DLL sanity check failed") \
530 #define H5C__IL_DLL_PRE_REMOVE_SC(entry_ptr, hd_ptr, tail_ptr, len, Size, fv)
531 #define H5C__IL_DLL_PRE_INSERT_SC(entry_ptr, hd_ptr, tail_ptr, len, Size, fv)
532 #define H5C__IL_DLL_SC(head_ptr, tail_ptr, len, Size, fv)
537 #define H5C__IL_DLL_APPEND(entry_ptr, head_ptr, tail_ptr, len, Size, fail_val)\
539 H5C__IL_DLL_PRE_INSERT_SC(entry_ptr, head_ptr, tail_ptr, len, Size, \
541 if ( (head_ptr) == NULL ) \
543 (head_ptr) = (entry_ptr); \
544 (tail_ptr) = (entry_ptr); \
548 (tail_ptr)->il_next = (entry_ptr); \
549 (entry_ptr)->il_prev = (tail_ptr); \
550 (tail_ptr) = (entry_ptr); \
553 (Size) += entry_ptr->size; \
554 H5C__IL_DLL_SC(head_ptr, tail_ptr, len, Size, fail_val) \
557 #define H5C__IL_DLL_REMOVE(entry_ptr, head_ptr, tail_ptr, len, Size, fv) \
559 H5C__IL_DLL_PRE_REMOVE_SC(entry_ptr, head_ptr, tail_ptr, len, Size, fv) \
561 if ( (head_ptr) == (entry_ptr) ) \
563 (head_ptr) = (entry_ptr)->il_next; \
564 if ( (head_ptr) != NULL ) \
565 (head_ptr)->il_prev = NULL; \
568 (entry_ptr)->il_prev->il_next = (entry_ptr)->il_next; \
569 if ( (tail_ptr) == (entry_ptr) ) \
571 (tail_ptr) = (entry_ptr)->il_prev; \
572 if ( (tail_ptr) != NULL ) \
573 (tail_ptr)->il_next = NULL; \
576 (entry_ptr)->il_next->il_prev = (entry_ptr)->il_prev; \
577 entry_ptr->il_next = NULL; \
578 entry_ptr->il_prev = NULL; \
580 (Size) -= entry_ptr->size; \
582 H5C__IL_DLL_SC(head_ptr, tail_ptr, len, Size, fv) \
599 #define H5C__UPDATE_CACHE_HIT_RATE_STATS(cache_ptr, hit) \
600 (cache_ptr->cache_accesses)++; \
602 (cache_ptr->cache_hits)++; \
605 #if H5C_COLLECT_CACHE_STATS
607 #define H5C__UPDATE_MAX_INDEX_SIZE_STATS(cache_ptr) \
608 if ( (cache_ptr)->index_size > (cache_ptr)->max_index_size ) \
609 (cache_ptr)->max_index_size = (cache_ptr)->index_size; \
610 if ( (cache_ptr)->clean_index_size > \
611 (cache_ptr)->max_clean_index_size ) \
612 (cache_ptr)->max_clean_index_size = \
613 (cache_ptr)->clean_index_size; \
614 if ( (cache_ptr)->dirty_index_size > \
615 (cache_ptr)->max_dirty_index_size ) \
616 (cache_ptr)->max_dirty_index_size = \
617 (cache_ptr)->dirty_index_size;
619 #define H5C__UPDATE_STATS_FOR_DIRTY_PIN(cache_ptr, entry_ptr) \
620 (((cache_ptr)->dirty_pins)[(entry_ptr)->type->id])++;
622 #define H5C__UPDATE_STATS_FOR_UNPROTECT(cache_ptr) \
623 if ( (cache_ptr)->slist_len > (cache_ptr)->max_slist_len ) \
624 (cache_ptr)->max_slist_len = (cache_ptr)->slist_len; \
625 if ( (cache_ptr)->slist_size > (cache_ptr)->max_slist_size ) \
626 (cache_ptr)->max_slist_size = (cache_ptr)->slist_size; \
627 if ( (cache_ptr)->pel_len > (cache_ptr)->max_pel_len ) \
628 (cache_ptr)->max_pel_len = (cache_ptr)->pel_len; \
629 if ( (cache_ptr)->pel_size > (cache_ptr)->max_pel_size ) \
630 (cache_ptr)->max_pel_size = (cache_ptr)->pel_size;
632 #define H5C__UPDATE_STATS_FOR_MOVE(cache_ptr, entry_ptr) \
633 if ( cache_ptr->flush_in_progress ) \
634 ((cache_ptr)->cache_flush_moves[(entry_ptr)->type->id])++; \
635 if ( entry_ptr->flush_in_progress ) \
636 ((cache_ptr)->entry_flush_moves[(entry_ptr)->type->id])++; \
637 (((cache_ptr)->moves)[(entry_ptr)->type->id])++; \
638 (cache_ptr)->entries_relocated_counter++;
640 #define H5C__UPDATE_STATS_FOR_ENTRY_SIZE_CHANGE(cache_ptr, entry_ptr, new_size)\
641 if ( cache_ptr->flush_in_progress ) \
642 ((cache_ptr)->cache_flush_size_changes[(entry_ptr)->type->id])++; \
643 if ( entry_ptr->flush_in_progress ) \
644 ((cache_ptr)->entry_flush_size_changes[(entry_ptr)->type->id])++; \
645 if ( (entry_ptr)->size < (new_size) ) { \
646 ((cache_ptr)->size_increases[(entry_ptr)->type->id])++; \
647 H5C__UPDATE_MAX_INDEX_SIZE_STATS(cache_ptr) \
648 if ( (cache_ptr)->slist_size > (cache_ptr)->max_slist_size ) \
649 (cache_ptr)->max_slist_size = (cache_ptr)->slist_size; \
650 if ( (cache_ptr)->pl_size > (cache_ptr)->max_pl_size ) \
651 (cache_ptr)->max_pl_size = (cache_ptr)->pl_size; \
652 } else if ( (entry_ptr)->size > (new_size) ) { \
653 ((cache_ptr)->size_decreases[(entry_ptr)->type->id])++; \
656 #define H5C__UPDATE_STATS_FOR_HT_INSERTION(cache_ptr) \
657 (cache_ptr)->total_ht_insertions++;
659 #define H5C__UPDATE_STATS_FOR_HT_DELETION(cache_ptr) \
660 (cache_ptr)->total_ht_deletions++;
662 #define H5C__UPDATE_STATS_FOR_HT_SEARCH(cache_ptr, success, depth) \
664 (cache_ptr)->successful_ht_searches++; \
665 (cache_ptr)->total_successful_ht_search_depth += depth; \
667 (cache_ptr)->failed_ht_searches++; \
668 (cache_ptr)->total_failed_ht_search_depth += depth; \
671 #define H5C__UPDATE_STATS_FOR_UNPIN(cache_ptr, entry_ptr) \
672 ((cache_ptr)->unpins)[(entry_ptr)->type->id]++;
674 #define H5C__UPDATE_STATS_FOR_SLIST_SCAN_RESTART(cache_ptr) \
675 ((cache_ptr)->slist_scan_restarts)++;
677 #define H5C__UPDATE_STATS_FOR_LRU_SCAN_RESTART(cache_ptr) \
678 ((cache_ptr)->LRU_scan_restarts)++;
680 #define H5C__UPDATE_STATS_FOR_INDEX_SCAN_RESTART(cache_ptr) \
681 ((cache_ptr)->index_scan_restarts)++;
683 #define H5C__UPDATE_STATS_FOR_CACHE_IMAGE_CREATE(cache_ptr) \
685 (cache_ptr)->images_created++; \
688 #define H5C__UPDATE_STATS_FOR_CACHE_IMAGE_READ(cache_ptr) \
691 HDassert((cache_ptr)->image_len > 0); \
692 (cache_ptr)->images_read++; \
695 #define H5C__UPDATE_STATS_FOR_CACHE_IMAGE_LOAD(cache_ptr) \
698 HDassert((cache_ptr)->image_len > 0); \
699 (cache_ptr)->images_loaded++; \
700 (cache_ptr)->last_image_size = (cache_ptr)->image_len; \
703 #define H5C__UPDATE_STATS_FOR_PREFETCH(cache_ptr, dirty) \
705 (cache_ptr)->prefetches++; \
707 (cache_ptr)->dirty_prefetches++; \
710 #define H5C__UPDATE_STATS_FOR_PREFETCH_HIT(cache_ptr) \
712 (cache_ptr)->prefetch_hits++; \
715 #if H5C_COLLECT_CACHE_ENTRY_STATS
717 #define H5C__RESET_CACHE_ENTRY_STATS(entry_ptr) \
719 (entry_ptr)->accesses = 0; \
720 (entry_ptr)->clears = 0; \
721 (entry_ptr)->flushes = 0; \
722 (entry_ptr)->pins = 0; \
725 #define H5C__UPDATE_STATS_FOR_CLEAR(cache_ptr, entry_ptr) \
727 (((cache_ptr)->clears)[(entry_ptr)->type->id])++; \
728 if((entry_ptr)->is_pinned) \
729 (((cache_ptr)->pinned_clears)[(entry_ptr)->type->id])++; \
730 ((entry_ptr)->clears)++; \
733 #define H5C__UPDATE_STATS_FOR_FLUSH(cache_ptr, entry_ptr) \
735 (((cache_ptr)->flushes)[(entry_ptr)->type->id])++; \
736 if((entry_ptr)->is_pinned) \
737 (((cache_ptr)->pinned_flushes)[(entry_ptr)->type->id])++; \
738 ((entry_ptr)->flushes)++; \
741 #define H5C__UPDATE_STATS_FOR_EVICTION(cache_ptr, entry_ptr, take_ownership) \
743 if ( take_ownership ) \
744 (((cache_ptr)->take_ownerships)[(entry_ptr)->type->id])++; \
746 (((cache_ptr)->evictions)[(entry_ptr)->type->id])++; \
747 if ( (entry_ptr)->accesses > \
748 ((cache_ptr)->max_accesses)[(entry_ptr)->type->id] ) \
749 ((cache_ptr)->max_accesses)[(entry_ptr)->type->id] = \
750 (entry_ptr)->accesses; \
751 if ( (entry_ptr)->accesses < \
752 ((cache_ptr)->min_accesses)[(entry_ptr)->type->id] ) \
753 ((cache_ptr)->min_accesses)[(entry_ptr)->type->id] = \
754 (entry_ptr)->accesses; \
755 if ( (entry_ptr)->clears > \
756 ((cache_ptr)->max_clears)[(entry_ptr)->type->id] ) \
757 ((cache_ptr)->max_clears)[(entry_ptr)->type->id] \
758 = (entry_ptr)->clears; \
759 if ( (entry_ptr)->flushes > \
760 ((cache_ptr)->max_flushes)[(entry_ptr)->type->id] ) \
761 ((cache_ptr)->max_flushes)[(entry_ptr)->type->id] \
762 = (entry_ptr)->flushes; \
763 if ( (entry_ptr)->size > \
764 ((cache_ptr)->max_size)[(entry_ptr)->type->id] ) \
765 ((cache_ptr)->max_size)[(entry_ptr)->type->id] \
766 = (entry_ptr)->size; \
767 if ( (entry_ptr)->pins > \
768 ((cache_ptr)->max_pins)[(entry_ptr)->type->id] ) \
769 ((cache_ptr)->max_pins)[(entry_ptr)->type->id] \
770 = (entry_ptr)->pins; \
773 #define H5C__UPDATE_STATS_FOR_INSERTION(cache_ptr, entry_ptr) \
775 (((cache_ptr)->insertions)[(entry_ptr)->type->id])++; \
776 if ( (entry_ptr)->is_pinned ) { \
777 (((cache_ptr)->pinned_insertions)[(entry_ptr)->type->id])++; \
778 ((cache_ptr)->pins)[(entry_ptr)->type->id]++; \
779 (entry_ptr)->pins++; \
780 if ( (cache_ptr)->pel_len > (cache_ptr)->max_pel_len ) \
781 (cache_ptr)->max_pel_len = (cache_ptr)->pel_len; \
782 if ( (cache_ptr)->pel_size > (cache_ptr)->max_pel_size ) \
783 (cache_ptr)->max_pel_size = (cache_ptr)->pel_size; \
785 if ( (cache_ptr)->index_len > (cache_ptr)->max_index_len ) \
786 (cache_ptr)->max_index_len = (cache_ptr)->index_len; \
787 H5C__UPDATE_MAX_INDEX_SIZE_STATS(cache_ptr) \
788 if ( (cache_ptr)->slist_len > (cache_ptr)->max_slist_len ) \
789 (cache_ptr)->max_slist_len = (cache_ptr)->slist_len; \
790 if ( (cache_ptr)->slist_size > (cache_ptr)->max_slist_size ) \
791 (cache_ptr)->max_slist_size = (cache_ptr)->slist_size; \
792 if ( (entry_ptr)->size > \
793 ((cache_ptr)->max_size)[(entry_ptr)->type->id] ) \
794 ((cache_ptr)->max_size)[(entry_ptr)->type->id] \
795 = (entry_ptr)->size; \
796 cache_ptr->entries_inserted_counter++; \
799 #define H5C__UPDATE_STATS_FOR_PROTECT(cache_ptr, entry_ptr, hit) \
802 ((cache_ptr)->hits)[(entry_ptr)->type->id]++; \
804 ((cache_ptr)->misses)[(entry_ptr)->type->id]++; \
805 if ( ! ((entry_ptr)->is_read_only) ) { \
806 ((cache_ptr)->write_protects)[(entry_ptr)->type->id]++; \
808 ((cache_ptr)->read_protects)[(entry_ptr)->type->id]++; \
809 if ( ((entry_ptr)->ro_ref_count) > \
810 ((cache_ptr)->max_read_protects)[(entry_ptr)->type->id] ) \
811 ((cache_ptr)->max_read_protects)[(entry_ptr)->type->id] = \
812 ((entry_ptr)->ro_ref_count); \
814 if ( (cache_ptr)->index_len > (cache_ptr)->max_index_len ) \
815 (cache_ptr)->max_index_len = (cache_ptr)->index_len; \
816 H5C__UPDATE_MAX_INDEX_SIZE_STATS(cache_ptr) \
817 if ( (cache_ptr)->pl_len > (cache_ptr)->max_pl_len ) \
818 (cache_ptr)->max_pl_len = (cache_ptr)->pl_len; \
819 if ( (cache_ptr)->pl_size > (cache_ptr)->max_pl_size ) \
820 (cache_ptr)->max_pl_size = (cache_ptr)->pl_size; \
821 if ( (entry_ptr)->size > \
822 ((cache_ptr)->max_size)[(entry_ptr)->type->id] ) \
823 ((cache_ptr)->max_size)[(entry_ptr)->type->id] = (entry_ptr)->size; \
824 ((entry_ptr)->accesses)++; \
827 #define H5C__UPDATE_STATS_FOR_PIN(cache_ptr, entry_ptr) \
829 ((cache_ptr)->pins)[(entry_ptr)->type->id]++; \
830 (entry_ptr)->pins++; \
831 if ( (cache_ptr)->pel_len > (cache_ptr)->max_pel_len ) \
832 (cache_ptr)->max_pel_len = (cache_ptr)->pel_len; \
833 if ( (cache_ptr)->pel_size > (cache_ptr)->max_pel_size ) \
834 (cache_ptr)->max_pel_size = (cache_ptr)->pel_size; \
839 #define H5C__RESET_CACHE_ENTRY_STATS(entry_ptr)
841 #define H5C__UPDATE_STATS_FOR_CLEAR(cache_ptr, entry_ptr) \
843 (((cache_ptr)->clears)[(entry_ptr)->type->id])++; \
844 if((entry_ptr)->is_pinned) \
845 (((cache_ptr)->pinned_clears)[(entry_ptr)->type->id])++; \
848 #define H5C__UPDATE_STATS_FOR_FLUSH(cache_ptr, entry_ptr) \
850 (((cache_ptr)->flushes)[(entry_ptr)->type->id])++; \
851 if ( (entry_ptr)->is_pinned ) \
852 (((cache_ptr)->pinned_flushes)[(entry_ptr)->type->id])++; \
855 #define H5C__UPDATE_STATS_FOR_EVICTION(cache_ptr, entry_ptr, take_ownership) \
857 if ( take_ownership ) \
858 (((cache_ptr)->take_ownerships)[(entry_ptr)->type->id])++; \
860 (((cache_ptr)->evictions)[(entry_ptr)->type->id])++; \
863 #define H5C__UPDATE_STATS_FOR_INSERTION(cache_ptr, entry_ptr) \
865 (((cache_ptr)->insertions)[(entry_ptr)->type->id])++; \
866 if ( (entry_ptr)->is_pinned ) { \
867 (((cache_ptr)->pinned_insertions)[(entry_ptr)->type->id])++; \
868 ((cache_ptr)->pins)[(entry_ptr)->type->id]++; \
869 if ( (cache_ptr)->pel_len > (cache_ptr)->max_pel_len ) \
870 (cache_ptr)->max_pel_len = (cache_ptr)->pel_len; \
871 if ( (cache_ptr)->pel_size > (cache_ptr)->max_pel_size ) \
872 (cache_ptr)->max_pel_size = (cache_ptr)->pel_size; \
874 if ( (cache_ptr)->index_len > (cache_ptr)->max_index_len ) \
875 (cache_ptr)->max_index_len = (cache_ptr)->index_len; \
876 H5C__UPDATE_MAX_INDEX_SIZE_STATS(cache_ptr) \
877 if ( (cache_ptr)->slist_len > (cache_ptr)->max_slist_len ) \
878 (cache_ptr)->max_slist_len = (cache_ptr)->slist_len; \
879 if ( (cache_ptr)->slist_size > (cache_ptr)->max_slist_size ) \
880 (cache_ptr)->max_slist_size = (cache_ptr)->slist_size; \
881 cache_ptr->entries_inserted_counter++; \
884 #define H5C__UPDATE_STATS_FOR_PROTECT(cache_ptr, entry_ptr, hit) \
887 ((cache_ptr)->hits)[(entry_ptr)->type->id]++; \
889 ((cache_ptr)->misses)[(entry_ptr)->type->id]++; \
890 if ( ! ((entry_ptr)->is_read_only) ) \
891 ((cache_ptr)->write_protects)[(entry_ptr)->type->id]++; \
893 ((cache_ptr)->read_protects)[(entry_ptr)->type->id]++; \
894 if ( ((entry_ptr)->ro_ref_count) > \
895 ((cache_ptr)->max_read_protects)[(entry_ptr)->type->id] ) \
896 ((cache_ptr)->max_read_protects)[(entry_ptr)->type->id] = \
897 ((entry_ptr)->ro_ref_count); \
899 if ( (cache_ptr)->index_len > (cache_ptr)->max_index_len ) \
900 (cache_ptr)->max_index_len = (cache_ptr)->index_len; \
901 H5C__UPDATE_MAX_INDEX_SIZE_STATS(cache_ptr) \
902 if ( (cache_ptr)->pl_len > (cache_ptr)->max_pl_len ) \
903 (cache_ptr)->max_pl_len = (cache_ptr)->pl_len; \
904 if ( (cache_ptr)->pl_size > (cache_ptr)->max_pl_size ) \
905 (cache_ptr)->max_pl_size = (cache_ptr)->pl_size; \
908 #define H5C__UPDATE_STATS_FOR_PIN(cache_ptr, entry_ptr) \
910 ((cache_ptr)->pins)[(entry_ptr)->type->id]++; \
911 if ( (cache_ptr)->pel_len > (cache_ptr)->max_pel_len ) \
912 (cache_ptr)->max_pel_len = (cache_ptr)->pel_len; \
913 if ( (cache_ptr)->pel_size > (cache_ptr)->max_pel_size ) \
914 (cache_ptr)->max_pel_size = (cache_ptr)->pel_size; \
921 #define H5C__RESET_CACHE_ENTRY_STATS(entry_ptr)
922 #define H5C__UPDATE_STATS_FOR_DIRTY_PIN(cache_ptr, entry_ptr)
923 #define H5C__UPDATE_STATS_FOR_UNPROTECT(cache_ptr)
924 #define H5C__UPDATE_STATS_FOR_MOVE(cache_ptr, entry_ptr)
925 #define H5C__UPDATE_STATS_FOR_ENTRY_SIZE_CHANGE(cache_ptr, entry_ptr, new_size)
926 #define H5C__UPDATE_STATS_FOR_HT_INSERTION(cache_ptr)
927 #define H5C__UPDATE_STATS_FOR_HT_DELETION(cache_ptr)
928 #define H5C__UPDATE_STATS_FOR_HT_SEARCH(cache_ptr, success, depth)
929 #define H5C__UPDATE_STATS_FOR_INSERTION(cache_ptr, entry_ptr)
930 #define H5C__UPDATE_STATS_FOR_CLEAR(cache_ptr, entry_ptr)
931 #define H5C__UPDATE_STATS_FOR_FLUSH(cache_ptr, entry_ptr)
932 #define H5C__UPDATE_STATS_FOR_EVICTION(cache_ptr, entry_ptr, take_ownership)
933 #define H5C__UPDATE_STATS_FOR_PROTECT(cache_ptr, entry_ptr, hit)
934 #define H5C__UPDATE_STATS_FOR_PIN(cache_ptr, entry_ptr)
935 #define H5C__UPDATE_STATS_FOR_UNPIN(cache_ptr, entry_ptr)
936 #define H5C__UPDATE_STATS_FOR_SLIST_SCAN_RESTART(cache_ptr)
937 #define H5C__UPDATE_STATS_FOR_LRU_SCAN_RESTART(cache_ptr)
938 #define H5C__UPDATE_STATS_FOR_INDEX_SCAN_RESTART(cache_ptr)
939 #define H5C__UPDATE_STATS_FOR_CACHE_IMAGE_CREATE(cache_ptr)
940 #define H5C__UPDATE_STATS_FOR_CACHE_IMAGE_READ(cache_ptr)
941 #define H5C__UPDATE_STATS_FOR_CACHE_IMAGE_LOAD(cache_ptr)
942 #define H5C__UPDATE_STATS_FOR_PREFETCH(cache_ptr, dirty)
943 #define H5C__UPDATE_STATS_FOR_PREFETCH_HIT(cache_ptr)
984 #define H5C__HASH_MASK ((size_t)(H5C__HASH_TABLE_LEN - 1) << 3)
986 #define H5C__HASH_FCN(x) (int)((unsigned)((x) & H5C__HASH_MASK) >> 3)
988 #if H5C_DO_SANITY_CHECKS
990 #define H5C__PRE_HT_INSERT_SC(cache_ptr, entry_ptr, fail_val) \
991 if ( ( (cache_ptr) == NULL ) || \
992 ( (cache_ptr)->magic != H5C__H5C_T_MAGIC ) || \
993 ( (entry_ptr) == NULL ) || \
994 ( ! H5F_addr_defined((entry_ptr)->addr) ) || \
995 ( (entry_ptr)->ht_next != NULL ) || \
996 ( (entry_ptr)->ht_prev != NULL ) || \
997 ( (entry_ptr)->size <= 0 ) || \
998 ( H5C__HASH_FCN((entry_ptr)->addr) < 0 ) || \
999 ( H5C__HASH_FCN((entry_ptr)->addr) >= H5C__HASH_TABLE_LEN ) || \
1000 ( (cache_ptr)->index_size != \
1001 ((cache_ptr)->clean_index_size + \
1002 (cache_ptr)->dirty_index_size) ) || \
1003 ( (cache_ptr)->index_size < ((cache_ptr)->clean_index_size) ) || \
1004 ( (cache_ptr)->index_size < ((cache_ptr)->dirty_index_size) ) || \
1005 ( (entry_ptr)->ring <= H5C_RING_UNDEFINED ) || \
1006 ( (entry_ptr)->ring >= H5C_RING_NTYPES ) || \
1007 ( (cache_ptr)->index_ring_len[(entry_ptr)->ring] > \
1008 (cache_ptr)->index_len ) || \
1009 ( (cache_ptr)->index_ring_size[(entry_ptr)->ring] > \
1010 (cache_ptr)->index_size ) || \
1011 ( (cache_ptr)->index_ring_size[(entry_ptr)->ring] != \
1012 ((cache_ptr)->clean_index_ring_size[(entry_ptr)->ring] + \
1013 (cache_ptr)->dirty_index_ring_size[(entry_ptr)->ring]) ) || \
1014 ( (cache_ptr)->index_len != (cache_ptr)->il_len ) || \
1015 ( (cache_ptr)->index_size != (cache_ptr)->il_size ) ) { \
1017 HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, fail_val, "pre HT insert SC failed") \
1020 #define H5C__POST_HT_INSERT_SC(cache_ptr, entry_ptr, fail_val) \
1021 if ( ( (cache_ptr) == NULL ) || \
1022 ( (cache_ptr)->magic != H5C__H5C_T_MAGIC ) || \
1023 ( (cache_ptr)->index_size != \
1024 ((cache_ptr)->clean_index_size + \
1025 (cache_ptr)->dirty_index_size) ) || \
1026 ( (cache_ptr)->index_size < ((cache_ptr)->clean_index_size) ) || \
1027 ( (cache_ptr)->index_size < ((cache_ptr)->dirty_index_size) ) || \
1028 ( (cache_ptr)->index_ring_len[(entry_ptr)->ring] == 0 ) || \
1029 ( (cache_ptr)->index_ring_len[(entry_ptr)->ring] > \
1030 (cache_ptr)->index_len ) || \
1031 ( (cache_ptr)->index_ring_size[(entry_ptr)->ring] > \
1032 (cache_ptr)->index_size ) || \
1033 ( (cache_ptr)->index_ring_size[(entry_ptr)->ring] != \
1034 ((cache_ptr)->clean_index_ring_size[(entry_ptr)->ring] + \
1035 (cache_ptr)->dirty_index_ring_size[(entry_ptr)->ring]) ) || \
1036 ( (cache_ptr)->index_len != (cache_ptr)->il_len ) || \
1037 ( (cache_ptr)->index_size != (cache_ptr)->il_size) ) { \
1039 HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, fail_val, "post HT insert SC failed") \
1042 #define H5C__PRE_HT_REMOVE_SC(cache_ptr, entry_ptr) \
1043 if ( ( (cache_ptr) == NULL ) || \
1044 ( (cache_ptr)->magic != H5C__H5C_T_MAGIC ) || \
1045 ( (cache_ptr)->index_len < 1 ) || \
1046 ( (entry_ptr) == NULL ) || \
1047 ( (cache_ptr)->index_size < (entry_ptr)->size ) || \
1048 ( ! H5F_addr_defined((entry_ptr)->addr) ) || \
1049 ( (entry_ptr)->size <= 0 ) || \
1050 ( H5C__HASH_FCN((entry_ptr)->addr) < 0 ) || \
1051 ( H5C__HASH_FCN((entry_ptr)->addr) >= H5C__HASH_TABLE_LEN ) || \
1052 ( ((cache_ptr)->index)[(H5C__HASH_FCN((entry_ptr)->addr))] \
1054 ( ( ((cache_ptr)->index)[(H5C__HASH_FCN((entry_ptr)->addr))] \
1055 != (entry_ptr) ) && \
1056 ( (entry_ptr)->ht_prev == NULL ) ) || \
1057 ( ( ((cache_ptr)->index)[(H5C__HASH_FCN((entry_ptr)->addr))] == \
1059 ( (entry_ptr)->ht_prev != NULL ) ) || \
1060 ( (cache_ptr)->index_size != \
1061 ((cache_ptr)->clean_index_size + \
1062 (cache_ptr)->dirty_index_size) ) || \
1063 ( (cache_ptr)->index_size < ((cache_ptr)->clean_index_size) ) || \
1064 ( (cache_ptr)->index_size < ((cache_ptr)->dirty_index_size) ) || \
1065 ( (entry_ptr)->ring <= H5C_RING_UNDEFINED ) || \
1066 ( (entry_ptr)->ring >= H5C_RING_NTYPES ) || \
1067 ( (cache_ptr)->index_ring_len[(entry_ptr)->ring] <= 0 ) || \
1068 ( (cache_ptr)->index_ring_len[(entry_ptr)->ring] > \
1069 (cache_ptr)->index_len ) || \
1070 ( (cache_ptr)->index_ring_size[(entry_ptr)->ring] < \
1071 (entry_ptr)->size ) || \
1072 ( (cache_ptr)->index_ring_size[(entry_ptr)->ring] > \
1073 (cache_ptr)->index_size ) || \
1074 ( (cache_ptr)->index_ring_size[(entry_ptr)->ring] != \
1075 ((cache_ptr)->clean_index_ring_size[(entry_ptr)->ring] + \
1076 (cache_ptr)->dirty_index_ring_size[(entry_ptr)->ring]) ) || \
1077 ( (cache_ptr)->index_len != (cache_ptr)->il_len ) || \
1078 ( (cache_ptr)->index_size != (cache_ptr)->il_size ) ) { \
1080 HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "pre HT remove SC failed") \
1083 #define H5C__POST_HT_REMOVE_SC(cache_ptr, entry_ptr) \
1084 if ( ( (cache_ptr) == NULL ) || \
1085 ( (cache_ptr)->magic != H5C__H5C_T_MAGIC ) || \
1086 ( (entry_ptr) == NULL ) || \
1087 ( ! H5F_addr_defined((entry_ptr)->addr) ) || \
1088 ( (entry_ptr)->size <= 0 ) || \
1089 ( (entry_ptr)->ht_prev != NULL ) || \
1090 ( (entry_ptr)->ht_prev != NULL ) || \
1091 ( (cache_ptr)->index_size != \
1092 ((cache_ptr)->clean_index_size + \
1093 (cache_ptr)->dirty_index_size) ) || \
1094 ( (cache_ptr)->index_size < ((cache_ptr)->clean_index_size) ) || \
1095 ( (cache_ptr)->index_size < ((cache_ptr)->dirty_index_size) ) || \
1096 ( (cache_ptr)->index_ring_len[(entry_ptr)->ring] > \
1097 (cache_ptr)->index_len ) || \
1098 ( (cache_ptr)->index_ring_size[(entry_ptr)->ring] > \
1099 (cache_ptr)->index_size ) || \
1100 ( (cache_ptr)->index_ring_size[(entry_ptr)->ring] != \
1101 ((cache_ptr)->clean_index_ring_size[(entry_ptr)->ring] + \
1102 (cache_ptr)->dirty_index_ring_size[(entry_ptr)->ring]) ) || \
1103 ( (cache_ptr)->index_len != (cache_ptr)->il_len ) || \
1104 ( (cache_ptr)->index_size != (cache_ptr)->il_size ) ) { \
1106 HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "post HT remove SC failed") \
1110 #define H5C__PRE_HT_SEARCH_SC(cache_ptr, Addr, fail_val) \
1111 if ( ( (cache_ptr) == NULL ) || \
1112 ( (cache_ptr)->magic != H5C__H5C_T_MAGIC ) || \
1113 ( (cache_ptr)->index_size != \
1114 ((cache_ptr)->clean_index_size + (cache_ptr)->dirty_index_size) ) || \
1115 ( ! H5F_addr_defined(Addr) ) || \
1116 ( H5C__HASH_FCN(Addr) < 0 ) || \
1117 ( H5C__HASH_FCN(Addr) >= H5C__HASH_TABLE_LEN ) ) { \
1118 HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, fail_val, "pre HT search SC failed") \
1122 #define H5C__POST_SUC_HT_SEARCH_SC(cache_ptr, entry_ptr, k, fail_val) \
1123 if ( ( (cache_ptr) == NULL ) || \
1124 ( (cache_ptr)->magic != H5C__H5C_T_MAGIC ) || \
1125 ( (cache_ptr)->index_len < 1 ) || \
1126 ( (entry_ptr) == NULL ) || \
1127 ( (cache_ptr)->index_size < (entry_ptr)->size ) || \
1128 ( (cache_ptr)->index_size != \
1129 ((cache_ptr)->clean_index_size + (cache_ptr)->dirty_index_size) ) || \
1130 ( (entry_ptr)->size <= 0 ) || \
1131 ( ((cache_ptr)->index)[k] == NULL ) || \
1132 ( ( ((cache_ptr)->index)[k] != (entry_ptr) ) && \
1133 ( (entry_ptr)->ht_prev == NULL ) ) || \
1134 ( ( ((cache_ptr)->index)[k] == (entry_ptr) ) && \
1135 ( (entry_ptr)->ht_prev != NULL ) ) || \
1136 ( ( (entry_ptr)->ht_prev != NULL ) && \
1137 ( (entry_ptr)->ht_prev->ht_next != (entry_ptr) ) ) || \
1138 ( ( (entry_ptr)->ht_next != NULL ) && \
1139 ( (entry_ptr)->ht_next->ht_prev != (entry_ptr) ) ) ) { \
1140 HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, fail_val, "post successful HT search SC failed") \
1144 #define H5C__POST_HT_SHIFT_TO_FRONT(cache_ptr, entry_ptr, k, fail_val) \
1145 if ( ( (cache_ptr) == NULL ) || \
1146 ( ((cache_ptr)->index)[k] != (entry_ptr) ) || \
1147 ( (entry_ptr)->ht_prev != NULL ) ) { \
1148 HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, fail_val, "post HT shift to front SC failed") \
1151 #define H5C__PRE_HT_ENTRY_SIZE_CHANGE_SC(cache_ptr, old_size, new_size, \
1152 entry_ptr, was_clean) \
1153 if ( ( (cache_ptr) == NULL ) || \
1154 ( (cache_ptr)->index_len <= 0 ) || \
1155 ( (cache_ptr)->index_size <= 0 ) || \
1156 ( (new_size) <= 0 ) || \
1157 ( (old_size) > (cache_ptr)->index_size ) || \
1158 ( ( (cache_ptr)->index_len == 1 ) && \
1159 ( (cache_ptr)->index_size != (old_size) ) ) || \
1160 ( (cache_ptr)->index_size != \
1161 ((cache_ptr)->clean_index_size + \
1162 (cache_ptr)->dirty_index_size) ) || \
1163 ( (cache_ptr)->index_size < ((cache_ptr)->clean_index_size) ) || \
1164 ( (cache_ptr)->index_size < ((cache_ptr)->dirty_index_size) ) || \
1165 ( ( !( was_clean ) || \
1166 ( (cache_ptr)->clean_index_size < (old_size) ) ) && \
1167 ( ( (was_clean) ) || \
1168 ( (cache_ptr)->dirty_index_size < (old_size) ) ) ) || \
1169 ( (entry_ptr) == NULL ) || \
1170 ( (entry_ptr)->ring <= H5C_RING_UNDEFINED ) || \
1171 ( (entry_ptr)->ring >= H5C_RING_NTYPES ) || \
1172 ( (cache_ptr)->index_ring_len[(entry_ptr)->ring] <= 0 ) || \
1173 ( (cache_ptr)->index_ring_len[(entry_ptr)->ring] > \
1174 (cache_ptr)->index_len ) || \
1175 ( (cache_ptr)->index_ring_size[(entry_ptr)->ring] > \
1176 (cache_ptr)->index_size ) || \
1177 ( (cache_ptr)->index_ring_size[(entry_ptr)->ring] != \
1178 ((cache_ptr)->clean_index_ring_size[(entry_ptr)->ring] + \
1179 (cache_ptr)->dirty_index_ring_size[(entry_ptr)->ring]) ) || \
1180 ( (cache_ptr)->index_len != (cache_ptr)->il_len ) || \
1181 ( (cache_ptr)->index_size != (cache_ptr)->il_size ) ) { \
1183 HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "pre HT entry size change SC failed") \
1186 #define H5C__POST_HT_ENTRY_SIZE_CHANGE_SC(cache_ptr, old_size, new_size, \
1188 if ( ( (cache_ptr) == NULL ) || \
1189 ( (cache_ptr)->index_len <= 0 ) || \
1190 ( (cache_ptr)->index_size <= 0 ) || \
1191 ( (new_size) > (cache_ptr)->index_size ) || \
1192 ( (cache_ptr)->index_size != \
1193 ((cache_ptr)->clean_index_size + \
1194 (cache_ptr)->dirty_index_size) ) || \
1195 ( (cache_ptr)->index_size < ((cache_ptr)->clean_index_size) ) || \
1196 ( (cache_ptr)->index_size < ((cache_ptr)->dirty_index_size) ) || \
1197 ( ( !((entry_ptr)->is_dirty ) || \
1198 ( (cache_ptr)->dirty_index_size < (new_size) ) ) && \
1199 ( ( ((entry_ptr)->is_dirty) ) || \
1200 ( (cache_ptr)->clean_index_size < (new_size) ) ) ) || \
1201 ( ( (cache_ptr)->index_len == 1 ) && \
1202 ( (cache_ptr)->index_size != (new_size) ) ) || \
1203 ( (cache_ptr)->index_ring_len[(entry_ptr)->ring] > \
1204 (cache_ptr)->index_len ) || \
1205 ( (cache_ptr)->index_ring_size[(entry_ptr)->ring] > \
1206 (cache_ptr)->index_size ) || \
1207 ( (cache_ptr)->index_ring_size[(entry_ptr)->ring] != \
1208 ((cache_ptr)->clean_index_ring_size[(entry_ptr)->ring] + \
1209 (cache_ptr)->dirty_index_ring_size[(entry_ptr)->ring]) ) || \
1210 ( (cache_ptr)->index_len != (cache_ptr)->il_len ) || \
1211 ( (cache_ptr)->index_size != (cache_ptr)->il_size ) ) { \
1213 HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "post HT entry size change SC failed") \
1216 #define H5C__PRE_HT_UPDATE_FOR_ENTRY_CLEAN_SC(cache_ptr, entry_ptr) \
1218 ( (cache_ptr) == NULL ) || \
1219 ( (cache_ptr)->magic != H5C__H5C_T_MAGIC ) || \
1220 ( (cache_ptr)->index_len <= 0 ) || \
1221 ( (entry_ptr) == NULL ) || \
1222 ( (entry_ptr)->is_dirty != FALSE ) || \
1223 ( (cache_ptr)->index_size < (entry_ptr)->size ) || \
1224 ( (cache_ptr)->dirty_index_size < (entry_ptr)->size ) || \
1225 ( (cache_ptr)->index_size != \
1226 ((cache_ptr)->clean_index_size + (cache_ptr)->dirty_index_size) ) || \
1227 ( (cache_ptr)->index_size < ((cache_ptr)->clean_index_size) ) || \
1228 ( (cache_ptr)->index_size < ((cache_ptr)->dirty_index_size) ) || \
1229 ( (entry_ptr)->ring <= H5C_RING_UNDEFINED ) || \
1230 ( (entry_ptr)->ring >= H5C_RING_NTYPES ) || \
1231 ( (cache_ptr)->index_ring_len[(entry_ptr)->ring] <= 0 ) || \
1232 ( (cache_ptr)->index_ring_len[(entry_ptr)->ring] > \
1233 (cache_ptr)->index_len ) || \
1234 ( (cache_ptr)->index_ring_size[(entry_ptr)->ring] > \
1235 (cache_ptr)->index_size ) || \
1236 ( (cache_ptr)->index_ring_size[(entry_ptr)->ring] != \
1237 ((cache_ptr)->clean_index_ring_size[(entry_ptr)->ring] + \
1238 (cache_ptr)->dirty_index_ring_size[(entry_ptr)->ring]) ) ) { \
1240 HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "pre HT update for entry clean SC failed") \
1243 #define H5C__PRE_HT_UPDATE_FOR_ENTRY_DIRTY_SC(cache_ptr, entry_ptr) \
1245 ( (cache_ptr) == NULL ) || \
1246 ( (cache_ptr)->magic != H5C__H5C_T_MAGIC ) || \
1247 ( (cache_ptr)->index_len <= 0 ) || \
1248 ( (entry_ptr) == NULL ) || \
1249 ( (entry_ptr)->is_dirty != TRUE ) || \
1250 ( (cache_ptr)->index_size < (entry_ptr)->size ) || \
1251 ( (cache_ptr)->clean_index_size < (entry_ptr)->size ) || \
1252 ( (cache_ptr)->index_size != \
1253 ((cache_ptr)->clean_index_size + (cache_ptr)->dirty_index_size) ) || \
1254 ( (cache_ptr)->index_size < ((cache_ptr)->clean_index_size) ) || \
1255 ( (cache_ptr)->index_size < ((cache_ptr)->dirty_index_size) ) || \
1256 ( (entry_ptr)->ring <= H5C_RING_UNDEFINED ) || \
1257 ( (entry_ptr)->ring >= H5C_RING_NTYPES ) || \
1258 ( (cache_ptr)->index_ring_len[(entry_ptr)->ring] <= 0 ) || \
1259 ( (cache_ptr)->index_ring_len[(entry_ptr)->ring] > \
1260 (cache_ptr)->index_len ) || \
1261 ( (cache_ptr)->index_ring_size[(entry_ptr)->ring] > \
1262 (cache_ptr)->index_size ) || \
1263 ( (cache_ptr)->index_ring_size[(entry_ptr)->ring] != \
1264 ((cache_ptr)->clean_index_ring_size[(entry_ptr)->ring] + \
1265 (cache_ptr)->dirty_index_ring_size[(entry_ptr)->ring]) ) ) { \
1267 HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "pre HT update for entry dirty SC failed") \
1270 #define H5C__POST_HT_UPDATE_FOR_ENTRY_CLEAN_SC(cache_ptr, entry_ptr) \
1271 if ( ( (cache_ptr)->index_size != \
1272 ((cache_ptr)->clean_index_size + (cache_ptr)->dirty_index_size) ) || \
1273 ( (cache_ptr)->index_size < ((cache_ptr)->clean_index_size) ) || \
1274 ( (cache_ptr)->index_size < ((cache_ptr)->dirty_index_size) ) || \
1275 ( (cache_ptr)->index_ring_len[(entry_ptr)->ring] > \
1276 (cache_ptr)->index_len ) || \
1277 ( (cache_ptr)->index_ring_size[(entry_ptr)->ring] > \
1278 (cache_ptr)->index_size ) || \
1279 ( (cache_ptr)->index_ring_size[(entry_ptr)->ring] != \
1280 ((cache_ptr)->clean_index_ring_size[(entry_ptr)->ring] + \
1281 (cache_ptr)->dirty_index_ring_size[(entry_ptr)->ring]) ) ) { \
1283 HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "post HT update for entry clean SC failed") \
1286 #define H5C__POST_HT_UPDATE_FOR_ENTRY_DIRTY_SC(cache_ptr, entry_ptr) \
1287 if ( ( (cache_ptr)->index_size != \
1288 ((cache_ptr)->clean_index_size + (cache_ptr)->dirty_index_size) ) || \
1289 ( (cache_ptr)->index_size < ((cache_ptr)->clean_index_size) ) || \
1290 ( (cache_ptr)->index_size < ((cache_ptr)->dirty_index_size) ) || \
1291 ( (cache_ptr)->index_ring_len[(entry_ptr)->ring] > \
1292 (cache_ptr)->index_len ) || \
1293 ( (cache_ptr)->index_ring_size[(entry_ptr)->ring] > \
1294 (cache_ptr)->index_size ) || \
1295 ( (cache_ptr)->index_ring_size[(entry_ptr)->ring] != \
1296 ((cache_ptr)->clean_index_ring_size[(entry_ptr)->ring] + \
1297 (cache_ptr)->dirty_index_ring_size[(entry_ptr)->ring]) ) ) { \
1299 HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "post HT update for entry dirty SC failed") \
1304 #define H5C__PRE_HT_INSERT_SC(cache_ptr, entry_ptr, fail_val)
1305 #define H5C__POST_HT_INSERT_SC(cache_ptr, entry_ptr, fail_val)
1306 #define H5C__PRE_HT_REMOVE_SC(cache_ptr, entry_ptr)
1307 #define H5C__POST_HT_REMOVE_SC(cache_ptr, entry_ptr)
1308 #define H5C__PRE_HT_SEARCH_SC(cache_ptr, Addr, fail_val)
1309 #define H5C__POST_SUC_HT_SEARCH_SC(cache_ptr, entry_ptr, k, fail_val)
1310 #define H5C__POST_HT_SHIFT_TO_FRONT(cache_ptr, entry_ptr, k, fail_val)
1311 #define H5C__PRE_HT_UPDATE_FOR_ENTRY_CLEAN_SC(cache_ptr, entry_ptr)
1312 #define H5C__PRE_HT_UPDATE_FOR_ENTRY_DIRTY_SC(cache_ptr, entry_ptr)
1313 #define H5C__PRE_HT_ENTRY_SIZE_CHANGE_SC(cache_ptr, old_size, new_size, \
1314 entry_ptr, was_clean)
1315 #define H5C__POST_HT_ENTRY_SIZE_CHANGE_SC(cache_ptr, old_size, new_size, \
1317 #define H5C__POST_HT_UPDATE_FOR_ENTRY_CLEAN_SC(cache_ptr, entry_ptr)
1318 #define H5C__POST_HT_UPDATE_FOR_ENTRY_DIRTY_SC(cache_ptr, entry_ptr)
1323 #define H5C__INSERT_IN_INDEX(cache_ptr, entry_ptr, fail_val) \
1326 H5C__PRE_HT_INSERT_SC(cache_ptr, entry_ptr, fail_val) \
1327 k = H5C__HASH_FCN((entry_ptr)->addr); \
1328 if(((cache_ptr)->index)[k] != NULL) { \
1329 (entry_ptr)->ht_next = ((cache_ptr)->index)[k]; \
1330 (entry_ptr)->ht_next->ht_prev = (entry_ptr); \
1332 ((cache_ptr)->index)[k] = (entry_ptr); \
1333 (cache_ptr)->index_len++; \
1334 (cache_ptr)->index_size += (entry_ptr)->size; \
1335 ((cache_ptr)->index_ring_len[entry_ptr->ring])++; \
1336 ((cache_ptr)->index_ring_size[entry_ptr->ring]) \
1337 += (entry_ptr)->size; \
1338 if((entry_ptr)->is_dirty) { \
1339 (cache_ptr)->dirty_index_size += (entry_ptr)->size; \
1340 ((cache_ptr)->dirty_index_ring_size[entry_ptr->ring]) \
1341 += (entry_ptr)->size; \
1343 (cache_ptr)->clean_index_size += (entry_ptr)->size; \
1344 ((cache_ptr)->clean_index_ring_size[entry_ptr->ring]) \
1345 += (entry_ptr)->size; \
1347 if((entry_ptr)->flush_me_last) { \
1348 (cache_ptr)->num_last_entries++; \
1349 HDassert((cache_ptr)->num_last_entries <= 2); \
1351 H5C__IL_DLL_APPEND((entry_ptr), (cache_ptr)->il_head, \
1352 (cache_ptr)->il_tail, (cache_ptr)->il_len, \
1353 (cache_ptr)->il_size, fail_val) \
1354 H5C__UPDATE_STATS_FOR_HT_INSERTION(cache_ptr) \
1355 H5C__POST_HT_INSERT_SC(cache_ptr, entry_ptr, fail_val) \
1358 #define H5C__DELETE_FROM_INDEX(cache_ptr, entry_ptr, fail_val) \
1361 H5C__PRE_HT_REMOVE_SC(cache_ptr, entry_ptr) \
1362 k = H5C__HASH_FCN((entry_ptr)->addr); \
1363 if((entry_ptr)->ht_next) \
1364 (entry_ptr)->ht_next->ht_prev = (entry_ptr)->ht_prev; \
1365 if((entry_ptr)->ht_prev) \
1366 (entry_ptr)->ht_prev->ht_next = (entry_ptr)->ht_next; \
1367 if(((cache_ptr)->index)[k] == (entry_ptr)) \
1368 ((cache_ptr)->index)[k] = (entry_ptr)->ht_next; \
1369 (entry_ptr)->ht_next = NULL; \
1370 (entry_ptr)->ht_prev = NULL; \
1371 (cache_ptr)->index_len--; \
1372 (cache_ptr)->index_size -= (entry_ptr)->size; \
1373 ((cache_ptr)->index_ring_len[entry_ptr->ring])--; \
1374 ((cache_ptr)->index_ring_size[entry_ptr->ring]) \
1375 -= (entry_ptr)->size; \
1376 if((entry_ptr)->is_dirty) { \
1377 (cache_ptr)->dirty_index_size -= (entry_ptr)->size; \
1378 ((cache_ptr)->dirty_index_ring_size[entry_ptr->ring]) \
1379 -= (entry_ptr)->size; \
1381 (cache_ptr)->clean_index_size -= (entry_ptr)->size; \
1382 ((cache_ptr)->clean_index_ring_size[entry_ptr->ring]) \
1383 -= (entry_ptr)->size; \
1385 if((entry_ptr)->flush_me_last) { \
1386 (cache_ptr)->num_last_entries--; \
1387 HDassert((cache_ptr)->num_last_entries <= 1); \
1389 H5C__IL_DLL_REMOVE((entry_ptr), (cache_ptr)->il_head, \
1390 (cache_ptr)->il_tail, (cache_ptr)->il_len, \
1391 (cache_ptr)->il_size, fail_val) \
1392 H5C__UPDATE_STATS_FOR_HT_DELETION(cache_ptr) \
1393 H5C__POST_HT_REMOVE_SC(cache_ptr, entry_ptr) \
1396 #define H5C__SEARCH_INDEX(cache_ptr, Addr, entry_ptr, fail_val) \
1400 H5C__PRE_HT_SEARCH_SC(cache_ptr, Addr, fail_val) \
1401 k = H5C__HASH_FCN(Addr); \
1402 entry_ptr = ((cache_ptr)->index)[k]; \
1403 while(entry_ptr) { \
1404 if(H5F_addr_eq(Addr, (entry_ptr)->addr)) { \
1405 H5C__POST_SUC_HT_SEARCH_SC(cache_ptr, entry_ptr, k, fail_val) \
1406 if(entry_ptr != ((cache_ptr)->index)[k]) { \
1407 if((entry_ptr)->ht_next) \
1408 (entry_ptr)->ht_next->ht_prev = (entry_ptr)->ht_prev; \
1409 HDassert((entry_ptr)->ht_prev != NULL); \
1410 (entry_ptr)->ht_prev->ht_next = (entry_ptr)->ht_next; \
1411 ((cache_ptr)->index)[k]->ht_prev = (entry_ptr); \
1412 (entry_ptr)->ht_next = ((cache_ptr)->index)[k]; \
1413 (entry_ptr)->ht_prev = NULL; \
1414 ((cache_ptr)->index)[k] = (entry_ptr); \
1415 H5C__POST_HT_SHIFT_TO_FRONT(cache_ptr, entry_ptr, k, fail_val) \
1419 (entry_ptr) = (entry_ptr)->ht_next; \
1422 H5C__UPDATE_STATS_FOR_HT_SEARCH(cache_ptr, (entry_ptr != NULL), depth) \
1425 #define H5C__SEARCH_INDEX_NO_STATS(cache_ptr, Addr, entry_ptr, fail_val) \
1428 H5C__PRE_HT_SEARCH_SC(cache_ptr, Addr, fail_val) \
1429 k = H5C__HASH_FCN(Addr); \
1430 entry_ptr = ((cache_ptr)->index)[k]; \
1431 while(entry_ptr) { \
1432 if(H5F_addr_eq(Addr, (entry_ptr)->addr)) { \
1433 H5C__POST_SUC_HT_SEARCH_SC(cache_ptr, entry_ptr, k, fail_val) \
1434 if(entry_ptr != ((cache_ptr)->index)[k]) { \
1435 if((entry_ptr)->ht_next) \
1436 (entry_ptr)->ht_next->ht_prev = (entry_ptr)->ht_prev; \
1437 HDassert((entry_ptr)->ht_prev != NULL); \
1438 (entry_ptr)->ht_prev->ht_next = (entry_ptr)->ht_next; \
1439 ((cache_ptr)->index)[k]->ht_prev = (entry_ptr); \
1440 (entry_ptr)->ht_next = ((cache_ptr)->index)[k]; \
1441 (entry_ptr)->ht_prev = NULL; \
1442 ((cache_ptr)->index)[k] = (entry_ptr); \
1443 H5C__POST_HT_SHIFT_TO_FRONT(cache_ptr, entry_ptr, k, fail_val) \
1447 (entry_ptr) = (entry_ptr)->ht_next; \
1451 #define H5C__UPDATE_INDEX_FOR_ENTRY_CLEAN(cache_ptr, entry_ptr) \
1453 H5C__PRE_HT_UPDATE_FOR_ENTRY_CLEAN_SC(cache_ptr, entry_ptr); \
1454 (cache_ptr)->dirty_index_size -= (entry_ptr)->size; \
1455 ((cache_ptr)->dirty_index_ring_size[entry_ptr->ring]) \
1456 -= (entry_ptr)->size; \
1457 (cache_ptr)->clean_index_size += (entry_ptr)->size; \
1458 ((cache_ptr)->clean_index_ring_size[entry_ptr->ring]) \
1459 += (entry_ptr)->size; \
1460 H5C__POST_HT_UPDATE_FOR_ENTRY_CLEAN_SC(cache_ptr, entry_ptr); \
1463 #define H5C__UPDATE_INDEX_FOR_ENTRY_DIRTY(cache_ptr, entry_ptr) \
1465 H5C__PRE_HT_UPDATE_FOR_ENTRY_DIRTY_SC(cache_ptr, entry_ptr); \
1466 (cache_ptr)->clean_index_size -= (entry_ptr)->size; \
1467 ((cache_ptr)->clean_index_ring_size[entry_ptr->ring]) \
1468 -= (entry_ptr)->size; \
1469 (cache_ptr)->dirty_index_size += (entry_ptr)->size; \
1470 ((cache_ptr)->dirty_index_ring_size[entry_ptr->ring]) \
1471 += (entry_ptr)->size; \
1472 H5C__POST_HT_UPDATE_FOR_ENTRY_DIRTY_SC(cache_ptr, entry_ptr); \
1475 #define H5C__UPDATE_INDEX_FOR_SIZE_CHANGE(cache_ptr, old_size, new_size, \
1476 entry_ptr, was_clean) \
1478 H5C__PRE_HT_ENTRY_SIZE_CHANGE_SC(cache_ptr, old_size, new_size, \
1479 entry_ptr, was_clean) \
1480 (cache_ptr)->index_size -= (old_size); \
1481 (cache_ptr)->index_size += (new_size); \
1482 ((cache_ptr)->index_ring_size[entry_ptr->ring]) -= (old_size); \
1483 ((cache_ptr)->index_ring_size[entry_ptr->ring]) += (new_size); \
1485 (cache_ptr)->clean_index_size -= (old_size); \
1486 ((cache_ptr)->clean_index_ring_size[entry_ptr->ring])-= (old_size); \
1488 (cache_ptr)->dirty_index_size -= (old_size); \
1489 ((cache_ptr)->dirty_index_ring_size[entry_ptr->ring])-= (old_size); \
1491 if((entry_ptr)->is_dirty) { \
1492 (cache_ptr)->dirty_index_size += (new_size); \
1493 ((cache_ptr)->dirty_index_ring_size[entry_ptr->ring])+= (new_size); \
1495 (cache_ptr)->clean_index_size += (new_size); \
1496 ((cache_ptr)->clean_index_ring_size[entry_ptr->ring])+= (new_size); \
1498 H5C__DLL_UPDATE_FOR_SIZE_CHANGE((cache_ptr)->il_len, \
1499 (cache_ptr)->il_size, \
1500 (old_size), (new_size)) \
1501 H5C__POST_HT_ENTRY_SIZE_CHANGE_SC(cache_ptr, old_size, new_size, \
1574 #if H5C_DO_SLIST_SANITY_CHECKS
1575 #define ENTRY_IN_SLIST(cache_ptr, entry_ptr) \
1576 H5C_entry_in_skip_list((cache_ptr), (entry_ptr))
1578 #define ENTRY_IN_SLIST(cache_ptr, entry_ptr) FALSE
1581 #if H5C_DO_SANITY_CHECKS
1583 #define H5C__INSERT_ENTRY_IN_SLIST(cache_ptr, entry_ptr, fail_val) \
1585 HDassert( (cache_ptr) ); \
1586 HDassert( (cache_ptr)->magic == H5C__H5C_T_MAGIC ); \
1587 HDassert( (entry_ptr) ); \
1588 HDassert( (entry_ptr)->size > 0 ); \
1589 HDassert( H5F_addr_defined((entry_ptr)->addr) ); \
1590 HDassert( !((entry_ptr)->in_slist) ); \
1591 HDassert( !ENTRY_IN_SLIST((cache_ptr), (entry_ptr)) ); \
1592 HDassert( (entry_ptr)->ring > H5C_RING_UNDEFINED ); \
1593 HDassert( (entry_ptr)->ring < H5C_RING_NTYPES ); \
1594 HDassert( (cache_ptr)->slist_ring_len[(entry_ptr)->ring] <= \
1595 (cache_ptr)->slist_len ); \
1596 HDassert( (cache_ptr)->slist_ring_size[(entry_ptr)->ring] <= \
1597 (cache_ptr)->slist_size ); \
1599 if(H5SL_insert((cache_ptr)->slist_ptr, entry_ptr, &(entry_ptr)->addr) < 0) \
1600 HGOTO_ERROR(H5E_CACHE, H5E_BADVALUE, (fail_val), "can't insert entry in skip list") \
1602 (entry_ptr)->in_slist = TRUE; \
1603 (cache_ptr)->slist_changed = TRUE; \
1604 (cache_ptr)->slist_len++; \
1605 (cache_ptr)->slist_size += (entry_ptr)->size; \
1606 ((cache_ptr)->slist_ring_len[(entry_ptr)->ring])++; \
1607 ((cache_ptr)->slist_ring_size[(entry_ptr)->ring]) += (entry_ptr)->size; \
1608 (cache_ptr)->slist_len_increase++; \
1609 (cache_ptr)->slist_size_increase += (int64_t)((entry_ptr)->size); \
1611 HDassert( (cache_ptr)->slist_len > 0 ); \
1612 HDassert( (cache_ptr)->slist_size > 0 ); \
1618 #define H5C__INSERT_ENTRY_IN_SLIST(cache_ptr, entry_ptr, fail_val) \
1620 HDassert( (cache_ptr) ); \
1621 HDassert( (cache_ptr)->magic == H5C__H5C_T_MAGIC ); \
1622 HDassert( (entry_ptr) ); \
1623 HDassert( (entry_ptr)->size > 0 ); \
1624 HDassert( H5F_addr_defined((entry_ptr)->addr) ); \
1625 HDassert( !((entry_ptr)->in_slist) ); \
1626 HDassert( !ENTRY_IN_SLIST((cache_ptr), (entry_ptr)) ); \
1627 HDassert( (entry_ptr)->ring > H5C_RING_UNDEFINED ); \
1628 HDassert( (entry_ptr)->ring < H5C_RING_NTYPES ); \
1629 HDassert( (cache_ptr)->slist_ring_len[(entry_ptr)->ring] <= \
1630 (cache_ptr)->slist_len ); \
1631 HDassert( (cache_ptr)->slist_ring_size[(entry_ptr)->ring] <= \
1632 (cache_ptr)->slist_size ); \
1634 if(H5SL_insert((cache_ptr)->slist_ptr, entry_ptr, &(entry_ptr)->addr) < 0) \
1635 HGOTO_ERROR(H5E_CACHE, H5E_BADVALUE, (fail_val), "can't insert entry in skip list") \
1637 (entry_ptr)->in_slist = TRUE; \
1638 (cache_ptr)->slist_changed = TRUE; \
1639 (cache_ptr)->slist_len++; \
1640 (cache_ptr)->slist_size += (entry_ptr)->size; \
1641 ((cache_ptr)->slist_ring_len[(entry_ptr)->ring])++; \
1642 ((cache_ptr)->slist_ring_size[(entry_ptr)->ring]) += (entry_ptr)->size; \
1644 HDassert( (cache_ptr)->slist_len > 0 ); \
1645 HDassert( (cache_ptr)->slist_size > 0 ); \
1667 #if H5C_DO_SANITY_CHECKS
1668 #define H5C__REMOVE_ENTRY_FROM_SLIST(cache_ptr, entry_ptr, during_flush) \
1670 HDassert( (cache_ptr) ); \
1671 HDassert( (cache_ptr)->magic == H5C__H5C_T_MAGIC ); \
1672 HDassert( (entry_ptr) ); \
1673 HDassert( !((entry_ptr)->is_read_only) ); \
1674 HDassert( ((entry_ptr)->ro_ref_count) == 0 ); \
1675 HDassert( (entry_ptr)->size > 0 ); \
1676 HDassert( (entry_ptr)->in_slist ); \
1677 HDassert( (cache_ptr)->slist_ptr ); \
1678 HDassert( (entry_ptr)->ring > H5C_RING_UNDEFINED ); \
1679 HDassert( (entry_ptr)->ring < H5C_RING_NTYPES ); \
1680 HDassert( (cache_ptr)->slist_ring_len[(entry_ptr)->ring] <= \
1681 (cache_ptr)->slist_len ); \
1682 HDassert( (cache_ptr)->slist_ring_size[(entry_ptr)->ring] <= \
1683 (cache_ptr)->slist_size ); \
1685 if ( H5SL_remove((cache_ptr)->slist_ptr, &(entry_ptr)->addr) \
1687 HGOTO_ERROR(H5E_CACHE, H5E_BADVALUE, FAIL, "can't delete entry from skip list") \
1689 HDassert( (cache_ptr)->slist_len > 0 ); \
1690 if(!(during_flush)) \
1691 (cache_ptr)->slist_changed = TRUE; \
1692 (cache_ptr)->slist_len--; \
1693 HDassert( (cache_ptr)->slist_size >= (entry_ptr)->size ); \
1694 (cache_ptr)->slist_size -= (entry_ptr)->size; \
1695 ((cache_ptr)->slist_ring_len[(entry_ptr)->ring])--; \
1696 HDassert( (cache_ptr)->slist_ring_size[(entry_ptr->ring)] >= \
1697 (entry_ptr)->size ); \
1698 ((cache_ptr)->slist_ring_size[(entry_ptr)->ring]) -= (entry_ptr)->size; \
1699 (cache_ptr)->slist_len_increase--; \
1700 (cache_ptr)->slist_size_increase -= (int64_t)((entry_ptr)->size); \
1701 (entry_ptr)->in_slist = FALSE; \
1706 #define H5C__REMOVE_ENTRY_FROM_SLIST(cache_ptr, entry_ptr, during_flush) \
1708 HDassert( (cache_ptr) ); \
1709 HDassert( (cache_ptr)->magic == H5C__H5C_T_MAGIC ); \
1710 HDassert( (entry_ptr) ); \
1711 HDassert( !((entry_ptr)->is_read_only) ); \
1712 HDassert( ((entry_ptr)->ro_ref_count) == 0 ); \
1713 HDassert( (entry_ptr)->in_slist ); \
1714 HDassert( (cache_ptr)->slist_ptr ); \
1715 HDassert( (entry_ptr)->ring > H5C_RING_UNDEFINED ); \
1716 HDassert( (entry_ptr)->ring < H5C_RING_NTYPES ); \
1717 HDassert( (cache_ptr)->slist_ring_len[(entry_ptr)->ring] <= \
1718 (cache_ptr)->slist_len ); \
1719 HDassert( (cache_ptr)->slist_ring_size[(entry_ptr)->ring] <= \
1720 (cache_ptr)->slist_size ); \
1722 if ( H5SL_remove((cache_ptr)->slist_ptr, &(entry_ptr)->addr) \
1724 HGOTO_ERROR(H5E_CACHE, H5E_BADVALUE, FAIL, "can't delete entry from skip list") \
1726 HDassert( (cache_ptr)->slist_len > 0 ); \
1727 if(!(during_flush)) \
1728 (cache_ptr)->slist_changed = TRUE; \
1729 (cache_ptr)->slist_len--; \
1730 HDassert( (cache_ptr)->slist_size >= (entry_ptr)->size ); \
1731 (cache_ptr)->slist_size -= (entry_ptr)->size; \
1732 ((cache_ptr)->slist_ring_len[(entry_ptr)->ring])--; \
1733 HDassert( (cache_ptr)->slist_ring_size[(entry_ptr->ring)] >= \
1734 (entry_ptr)->size ); \
1735 ((cache_ptr)->slist_ring_size[(entry_ptr)->ring]) -= (entry_ptr)->size; \
1736 (entry_ptr)->in_slist = FALSE; \
1776 #if H5C_DO_SANITY_CHECKS
1778 #define H5C__UPDATE_SLIST_FOR_SIZE_CHANGE(cache_ptr, old_size, new_size) \
1780 HDassert( (cache_ptr) ); \
1781 HDassert( (cache_ptr)->magic == H5C__H5C_T_MAGIC ); \
1782 HDassert( (old_size) > 0 ); \
1783 HDassert( (new_size) > 0 ); \
1784 HDassert( (old_size) <= (cache_ptr)->slist_size ); \
1785 HDassert( (cache_ptr)->slist_len > 0 ); \
1786 HDassert( ((cache_ptr)->slist_len > 1) || \
1787 ( (cache_ptr)->slist_size == (old_size) ) ); \
1788 HDassert( (entry_ptr)->ring > H5C_RING_UNDEFINED ); \
1789 HDassert( (entry_ptr)->ring < H5C_RING_NTYPES ); \
1790 HDassert( (cache_ptr)->slist_ring_len[(entry_ptr)->ring] <= \
1791 (cache_ptr)->slist_len ); \
1792 HDassert( (cache_ptr)->slist_ring_size[(entry_ptr)->ring] <= \
1793 (cache_ptr)->slist_size ); \
1795 (cache_ptr)->slist_size -= (old_size); \
1796 (cache_ptr)->slist_size += (new_size); \
1798 HDassert( (cache_ptr)->slist_ring_size[(entry_ptr->ring)] >=(old_size) ); \
1799 ((cache_ptr)->slist_ring_size[(entry_ptr)->ring]) -= (old_size); \
1800 ((cache_ptr)->slist_ring_size[(entry_ptr)->ring]) += (new_size); \
1802 (cache_ptr)->slist_size_increase -= (int64_t)(old_size); \
1803 (cache_ptr)->slist_size_increase += (int64_t)(new_size); \
1805 HDassert( (new_size) <= (cache_ptr)->slist_size ); \
1806 HDassert( ( (cache_ptr)->slist_len > 1 ) || \
1807 ( (cache_ptr)->slist_size == (new_size) ) ); \
1812 #define H5C__UPDATE_SLIST_FOR_SIZE_CHANGE(cache_ptr, old_size, new_size) \
1814 HDassert( (cache_ptr) ); \
1815 HDassert( (cache_ptr)->magic == H5C__H5C_T_MAGIC ); \
1816 HDassert( (old_size) > 0 ); \
1817 HDassert( (new_size) > 0 ); \
1818 HDassert( (old_size) <= (cache_ptr)->slist_size ); \
1819 HDassert( (cache_ptr)->slist_len > 0 ); \
1820 HDassert( ((cache_ptr)->slist_len > 1) || \
1821 ( (cache_ptr)->slist_size == (old_size) ) ); \
1822 HDassert( (entry_ptr)->ring > H5C_RING_UNDEFINED ); \
1823 HDassert( (entry_ptr)->ring < H5C_RING_NTYPES ); \
1824 HDassert( (cache_ptr)->slist_ring_len[(entry_ptr)->ring] <= \
1825 (cache_ptr)->slist_len ); \
1826 HDassert( (cache_ptr)->slist_ring_size[(entry_ptr)->ring] <= \
1827 (cache_ptr)->slist_size ); \
1829 (cache_ptr)->slist_size -= (old_size); \
1830 (cache_ptr)->slist_size += (new_size); \
1832 HDassert( (cache_ptr)->slist_ring_size[(entry_ptr->ring)] >=(old_size) ); \
1833 ((cache_ptr)->slist_ring_size[(entry_ptr)->ring]) -= (old_size); \
1834 ((cache_ptr)->slist_ring_size[(entry_ptr)->ring]) += (new_size); \
1836 HDassert( (new_size) <= (cache_ptr)->slist_size ); \
1837 HDassert( ( (cache_ptr)->slist_len > 1 ) || \
1838 ( (cache_ptr)->slist_size == (new_size) ) ); \
1887 #if H5C_MAINTAIN_CLEAN_AND_DIRTY_LRU_LISTS
1889 #define H5C__FAKE_RP_FOR_MOST_RECENT_ACCESS(cache_ptr, entry_ptr, fail_val) \
1891 HDassert( (cache_ptr) ); \
1892 HDassert( (cache_ptr)->magic == H5C__H5C_T_MAGIC ); \
1893 HDassert( (entry_ptr) ); \
1894 HDassert( !((entry_ptr)->is_protected) ); \
1895 HDassert( !((entry_ptr)->is_read_only) ); \
1896 HDassert( ((entry_ptr)->ro_ref_count) == 0 ); \
1897 HDassert( (entry_ptr)->size > 0 ); \
1899 if ( ! ((entry_ptr)->is_pinned) ) { \
1906 H5C__DLL_REMOVE((entry_ptr), (cache_ptr)->LRU_head_ptr, \
1907 (cache_ptr)->LRU_tail_ptr, \
1908 (cache_ptr)->LRU_list_len, \
1909 (cache_ptr)->LRU_list_size, (fail_val)) \
1911 H5C__DLL_PREPEND((entry_ptr), (cache_ptr)->LRU_head_ptr, \
1912 (cache_ptr)->LRU_tail_ptr, \
1913 (cache_ptr)->LRU_list_len, \
1914 (cache_ptr)->LRU_list_size, (fail_val)) \
1924 if ( (entry_ptr)->is_dirty ) { \
1925 H5C__AUX_DLL_REMOVE((entry_ptr), (cache_ptr)->dLRU_head_ptr, \
1926 (cache_ptr)->dLRU_tail_ptr, \
1927 (cache_ptr)->dLRU_list_len, \
1928 (cache_ptr)->dLRU_list_size, (fail_val)) \
1930 H5C__AUX_DLL_PREPEND((entry_ptr), (cache_ptr)->dLRU_head_ptr, \
1931 (cache_ptr)->dLRU_tail_ptr, \
1932 (cache_ptr)->dLRU_list_len, \
1933 (cache_ptr)->dLRU_list_size, (fail_val)) \
1935 H5C__AUX_DLL_REMOVE((entry_ptr), (cache_ptr)->cLRU_head_ptr, \
1936 (cache_ptr)->cLRU_tail_ptr, \
1937 (cache_ptr)->cLRU_list_len, \
1938 (cache_ptr)->cLRU_list_size, (fail_val)) \
1940 H5C__AUX_DLL_PREPEND((entry_ptr), (cache_ptr)->cLRU_head_ptr, \
1941 (cache_ptr)->cLRU_tail_ptr, \
1942 (cache_ptr)->cLRU_list_len, \
1943 (cache_ptr)->cLRU_list_size, (fail_val)) \
1952 #define H5C__FAKE_RP_FOR_MOST_RECENT_ACCESS(cache_ptr, entry_ptr, fail_val) \
1954 HDassert( (cache_ptr) ); \
1955 HDassert( (cache_ptr)->magic == H5C__H5C_T_MAGIC ); \
1956 HDassert( (entry_ptr) ); \
1957 HDassert( !((entry_ptr)->is_protected) ); \
1958 HDassert( !((entry_ptr)->is_read_only) ); \
1959 HDassert( ((entry_ptr)->ro_ref_count) == 0 ); \
1960 HDassert( (entry_ptr)->size > 0 ); \
1962 if ( ! ((entry_ptr)->is_pinned) ) { \
1969 H5C__DLL_REMOVE((entry_ptr), (cache_ptr)->LRU_head_ptr, \
1970 (cache_ptr)->LRU_tail_ptr, \
1971 (cache_ptr)->LRU_list_len, \
1972 (cache_ptr)->LRU_list_size, (fail_val)) \
1974 H5C__DLL_PREPEND((entry_ptr), (cache_ptr)->LRU_head_ptr, \
1975 (cache_ptr)->LRU_tail_ptr, \
1976 (cache_ptr)->LRU_list_len, \
1977 (cache_ptr)->LRU_list_size, (fail_val)) \
2029 #if H5C_MAINTAIN_CLEAN_AND_DIRTY_LRU_LISTS
2031 #define H5C__UPDATE_RP_FOR_EVICTION(cache_ptr, entry_ptr, fail_val) \
2033 HDassert( (cache_ptr) ); \
2034 HDassert( (cache_ptr)->magic == H5C__H5C_T_MAGIC ); \
2035 HDassert( (entry_ptr) ); \
2036 HDassert( !((entry_ptr)->is_protected) ); \
2037 HDassert( !((entry_ptr)->is_read_only) ); \
2038 HDassert( ((entry_ptr)->ro_ref_count) == 0 ); \
2039 HDassert( !((entry_ptr)->is_pinned) ); \
2040 HDassert( (entry_ptr)->size > 0 ); \
2046 H5C__DLL_REMOVE((entry_ptr), (cache_ptr)->LRU_head_ptr, \
2047 (cache_ptr)->LRU_tail_ptr, (cache_ptr)->LRU_list_len, \
2048 (cache_ptr)->LRU_list_size, (fail_val)) \
2056 if ( (entry_ptr)->is_dirty ) { \
2058 H5C__AUX_DLL_REMOVE((entry_ptr), (cache_ptr)->dLRU_head_ptr, \
2059 (cache_ptr)->dLRU_tail_ptr, \
2060 (cache_ptr)->dLRU_list_len, \
2061 (cache_ptr)->dLRU_list_size, (fail_val)) \
2063 H5C__AUX_DLL_REMOVE((entry_ptr), (cache_ptr)->cLRU_head_ptr, \
2064 (cache_ptr)->cLRU_tail_ptr, \
2065 (cache_ptr)->cLRU_list_len, \
2066 (cache_ptr)->cLRU_list_size, (fail_val)) \
2073 #define H5C__UPDATE_RP_FOR_EVICTION(cache_ptr, entry_ptr, fail_val) \
2075 HDassert( (cache_ptr) ); \
2076 HDassert( (cache_ptr)->magic == H5C__H5C_T_MAGIC ); \
2077 HDassert( (entry_ptr) ); \
2078 HDassert( !((entry_ptr)->is_protected) ); \
2079 HDassert( !((entry_ptr)->is_read_only) ); \
2080 HDassert( ((entry_ptr)->ro_ref_count) == 0 ); \
2081 HDassert( !((entry_ptr)->is_pinned) ); \
2082 HDassert( (entry_ptr)->size > 0 ); \
2088 H5C__DLL_REMOVE((entry_ptr), (cache_ptr)->LRU_head_ptr, \
2089 (cache_ptr)->LRU_tail_ptr, (cache_ptr)->LRU_list_len, \
2090 (cache_ptr)->LRU_list_size, (fail_val)) \
2142 #if H5C_MAINTAIN_CLEAN_AND_DIRTY_LRU_LISTS
2144 #define H5C__UPDATE_RP_FOR_FLUSH(cache_ptr, entry_ptr, fail_val) \
2146 HDassert( (cache_ptr) ); \
2147 HDassert( (cache_ptr)->magic == H5C__H5C_T_MAGIC ); \
2148 HDassert( (entry_ptr) ); \
2149 HDassert( !((entry_ptr)->is_protected) ); \
2150 HDassert( !((entry_ptr)->is_read_only) ); \
2151 HDassert( ((entry_ptr)->ro_ref_count) == 0 ); \
2152 HDassert( (entry_ptr)->size > 0 ); \
2154 if ( ! ((entry_ptr)->is_pinned) ) { \
2162 H5C__DLL_REMOVE((entry_ptr), (cache_ptr)->LRU_head_ptr, \
2163 (cache_ptr)->LRU_tail_ptr, \
2164 (cache_ptr)->LRU_list_len, \
2165 (cache_ptr)->LRU_list_size, (fail_val)) \
2167 H5C__DLL_PREPEND((entry_ptr), (cache_ptr)->LRU_head_ptr, \
2168 (cache_ptr)->LRU_tail_ptr, \
2169 (cache_ptr)->LRU_list_len, \
2170 (cache_ptr)->LRU_list_size, (fail_val)) \
2183 if ( (entry_ptr)->is_dirty ) { \
2184 H5C__AUX_DLL_REMOVE((entry_ptr), (cache_ptr)->dLRU_head_ptr, \
2185 (cache_ptr)->dLRU_tail_ptr, \
2186 (cache_ptr)->dLRU_list_len, \
2187 (cache_ptr)->dLRU_list_size, (fail_val)) \
2189 H5C__AUX_DLL_REMOVE((entry_ptr), (cache_ptr)->cLRU_head_ptr, \
2190 (cache_ptr)->cLRU_tail_ptr, \
2191 (cache_ptr)->cLRU_list_len, \
2192 (cache_ptr)->cLRU_list_size, (fail_val)) \
2195 H5C__AUX_DLL_PREPEND((entry_ptr), (cache_ptr)->cLRU_head_ptr, \
2196 (cache_ptr)->cLRU_tail_ptr, \
2197 (cache_ptr)->cLRU_list_len, \
2198 (cache_ptr)->cLRU_list_size, (fail_val)) \
2206 #define H5C__UPDATE_RP_FOR_FLUSH(cache_ptr, entry_ptr, fail_val) \
2208 HDassert( (cache_ptr) ); \
2209 HDassert( (cache_ptr)->magic == H5C__H5C_T_MAGIC ); \
2210 HDassert( (entry_ptr) ); \
2211 HDassert( !((entry_ptr)->is_protected) ); \
2212 HDassert( !((entry_ptr)->is_read_only) ); \
2213 HDassert( ((entry_ptr)->ro_ref_count) == 0 ); \
2214 HDassert( (entry_ptr)->size > 0 ); \
2216 if ( ! ((entry_ptr)->is_pinned) ) { \
2224 H5C__DLL_REMOVE((entry_ptr), (cache_ptr)->LRU_head_ptr, \
2225 (cache_ptr)->LRU_tail_ptr, \
2226 (cache_ptr)->LRU_list_len, \
2227 (cache_ptr)->LRU_list_size, (fail_val)) \
2229 H5C__DLL_PREPEND((entry_ptr), (cache_ptr)->LRU_head_ptr, \
2230 (cache_ptr)->LRU_tail_ptr, \
2231 (cache_ptr)->LRU_list_len, \
2232 (cache_ptr)->LRU_list_size, (fail_val)) \
2268 #if H5C_MAINTAIN_CLEAN_AND_DIRTY_LRU_LISTS
2270 #define H5C__UPDATE_RP_FOR_INSERT_APPEND(cache_ptr, entry_ptr, fail_val) \
2272 HDassert( (cache_ptr) ); \
2273 HDassert( (cache_ptr)->magic == H5C__H5C_T_MAGIC ); \
2274 HDassert( (entry_ptr) ); \
2275 HDassert( !((entry_ptr)->is_protected) ); \
2276 HDassert( !((entry_ptr)->is_read_only) ); \
2277 HDassert( ((entry_ptr)->ro_ref_count) == 0 ); \
2278 HDassert( (entry_ptr)->size > 0 ); \
2280 if ( (entry_ptr)->is_pinned ) { \
2282 H5C__DLL_PREPEND((entry_ptr), (cache_ptr)->pel_head_ptr, \
2283 (cache_ptr)->pel_tail_ptr, \
2284 (cache_ptr)->pel_len, \
2285 (cache_ptr)->pel_size, (fail_val)) \
2293 H5C__DLL_APPEND((entry_ptr), (cache_ptr)->LRU_head_ptr, \
2294 (cache_ptr)->LRU_tail_ptr, \
2295 (cache_ptr)->LRU_list_len, \
2296 (cache_ptr)->LRU_list_size, (fail_val)) \
2302 if ( entry_ptr->is_dirty ) { \
2303 H5C__AUX_DLL_APPEND((entry_ptr), (cache_ptr)->dLRU_head_ptr, \
2304 (cache_ptr)->dLRU_tail_ptr, \
2305 (cache_ptr)->dLRU_list_len, \
2306 (cache_ptr)->dLRU_list_size, (fail_val)) \
2308 H5C__AUX_DLL_APPEND((entry_ptr), (cache_ptr)->cLRU_head_ptr, \
2309 (cache_ptr)->cLRU_tail_ptr, \
2310 (cache_ptr)->cLRU_list_len, \
2311 (cache_ptr)->cLRU_list_size, (fail_val)) \
2320 #define H5C__UPDATE_RP_FOR_INSERT_APPEND(cache_ptr, entry_ptr, fail_val) \
2322 HDassert( (cache_ptr) ); \
2323 HDassert( (cache_ptr)->magic == H5C__H5C_T_MAGIC ); \
2324 HDassert( (entry_ptr) ); \
2325 HDassert( !((entry_ptr)->is_protected) ); \
2326 HDassert( !((entry_ptr)->is_read_only) ); \
2327 HDassert( ((entry_ptr)->ro_ref_count) == 0 ); \
2328 HDassert( (entry_ptr)->size > 0 ); \
2330 if ( (entry_ptr)->is_pinned ) { \
2332 H5C__DLL_PREPEND((entry_ptr), (cache_ptr)->pel_head_ptr, \
2333 (cache_ptr)->pel_tail_ptr, \
2334 (cache_ptr)->pel_len, \
2335 (cache_ptr)->pel_size, (fail_val)) \
2343 H5C__DLL_APPEND((entry_ptr), (cache_ptr)->LRU_head_ptr, \
2344 (cache_ptr)->LRU_tail_ptr, \
2345 (cache_ptr)->LRU_list_len, \
2346 (cache_ptr)->LRU_list_size, (fail_val)) \
2402 #if H5C_MAINTAIN_CLEAN_AND_DIRTY_LRU_LISTS
2404 #define H5C__UPDATE_RP_FOR_INSERTION(cache_ptr, entry_ptr, fail_val) \
2406 HDassert( (cache_ptr) ); \
2407 HDassert( (cache_ptr)->magic == H5C__H5C_T_MAGIC ); \
2408 HDassert( (entry_ptr) ); \
2409 HDassert( !((entry_ptr)->is_protected) ); \
2410 HDassert( !((entry_ptr)->is_read_only) ); \
2411 HDassert( ((entry_ptr)->ro_ref_count) == 0 ); \
2412 HDassert( (entry_ptr)->size > 0 ); \
2414 if ( (entry_ptr)->is_pinned ) { \
2416 H5C__DLL_PREPEND((entry_ptr), (cache_ptr)->pel_head_ptr, \
2417 (cache_ptr)->pel_tail_ptr, \
2418 (cache_ptr)->pel_len, \
2419 (cache_ptr)->pel_size, (fail_val)) \
2427 H5C__DLL_PREPEND((entry_ptr), (cache_ptr)->LRU_head_ptr, \
2428 (cache_ptr)->LRU_tail_ptr, \
2429 (cache_ptr)->LRU_list_len, \
2430 (cache_ptr)->LRU_list_size, (fail_val)) \
2436 if ( entry_ptr->is_dirty ) { \
2437 H5C__AUX_DLL_PREPEND((entry_ptr), (cache_ptr)->dLRU_head_ptr, \
2438 (cache_ptr)->dLRU_tail_ptr, \
2439 (cache_ptr)->dLRU_list_len, \
2440 (cache_ptr)->dLRU_list_size, (fail_val)) \
2442 H5C__AUX_DLL_PREPEND((entry_ptr), (cache_ptr)->cLRU_head_ptr, \
2443 (cache_ptr)->cLRU_tail_ptr, \
2444 (cache_ptr)->cLRU_list_len, \
2445 (cache_ptr)->cLRU_list_size, (fail_val)) \
2454 #define H5C__UPDATE_RP_FOR_INSERTION(cache_ptr, entry_ptr, fail_val) \
2456 HDassert( (cache_ptr) ); \
2457 HDassert( (cache_ptr)->magic == H5C__H5C_T_MAGIC ); \
2458 HDassert( (entry_ptr) ); \
2459 HDassert( !((entry_ptr)->is_protected) ); \
2460 HDassert( !((entry_ptr)->is_read_only) ); \
2461 HDassert( ((entry_ptr)->ro_ref_count) == 0 ); \
2462 HDassert( (entry_ptr)->size > 0 ); \
2464 if ( (entry_ptr)->is_pinned ) { \
2466 H5C__DLL_PREPEND((entry_ptr), (cache_ptr)->pel_head_ptr, \
2467 (cache_ptr)->pel_tail_ptr, \
2468 (cache_ptr)->pel_len, \
2469 (cache_ptr)->pel_size, (fail_val)) \
2477 H5C__DLL_PREPEND((entry_ptr), (cache_ptr)->LRU_head_ptr, \
2478 (cache_ptr)->LRU_tail_ptr, \
2479 (cache_ptr)->LRU_list_len, \
2480 (cache_ptr)->LRU_list_size, (fail_val)) \
2537 #if H5C_MAINTAIN_CLEAN_AND_DIRTY_LRU_LISTS
2539 #define H5C__UPDATE_RP_FOR_PROTECT(cache_ptr, entry_ptr, fail_val) \
2541 HDassert( (cache_ptr) ); \
2542 HDassert( (cache_ptr)->magic == H5C__H5C_T_MAGIC ); \
2543 HDassert( (entry_ptr) ); \
2544 HDassert( !((entry_ptr)->is_protected) ); \
2545 HDassert( !((entry_ptr)->is_read_only) ); \
2546 HDassert( ((entry_ptr)->ro_ref_count) == 0 ); \
2547 HDassert( (entry_ptr)->size > 0 ); \
2549 if ( (entry_ptr)->is_pinned ) { \
2551 H5C__DLL_REMOVE((entry_ptr), (cache_ptr)->pel_head_ptr, \
2552 (cache_ptr)->pel_tail_ptr, \
2553 (cache_ptr)->pel_len, \
2554 (cache_ptr)->pel_size, (fail_val)) \
2562 H5C__DLL_REMOVE((entry_ptr), (cache_ptr)->LRU_head_ptr, \
2563 (cache_ptr)->LRU_tail_ptr, \
2564 (cache_ptr)->LRU_list_len, \
2565 (cache_ptr)->LRU_list_size, (fail_val)) \
2571 if ( (entry_ptr)->is_dirty ) { \
2573 H5C__AUX_DLL_REMOVE((entry_ptr), (cache_ptr)->dLRU_head_ptr, \
2574 (cache_ptr)->dLRU_tail_ptr, \
2575 (cache_ptr)->dLRU_list_len, \
2576 (cache_ptr)->dLRU_list_size, (fail_val)) \
2580 H5C__AUX_DLL_REMOVE((entry_ptr), (cache_ptr)->cLRU_head_ptr, \
2581 (cache_ptr)->cLRU_tail_ptr, \
2582 (cache_ptr)->cLRU_list_len, \
2583 (cache_ptr)->cLRU_list_size, (fail_val)) \
2593 H5C__DLL_APPEND((entry_ptr), (cache_ptr)->pl_head_ptr, \
2594 (cache_ptr)->pl_tail_ptr, \
2595 (cache_ptr)->pl_len, \
2596 (cache_ptr)->pl_size, (fail_val)) \
2601 #define H5C__UPDATE_RP_FOR_PROTECT(cache_ptr, entry_ptr, fail_val) \
2603 HDassert( (cache_ptr) ); \
2604 HDassert( (cache_ptr)->magic == H5C__H5C_T_MAGIC ); \
2605 HDassert( (entry_ptr) ); \
2606 HDassert( !((entry_ptr)->is_protected) ); \
2607 HDassert( !((entry_ptr)->is_read_only) ); \
2608 HDassert( ((entry_ptr)->ro_ref_count) == 0 ); \
2609 HDassert( (entry_ptr)->size > 0 ); \
2611 if ( (entry_ptr)->is_pinned ) { \
2613 H5C__DLL_REMOVE((entry_ptr), (cache_ptr)->pel_head_ptr, \
2614 (cache_ptr)->pel_tail_ptr, \
2615 (cache_ptr)->pel_len, \
2616 (cache_ptr)->pel_size, (fail_val)) \
2624 H5C__DLL_REMOVE((entry_ptr), (cache_ptr)->LRU_head_ptr, \
2625 (cache_ptr)->LRU_tail_ptr, \
2626 (cache_ptr)->LRU_list_len, \
2627 (cache_ptr)->LRU_list_size, (fail_val)) \
2636 H5C__DLL_APPEND((entry_ptr), (cache_ptr)->pl_head_ptr, \
2637 (cache_ptr)->pl_tail_ptr, \
2638 (cache_ptr)->pl_len, \
2639 (cache_ptr)->pl_size, (fail_val)) \
2664 #if H5C_MAINTAIN_CLEAN_AND_DIRTY_LRU_LISTS
2666 #define H5C__UPDATE_RP_FOR_MOVE(cache_ptr, entry_ptr, was_dirty, fail_val) \
2668 HDassert( (cache_ptr) ); \
2669 HDassert( (cache_ptr)->magic == H5C__H5C_T_MAGIC ); \
2670 HDassert( (entry_ptr) ); \
2671 HDassert( !((entry_ptr)->is_read_only) ); \
2672 HDassert( ((entry_ptr)->ro_ref_count) == 0 ); \
2673 HDassert( (entry_ptr)->size > 0 ); \
2675 if ( ! ( (entry_ptr)->is_pinned ) && ! ( (entry_ptr->is_protected ) ) ) { \
2682 H5C__DLL_REMOVE((entry_ptr), (cache_ptr)->LRU_head_ptr, \
2683 (cache_ptr)->LRU_tail_ptr, \
2684 (cache_ptr)->LRU_list_len, \
2685 (cache_ptr)->LRU_list_size, (fail_val)) \
2687 H5C__DLL_PREPEND((entry_ptr), (cache_ptr)->LRU_head_ptr, \
2688 (cache_ptr)->LRU_tail_ptr, \
2689 (cache_ptr)->LRU_list_len, \
2690 (cache_ptr)->LRU_list_size, (fail_val)) \
2695 if ( was_dirty ) { \
2697 H5C__AUX_DLL_REMOVE((entry_ptr), \
2698 (cache_ptr)->dLRU_head_ptr, \
2699 (cache_ptr)->dLRU_tail_ptr, \
2700 (cache_ptr)->dLRU_list_len, \
2701 (cache_ptr)->dLRU_list_size, \
2706 H5C__AUX_DLL_REMOVE((entry_ptr), \
2707 (cache_ptr)->cLRU_head_ptr, \
2708 (cache_ptr)->cLRU_tail_ptr, \
2709 (cache_ptr)->cLRU_list_len, \
2710 (cache_ptr)->cLRU_list_size, \
2718 if ( (entry_ptr)->is_dirty ) { \
2720 H5C__AUX_DLL_PREPEND((entry_ptr), \
2721 (cache_ptr)->dLRU_head_ptr, \
2722 (cache_ptr)->dLRU_tail_ptr, \
2723 (cache_ptr)->dLRU_list_len, \
2724 (cache_ptr)->dLRU_list_size, \
2729 H5C__AUX_DLL_PREPEND((entry_ptr), \
2730 (cache_ptr)->cLRU_head_ptr, \
2731 (cache_ptr)->cLRU_tail_ptr, \
2732 (cache_ptr)->cLRU_list_len, \
2733 (cache_ptr)->cLRU_list_size, \
2743 #define H5C__UPDATE_RP_FOR_MOVE(cache_ptr, entry_ptr, was_dirty, fail_val) \
2745 HDassert( (cache_ptr) ); \
2746 HDassert( (cache_ptr)->magic == H5C__H5C_T_MAGIC ); \
2747 HDassert( (entry_ptr) ); \
2748 HDassert( !((entry_ptr)->is_read_only) ); \
2749 HDassert( ((entry_ptr)->ro_ref_count) == 0 ); \
2750 HDassert( (entry_ptr)->size > 0 ); \
2752 if ( ! ( (entry_ptr)->is_pinned ) && ! ( (entry_ptr->is_protected ) ) ) { \
2759 H5C__DLL_REMOVE((entry_ptr), (cache_ptr)->LRU_head_ptr, \
2760 (cache_ptr)->LRU_tail_ptr, \
2761 (cache_ptr)->LRU_list_len, \
2762 (cache_ptr)->LRU_list_size, (fail_val)) \
2764 H5C__DLL_PREPEND((entry_ptr), (cache_ptr)->LRU_head_ptr, \
2765 (cache_ptr)->LRU_tail_ptr, \
2766 (cache_ptr)->LRU_list_len, \
2767 (cache_ptr)->LRU_list_size, (fail_val)) \
2808 #if H5C_MAINTAIN_CLEAN_AND_DIRTY_LRU_LISTS
2810 #define H5C__UPDATE_RP_FOR_SIZE_CHANGE(cache_ptr, entry_ptr, new_size) \
2812 HDassert( (cache_ptr) ); \
2813 HDassert( (cache_ptr)->magic == H5C__H5C_T_MAGIC ); \
2814 HDassert( (entry_ptr) ); \
2815 HDassert( !((entry_ptr)->is_protected) ); \
2816 HDassert( !((entry_ptr)->is_read_only) ); \
2817 HDassert( ((entry_ptr)->ro_ref_count) == 0 ); \
2818 HDassert( (entry_ptr)->size > 0 ); \
2819 HDassert( new_size > 0 ); \
2821 if ( (entry_ptr)->coll_access ) { \
2823 H5C__DLL_UPDATE_FOR_SIZE_CHANGE((cache_ptr)->coll_list_len, \
2824 (cache_ptr)->coll_list_size, \
2825 (entry_ptr)->size, \
2830 if ( (entry_ptr)->is_pinned ) { \
2832 H5C__DLL_UPDATE_FOR_SIZE_CHANGE((cache_ptr)->pel_len, \
2833 (cache_ptr)->pel_size, \
2834 (entry_ptr)->size, \
2843 H5C__DLL_UPDATE_FOR_SIZE_CHANGE((cache_ptr)->LRU_list_len, \
2844 (cache_ptr)->LRU_list_size, \
2845 (entry_ptr)->size, \
2853 if ( (entry_ptr)->is_dirty ) { \
2855 H5C__DLL_UPDATE_FOR_SIZE_CHANGE((cache_ptr)->dLRU_list_len, \
2856 (cache_ptr)->dLRU_list_size, \
2857 (entry_ptr)->size, \
2862 H5C__DLL_UPDATE_FOR_SIZE_CHANGE((cache_ptr)->cLRU_list_len, \
2863 (cache_ptr)->cLRU_list_size, \
2864 (entry_ptr)->size, \
2875 #define H5C__UPDATE_RP_FOR_SIZE_CHANGE(cache_ptr, entry_ptr, new_size) \
2877 HDassert( (cache_ptr) ); \
2878 HDassert( (cache_ptr)->magic == H5C__H5C_T_MAGIC ); \
2879 HDassert( (entry_ptr) ); \
2880 HDassert( !((entry_ptr)->is_protected) ); \
2881 HDassert( !((entry_ptr)->is_read_only) ); \
2882 HDassert( ((entry_ptr)->ro_ref_count) == 0 ); \
2883 HDassert( (entry_ptr)->size > 0 ); \
2884 HDassert( new_size > 0 ); \
2886 if ( (entry_ptr)->is_pinned ) { \
2888 H5C__DLL_UPDATE_FOR_SIZE_CHANGE((cache_ptr)->pel_len, \
2889 (cache_ptr)->pel_size, \
2890 (entry_ptr)->size, \
2899 H5C__DLL_UPDATE_FOR_SIZE_CHANGE((cache_ptr)->LRU_list_len, \
2900 (cache_ptr)->LRU_list_size, \
2901 (entry_ptr)->size, \
2941 #if H5C_MAINTAIN_CLEAN_AND_DIRTY_LRU_LISTS
2943 #define H5C__UPDATE_RP_FOR_UNPIN(cache_ptr, entry_ptr, fail_val) \
2945 HDassert( (cache_ptr) ); \
2946 HDassert( (cache_ptr)->magic == H5C__H5C_T_MAGIC ); \
2947 HDassert( (entry_ptr) ); \
2948 HDassert( !((entry_ptr)->is_protected) ); \
2949 HDassert( !((entry_ptr)->is_read_only) ); \
2950 HDassert( ((entry_ptr)->ro_ref_count) == 0 ); \
2951 HDassert( (entry_ptr)->is_pinned); \
2952 HDassert( (entry_ptr)->size > 0 ); \
2957 H5C__DLL_REMOVE((entry_ptr), (cache_ptr)->pel_head_ptr, \
2958 (cache_ptr)->pel_tail_ptr, (cache_ptr)->pel_len, \
2959 (cache_ptr)->pel_size, (fail_val)) \
2965 H5C__DLL_PREPEND((entry_ptr), (cache_ptr)->LRU_head_ptr, \
2966 (cache_ptr)->LRU_tail_ptr, \
2967 (cache_ptr)->LRU_list_len, \
2968 (cache_ptr)->LRU_list_size, (fail_val)) \
2974 if ( (entry_ptr)->is_dirty ) { \
2976 H5C__AUX_DLL_PREPEND((entry_ptr), \
2977 (cache_ptr)->dLRU_head_ptr, \
2978 (cache_ptr)->dLRU_tail_ptr, \
2979 (cache_ptr)->dLRU_list_len, \
2980 (cache_ptr)->dLRU_list_size, \
2985 H5C__AUX_DLL_PREPEND((entry_ptr), \
2986 (cache_ptr)->cLRU_head_ptr, \
2987 (cache_ptr)->cLRU_tail_ptr, \
2988 (cache_ptr)->cLRU_list_len, \
2989 (cache_ptr)->cLRU_list_size, \
2999 #define H5C__UPDATE_RP_FOR_UNPIN(cache_ptr, entry_ptr, fail_val) \
3001 HDassert( (cache_ptr) ); \
3002 HDassert( (cache_ptr)->magic == H5C__H5C_T_MAGIC ); \
3003 HDassert( (entry_ptr) ); \
3004 HDassert( !((entry_ptr)->is_protected) ); \
3005 HDassert( !((entry_ptr)->is_read_only) ); \
3006 HDassert( ((entry_ptr)->ro_ref_count) == 0 ); \
3007 HDassert( (entry_ptr)->is_pinned); \
3008 HDassert( (entry_ptr)->size > 0 ); \
3013 H5C__DLL_REMOVE((entry_ptr), (cache_ptr)->pel_head_ptr, \
3014 (cache_ptr)->pel_tail_ptr, (cache_ptr)->pel_len, \
3015 (cache_ptr)->pel_size, (fail_val)) \
3021 H5C__DLL_PREPEND((entry_ptr), (cache_ptr)->LRU_head_ptr, \
3022 (cache_ptr)->LRU_tail_ptr, \
3023 (cache_ptr)->LRU_list_len, \
3024 (cache_ptr)->LRU_list_size, (fail_val)) \
3077 #if H5C_MAINTAIN_CLEAN_AND_DIRTY_LRU_LISTS
3079 #define H5C__UPDATE_RP_FOR_UNPROTECT(cache_ptr, entry_ptr, fail_val) \
3081 HDassert( (cache_ptr) ); \
3082 HDassert( (cache_ptr)->magic == H5C__H5C_T_MAGIC ); \
3083 HDassert( (entry_ptr) ); \
3084 HDassert( (entry_ptr)->is_protected); \
3085 HDassert( (entry_ptr)->size > 0 ); \
3090 H5C__DLL_REMOVE((entry_ptr), (cache_ptr)->pl_head_ptr, \
3091 (cache_ptr)->pl_tail_ptr, (cache_ptr)->pl_len, \
3092 (cache_ptr)->pl_size, (fail_val)) \
3094 if ( (entry_ptr)->is_pinned ) { \
3096 H5C__DLL_PREPEND((entry_ptr), (cache_ptr)->pel_head_ptr, \
3097 (cache_ptr)->pel_tail_ptr, \
3098 (cache_ptr)->pel_len, \
3099 (cache_ptr)->pel_size, (fail_val)) \
3107 H5C__DLL_PREPEND((entry_ptr), (cache_ptr)->LRU_head_ptr, \
3108 (cache_ptr)->LRU_tail_ptr, \
3109 (cache_ptr)->LRU_list_len, \
3110 (cache_ptr)->LRU_list_size, (fail_val)) \
3116 if ( (entry_ptr)->is_dirty ) { \
3118 H5C__AUX_DLL_PREPEND((entry_ptr), (cache_ptr)->dLRU_head_ptr, \
3119 (cache_ptr)->dLRU_tail_ptr, \
3120 (cache_ptr)->dLRU_list_len, \
3121 (cache_ptr)->dLRU_list_size, (fail_val)) \
3125 H5C__AUX_DLL_PREPEND((entry_ptr), (cache_ptr)->cLRU_head_ptr, \
3126 (cache_ptr)->cLRU_tail_ptr, \
3127 (cache_ptr)->cLRU_list_len, \
3128 (cache_ptr)->cLRU_list_size, (fail_val)) \
3138 #define H5C__UPDATE_RP_FOR_UNPROTECT(cache_ptr, entry_ptr, fail_val) \
3140 HDassert( (cache_ptr) ); \
3141 HDassert( (cache_ptr)->magic == H5C__H5C_T_MAGIC ); \
3142 HDassert( (entry_ptr) ); \
3143 HDassert( (entry_ptr)->is_protected); \
3144 HDassert( (entry_ptr)->size > 0 ); \
3149 H5C__DLL_REMOVE((entry_ptr), (cache_ptr)->pl_head_ptr, \
3150 (cache_ptr)->pl_tail_ptr, (cache_ptr)->pl_len, \
3151 (cache_ptr)->pl_size, (fail_val)) \
3153 if ( (entry_ptr)->is_pinned ) { \
3155 H5C__DLL_PREPEND((entry_ptr), (cache_ptr)->pel_head_ptr, \
3156 (cache_ptr)->pel_tail_ptr, \
3157 (cache_ptr)->pel_len, \
3158 (cache_ptr)->pel_size, (fail_val)) \
3166 H5C__DLL_PREPEND((entry_ptr), (cache_ptr)->LRU_head_ptr, \
3167 (cache_ptr)->LRU_tail_ptr, \
3168 (cache_ptr)->LRU_list_len, \
3169 (cache_ptr)->LRU_list_size, (fail_val)) \
3177 #ifdef H5_HAVE_PARALLEL
3179 #if H5C_DO_SANITY_CHECKS
3181 #define H5C__COLL_DLL_PRE_REMOVE_SC(entry_ptr, hd_ptr, tail_ptr, len, Size, fv) \
3182 if ( ( (hd_ptr) == NULL ) || \
3183 ( (tail_ptr) == NULL ) || \
3184 ( (entry_ptr) == NULL ) || \
3186 ( (Size) < (entry_ptr)->size ) || \
3187 ( ( (Size) == (entry_ptr)->size ) && ( ! ( (len) == 1 ) ) ) || \
3188 ( ( (entry_ptr)->coll_prev == NULL ) && ( (hd_ptr) != (entry_ptr) ) ) || \
3189 ( ( (entry_ptr)->coll_next == NULL ) && ( (tail_ptr) != (entry_ptr) ) ) || \
3190 ( ( (len) == 1 ) && \
3191 ( ! ( ( (hd_ptr) == (entry_ptr) ) && ( (tail_ptr) == (entry_ptr) ) && \
3192 ( (entry_ptr)->coll_next == NULL ) && \
3193 ( (entry_ptr)->coll_prev == NULL ) && \
3194 ( (Size) == (entry_ptr)->size ) \
3199 HDassert(0 && "coll DLL pre remove SC failed"); \
3200 HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, (fv), "coll DLL pre remove SC failed") \
3203 #define H5C__COLL_DLL_SC(head_ptr, tail_ptr, len, Size, fv) \
3204 if ( ( ( ( (head_ptr) == NULL ) || ( (tail_ptr) == NULL ) ) && \
3205 ( (head_ptr) != (tail_ptr) ) \
3209 ( ( (len) == 1 ) && \
3210 ( ( (head_ptr) != (tail_ptr) ) || ( (Size) <= 0 ) || \
3211 ( (head_ptr) == NULL ) || ( (head_ptr)->size != (Size) ) \
3214 ( ( (len) >= 1 ) && \
3215 ( ( (head_ptr) == NULL ) || ( (head_ptr)->coll_prev != NULL ) || \
3216 ( (tail_ptr) == NULL ) || ( (tail_ptr)->coll_next != NULL ) \
3220 HDassert(0 && "COLL DLL sanity check failed"); \
3221 HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, (fv), "COLL DLL sanity check failed") \
3224 #define H5C__COLL_DLL_PRE_INSERT_SC(entry_ptr, hd_ptr, tail_ptr, len, Size, fv) \
3225 if ( ( (entry_ptr) == NULL ) || \
3226 ( (entry_ptr)->coll_next != NULL ) || \
3227 ( (entry_ptr)->coll_prev != NULL ) || \
3228 ( ( ( (hd_ptr) == NULL ) || ( (tail_ptr) == NULL ) ) && \
3229 ( (hd_ptr) != (tail_ptr) ) \
3231 ( ( (len) == 1 ) && \
3232 ( ( (hd_ptr) != (tail_ptr) ) || ( (Size) <= 0 ) || \
3233 ( (hd_ptr) == NULL ) || ( (hd_ptr)->size != (Size) ) \
3236 ( ( (len) >= 1 ) && \
3237 ( ( (hd_ptr) == NULL ) || ( (hd_ptr)->coll_prev != NULL ) || \
3238 ( (tail_ptr) == NULL ) || ( (tail_ptr)->coll_next != NULL ) \
3242 HDassert(0 && "COLL DLL pre insert SC failed"); \
3243 HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, (fv), "COLL DLL pre insert SC failed") \
3248 #define H5C__COLL_DLL_PRE_REMOVE_SC(entry_ptr, hd_ptr, tail_ptr, len, Size, fv)
3249 #define H5C__COLL_DLL_SC(head_ptr, tail_ptr, len, Size, fv)
3250 #define H5C__COLL_DLL_PRE_INSERT_SC(entry_ptr, hd_ptr, tail_ptr, len, Size, fv)
3255 #define H5C__COLL_DLL_APPEND(entry_ptr, head_ptr, tail_ptr, len, Size, fail_val) \
3257 H5C__COLL_DLL_PRE_INSERT_SC(entry_ptr, head_ptr, tail_ptr, len, Size, \
3259 if ( (head_ptr) == NULL ) \
3261 (head_ptr) = (entry_ptr); \
3262 (tail_ptr) = (entry_ptr); \
3266 (tail_ptr)->coll_next = (entry_ptr); \
3267 (entry_ptr)->coll_prev = (tail_ptr); \
3268 (tail_ptr) = (entry_ptr); \
3271 (Size) += entry_ptr->size; \
3274 #define H5C__COLL_DLL_PREPEND(entry_ptr, head_ptr, tail_ptr, len, Size, fv) \
3276 H5C__COLL_DLL_PRE_INSERT_SC(entry_ptr, head_ptr, tail_ptr, len, Size, fv)\
3277 if ( (head_ptr) == NULL ) \
3279 (head_ptr) = (entry_ptr); \
3280 (tail_ptr) = (entry_ptr); \
3284 (head_ptr)->coll_prev = (entry_ptr); \
3285 (entry_ptr)->coll_next = (head_ptr); \
3286 (head_ptr) = (entry_ptr); \
3289 (Size) += entry_ptr->size; \
3292 #define H5C__COLL_DLL_REMOVE(entry_ptr, head_ptr, tail_ptr, len, Size, fv) \
3294 H5C__COLL_DLL_PRE_REMOVE_SC(entry_ptr, head_ptr, tail_ptr, len, Size, fv)\
3296 if ( (head_ptr) == (entry_ptr) ) \
3298 (head_ptr) = (entry_ptr)->coll_next; \
3299 if ( (head_ptr) != NULL ) \
3300 (head_ptr)->coll_prev = NULL; \
3304 (entry_ptr)->coll_prev->coll_next = (entry_ptr)->coll_next; \
3306 if ( (tail_ptr) == (entry_ptr) ) \
3308 (tail_ptr) = (entry_ptr)->coll_prev; \
3309 if ( (tail_ptr) != NULL ) \
3310 (tail_ptr)->coll_next = NULL; \
3313 (entry_ptr)->coll_next->coll_prev = (entry_ptr)->coll_prev; \
3314 entry_ptr->coll_next = NULL; \
3315 entry_ptr->coll_prev = NULL; \
3317 (Size) -= entry_ptr->size; \
3335 #define H5C__INSERT_IN_COLL_LIST(cache_ptr, entry_ptr, fail_val) \
3337 HDassert( (cache_ptr) ); \
3338 HDassert( (cache_ptr)->magic == H5C__H5C_T_MAGIC ); \
3339 HDassert( (entry_ptr) ); \
3343 H5C__COLL_DLL_PREPEND((entry_ptr), (cache_ptr)->coll_head_ptr, \
3344 (cache_ptr)->coll_tail_ptr, \
3345 (cache_ptr)->coll_list_len, \
3346 (cache_ptr)->coll_list_size, \
3365 #define H5C__REMOVE_FROM_COLL_LIST(cache_ptr, entry_ptr, fail_val) \
3367 HDassert( (cache_ptr) ); \
3368 HDassert( (cache_ptr)->magic == H5C__H5C_T_MAGIC ); \
3369 HDassert( (entry_ptr) ); \
3373 H5C__COLL_DLL_REMOVE((entry_ptr), (cache_ptr)->coll_head_ptr, \
3374 (cache_ptr)->coll_tail_ptr, \
3375 (cache_ptr)->coll_list_len, \
3376 (cache_ptr)->coll_list_size, \
3395 #define H5C__MOVE_TO_TOP_IN_COLL_LIST(cache_ptr, entry_ptr, fail_val) \
3397 HDassert( (cache_ptr) ); \
3398 HDassert( (cache_ptr)->magic == H5C__H5C_T_MAGIC ); \
3399 HDassert( (entry_ptr) ); \
3402 H5C__COLL_DLL_REMOVE((entry_ptr), (cache_ptr)->coll_head_ptr, \
3403 (cache_ptr)->coll_tail_ptr, \
3404 (cache_ptr)->coll_list_len, \
3405 (cache_ptr)->coll_list_size, \
3408 H5C__COLL_DLL_PREPEND((entry_ptr), (cache_ptr)->coll_head_ptr, \
3409 (cache_ptr)->coll_tail_ptr, \
3410 (cache_ptr)->coll_list_len, \
3411 (cache_ptr)->coll_list_size, \
4695 #if H5C_DO_SANITY_CHECKS
4723 #if H5C_MAINTAIN_CLEAN_AND_DIRTY_LRU_LISTS
4726 size_t cLRU_list_size;
4732 size_t dLRU_list_size;
4737 #ifdef H5_HAVE_PARALLEL
4740 size_t coll_list_size;
4745 H5SL_t * coll_write_list;
4794 #if H5C_COLLECT_CACHE_STATS
4870 #if H5C_COLLECT_CACHE_ENTRY_STATS
size_t min_clean_size
Definition: H5Cpkg.h:5845
int32_t epoch_marker_ringbuf_size
Definition: H5Cpkg.h:5951
H5C_image_entry_t * image_entries
Definition: H5Cpkg.h:5972
H5_DLL herr_t H5C__deserialize_prefetched_entry(H5F_t *f, H5C_t *cache_ptr, H5C_cache_entry_t **entry_ptr_ptr, const H5C_class_t *type, haddr_t addr, void *udata)
Definition: H5Cimage.c:467
H5C_cache_entry_t * il_head
Definition: H5Cpkg.h:5864
int64_t evictions[H5C__MAX_NUM_TYPE_IDS+1]
Definition: H5Cpkg.h:5990
H5C_cache_entry_t * pel_tail_ptr
Definition: H5Cpkg.h:5900
size_t slist_ring_size[H5C_RING_NTYPES]
Definition: H5Cpkg.h:5877
hbool_t flash_size_increase_possible
Definition: H5Cpkg.h:5935
hdr f
Definition: H5EA.c:755
H5_DLL herr_t H5C__flush_marked_entries(H5F_t *f)
Definition: H5C.c:7619
H5C_cache_entry_t * index[H5C__HASH_TABLE_LEN]
Definition: H5Cpkg.h:5861
int32_t max_read_protects[H5C__MAX_NUM_TYPE_IDS+1]
Definition: H5Cpkg.h:5985
int64_t failed_ht_searches
Definition: H5Cpkg.h:6010
H5C_log_flush_func_t log_flush
Definition: H5Cpkg.h:5848
herr_t H5C__verify_cork_tag_test(hid_t fid, H5O_token_t tag_token, hbool_t status)
Definition: H5Ctest.c:136
hbool_t resize_in_progress
Definition: H5Cpkg.h:5941
size_t clean_index_ring_size[H5C_RING_NTYPES]
Definition: H5Cpkg.h:5858
int64_t entry_fd_height_change_counter
Definition: H5Cpkg.h:5970
H5C_cache_entry_t * last_entry_removed_ptr
Definition: H5Cpkg.h:5869
size_t max_slist_size
Definition: H5Cpkg.h:6019
int64_t cache_flush_moves[H5C__MAX_NUM_TYPE_IDS+1]
Definition: H5Cpkg.h:5994
hbool_t serialization_in_progress
Definition: H5Cpkg.h:5960
int32_t max_flushes[H5C__MAX_NUM_TYPE_IDS+1]
Definition: H5Cpkg.h:6059
hbool_t resize_enabled
Definition: H5Cpkg.h:5938
H5C_cache_entry_t * head
Definition: H5Cpkg.h:3465
size_t max_clean_index_size
Definition: H5Cpkg.h:6014
size_t flash_size_increase_threshold
Definition: H5Cpkg.h:5936
#define H5C_RING_NTYPES
Definition: H5Cprivate.h:962
Definition: H5Cpkg.h:4642
H5SL_t * slist_ptr
Definition: H5Cpkg.h:5878
int64_t take_ownerships[H5C__MAX_NUM_TYPE_IDS+1]
Definition: H5Cpkg.h:5991
H5_DLL herr_t H5C__mark_flush_dep_unserialized(H5C_cache_entry_t *entry_ptr)
Definition: H5C.c:7904
int32_t epoch_marker_ringbuf[H5C__MAX_EPOCH_MARKERS+1]
Definition: H5Cpkg.h:5948
H5C_log_info_t * log_info
Definition: H5Cpkg.h:5840
int64_t clears[H5C__MAX_NUM_TYPE_IDS+1]
Definition: H5Cpkg.h:5988
uint32_t
Definition: H5overflow.txt:38
H5_DLL herr_t H5C__generate_image(H5F_t *f, H5C_t *cache_ptr, H5C_cache_entry_t *entry_ptr)
Definition: H5C.c:8506
size_t il_size
Definition: H5Cpkg.h:5863
int64_t entry_flush_moves[H5C__MAX_NUM_TYPE_IDS+1]
Definition: H5Cpkg.h:5993
CATCH haddr_t
Definition: H5EAdblock.c:162
int32_t images_read
Definition: H5Cpkg.h:6046
int64_t entries_relocated_counter
Definition: H5Cpkg.h:5969
int64_t unpins[H5C__MAX_NUM_TYPE_IDS+1]
Definition: H5Cpkg.h:5996
hbool_t delete_image
Definition: H5Cpkg.h:5963
H5_DLL herr_t H5C__untag_entry(H5C_t *cache, H5C_cache_entry_t *entry)
Definition: H5Ctag.c:306
hbool_t slist_changed
Definition: H5Cpkg.h:5873
hbool_t msic_in_progress
Definition: H5Cpkg.h:5942
int32_t max_pins[H5C__MAX_NUM_TYPE_IDS+1]
Definition: H5Cpkg.h:6061
int64_t cache_hits
Definition: H5Cpkg.h:5955
int32_t slist_len_increase
Definition: H5Cpkg.h:5881
int64_t entries_removed_counter
Definition: H5Cpkg.h:5868
size_t index_size
Definition: H5Cpkg.h:5854
int64_t prefetch_hits
Definition: H5Cpkg.h:6053
int64_t insertions[H5C__MAX_NUM_TYPE_IDS+1]
Definition: H5Cpkg.h:5986
int32_t max_entries_skipped_in_msic
Definition: H5Cpkg.h:6034
size_t pl_size
Definition: H5Cpkg.h:5892
int64_t slist_scan_restarts
Definition: H5Cpkg.h:6040
int64_t cache_accesses
Definition: H5Cpkg.h:5956
hsize_t last_image_size
Definition: H5Cpkg.h:6048
int64_t total_entries_scanned_in_msic
Definition: H5Cpkg.h:6033
int64_t flushes[H5C__MAX_NUM_TYPE_IDS+1]
Definition: H5Cpkg.h:5989
int64_t misses[H5C__MAX_NUM_TYPE_IDS+1]
Definition: H5Cpkg.h:5982
uint32_t max_index_len
Definition: H5Cpkg.h:6012
H5_DLL herr_t H5C__tag_entry(H5C_t *cache_ptr, H5C_cache_entry_t *entry_ptr)
Definition: H5Ctag.c:219
int64_t
Definition: H5overflow.txt:35
void * aux_ptr
Definition: H5Cpkg.h:5841
hbool_t size_decreased
Definition: H5Cpkg.h:5940
H5_DLL herr_t H5C__load_cache_image(H5F_t *f)
Definition: H5Cimage.c:1117
int32_t max_type_id
Definition: H5Cpkg.h:5842
int64_t size_increases[H5C__MAX_NUM_TYPE_IDS+1]
Definition: H5Cpkg.h:6000
int64_t total_successful_ht_search_depth
Definition: H5Cpkg.h:6009
hsize_t image_data_len
Definition: H5Cpkg.h:5966
haddr_t image_addr
Definition: H5Cpkg.h:5964
int64_t total_failed_ht_search_depth
Definition: H5Cpkg.h:6011
Definition: H5Cprivate.h:2214
uint32_t index_len
Definition: H5Cpkg.h:5853
int64_t entry_flush_size_changes[H5C__MAX_NUM_TYPE_IDS+1]
Definition: H5Cpkg.h:6002
uint32_t num_objs_corked
Definition: H5Cpkg.h:5888
int64_t write_protects[H5C__MAX_NUM_TYPE_IDS+1]
Definition: H5Cpkg.h:5983
int32_t images_loaded
Definition: H5Cpkg.h:6047
int64_t moves[H5C__MAX_NUM_TYPE_IDS+1]
Definition: H5Cpkg.h:5992
hbool_t mdfsm_settled
Definition: H5Cpkg.h:5977
H5_DLL herr_t H5C__serialize_cache(H5F_t *f)
Definition: H5C.c:8013
int64_t hits[H5C__MAX_NUM_TYPE_IDS+1]
Definition: H5Cpkg.h:5981
H5C_cache_entry_t epoch_markers[H5C__MAX_EPOCH_MARKERS]
Definition: H5Cpkg.h:5952
int64_t total_entries_skipped_in_msic
Definition: H5Cpkg.h:6031
hbool_t close_warning_received
Definition: H5Cpkg.h:5850
size_t dirty_index_ring_size[H5C_RING_NTYPES]
Definition: H5Cpkg.h:5860
herr_t(* H5C_log_flush_func_t)(H5C_t *cache_ptr, haddr_t addr, hbool_t was_dirty, unsigned flags)
Definition: H5Cprivate.h:907
H5C_cache_entry_t * pl_head_ptr
Definition: H5Cpkg.h:5893
H5_DLL herr_t H5C__flush_single_entry(H5F_t *f, H5C_cache_entry_t *entry_ptr, unsigned flags)
Definition: H5C.c:5927
int64_t hid_t
Definition: H5Ipublic.h:55
int32_t max_clears[H5C__MAX_NUM_TYPE_IDS+1]
Definition: H5Cpkg.h:6058
hbool_t flush_in_progress
Definition: H5Cpkg.h:5839
H5C_cache_entry_t * entry_watched_for_removal
Definition: H5Cpkg.h:5870
uint32_t num_last_entries
Definition: H5Cpkg.h:5879
int64_t successful_ht_searches
Definition: H5Cpkg.h:6008
hbool_t ignore_tags
Definition: H5Cpkg.h:5887
int64_t total_ht_deletions
Definition: H5Cpkg.h:6007
int64_t total_ht_insertions
Definition: H5Cpkg.h:6006
H5_DLL herr_t H5C__generate_cache_image(H5F_t *f, H5C_t *cache_ptr)
Definition: H5Cimage.c:392
int64_t size_decreases[H5C__MAX_NUM_TYPE_IDS+1]
Definition: H5Cpkg.h:6001
uint32_t il_len
Definition: H5Cpkg.h:5862
int64_t pins[H5C__MAX_NUM_TYPE_IDS+1]
Definition: H5Cpkg.h:5995
#define H5C__MAX_EPOCH_MARKERS
Definition: H5Cpkg.h:48
int(* H5C_tag_iter_cb_t)(H5C_cache_entry_t *entry, void *ctx)
Definition: H5Cpkg.h:4878
#define H5C__HASH_TABLE_LEN
Definition: H5Cpkg.h:51
size_t LRU_list_size
Definition: H5Cpkg.h:5904
CATCH int
Definition: H5EA.c:1002
hbool_t cache_full
Definition: H5Cpkg.h:5939
H5SL_t * tag_list
Definition: H5Cpkg.h:5886
void * image_buffer
Definition: H5Cpkg.h:5973
int64_t index_scan_restarts
Definition: H5Cpkg.h:6042
hdr cb_ctx
Definition: H5EAhdr.c:786
size_t max_cache_size
Definition: H5Cpkg.h:5844
struct H5C_tag_info_t H5C_tag_info_t
int32_t max_accesses[H5C__MAX_NUM_TYPE_IDS+1]
Definition: H5Cpkg.h:6056
int64_t entries_loaded_counter
Definition: H5Cpkg.h:5967
uint32_t slist_len
Definition: H5Cpkg.h:5874
size_t entry_cnt
Definition: H5Cpkg.h:3466
H5C_cache_entry_t * LRU_tail_ptr
Definition: H5Cpkg.h:5906
#define H5C__MAX_NUM_TYPE_IDS
Definition: H5Cprivate.h:42
int64_t pinned_insertions[H5C__MAX_NUM_TYPE_IDS+1]
Definition: H5Cpkg.h:5987
haddr_t tag
Definition: H5Cpkg.h:3464
int32_t min_accesses[H5C__MAX_NUM_TYPE_IDS+1]
Definition: H5Cpkg.h:6057
hbool_t image_loaded
Definition: H5Cpkg.h:5962
H5_DLL herr_t H5C__iter_tagged_entries(H5C_t *cache, haddr_t tag, hbool_t match_global, H5C_tag_iter_cb_t cb, void *cb_ctx)
Definition: H5Ctag.c:427
int32_t max_entries_scanned_in_msic
Definition: H5Cpkg.h:6036
hbool_t evictions_enabled
Definition: H5Cpkg.h:5849
size_t clean_index_size
Definition: H5Cpkg.h:5857
size_t dirty_index_size
Definition: H5Cpkg.h:5859
int64_t read_protects[H5C__MAX_NUM_TYPE_IDS+1]
Definition: H5Cpkg.h:5984
uint32_t index_ring_len[H5C_RING_NTYPES]
Definition: H5Cpkg.h:5855
Definition: H5Cprivate.h:887
int64_t pinned_clears[H5C__MAX_NUM_TYPE_IDS+1]
Definition: H5Cpkg.h:5999
Definition: H5Cpkg.h:3438
uint32_t max_pl_len
Definition: H5Cpkg.h:6022
uint32_t max_pel_len
Definition: H5Cpkg.h:6026
H5C_auto_size_ctl_t resize_ctl
Definition: H5Cpkg.h:5943
int64_t calls_to_msic
Definition: H5Cpkg.h:6030
Definition: H5Cprivate.h:2104
uint32_t num_entries_in_image
Definition: H5Cpkg.h:5971
H5C_cache_image_ctl_t image_ctl
Definition: H5Cpkg.h:5959
hsize_t image_len
Definition: H5Cpkg.h:5965
int64_t slist_size_increase
Definition: H5Cpkg.h:5882
size_t max_dirty_index_size
Definition: H5Cpkg.h:6015
int64_t get_entry_ptr_from_addr_counter
Definition: H5Cpkg.h:6068
uint32_t max_slist_len
Definition: H5Cpkg.h:6018
H5_DLL herr_t H5C__make_space_in_cache(H5F_t *f, size_t space_needed, hbool_t write_permitted)
Definition: H5C.c:6847
#define H5_DLL
Definition: H5api_adpt.h:234
uint32_t LRU_list_len
Definition: H5Cpkg.h:5903
int64_t entries_scanned_to_make_space
Definition: H5Cpkg.h:6037
H5C_cache_entry_t * LRU_head_ptr
Definition: H5Cpkg.h:5905
hbool_t corked
Definition: H5Cpkg.h:3467
herr_t(* H5C_write_permitted_func_t)(const H5F_t *f, hbool_t *write_permitted_ptr)
Definition: H5Cprivate.h:905
hbool_t load_image
Definition: H5Cpkg.h:5961
int64_t dirty_pins[H5C__MAX_NUM_TYPE_IDS+1]
Definition: H5Cpkg.h:5997
hbool_t size_decrease_possible
Definition: H5Cpkg.h:5937
hbool_t epoch_marker_active[H5C__MAX_EPOCH_MARKERS]
Definition: H5Cpkg.h:5947
int64_t total_dirty_pf_entries_skipped_in_msic
Definition: H5Cpkg.h:6032
int64_t prefetches
Definition: H5Cpkg.h:6051
uint32_t slist_ring_len[H5C_RING_NTYPES]
Definition: H5Cpkg.h:5876
#define H5C__PREFIX_LEN
Definition: H5Cprivate.h:43
size_t max_index_size
Definition: H5Cpkg.h:6013
size_t pel_size
Definition: H5Cpkg.h:5898
size_t slist_size
Definition: H5Cpkg.h:5875
size_t max_pel_size
Definition: H5Cpkg.h:6027
int64_t dirty_prefetches
Definition: H5Cpkg.h:6052
size_t max_size[H5C__MAX_NUM_TYPE_IDS+1]
Definition: H5Cpkg.h:6060
H5C_cache_entry_t * il_tail
Definition: H5Cpkg.h:5865
int32_t epoch_marker_ringbuf_first
Definition: H5Cpkg.h:5949
int32_t epoch_markers_active
Definition: H5Cpkg.h:5946
int64_t entries_inserted_counter
Definition: H5Cpkg.h:5968
int32_t epoch_marker_ringbuf_last
Definition: H5Cpkg.h:5950
char prefix[H5C__PREFIX_LEN]
Definition: H5Cpkg.h:6065
H5C_cache_entry_t * pel_head_ptr
Definition: H5Cpkg.h:5899
int32_t max_dirty_pf_entries_skipped_in_msic
Definition: H5Cpkg.h:6035
int herr_t
Definition: H5public.h:128
Definition: H5Cprivate.h:1830
size_t index_ring_size[H5C_RING_NTYPES]
Definition: H5Cpkg.h:5856
bool hbool_t
Definition: H5public.h:159
uint32_t magic
Definition: H5Cpkg.h:5838
hbool_t rdfsm_settled
Definition: H5Cpkg.h:5976
H5_DLL herr_t H5C__prep_image_for_file_close(H5F_t *f, hbool_t *image_generated)
Definition: H5Cimage.c:1339
hbool_t size_increase_possible
Definition: H5Cpkg.h:5934
Definition: H5Cprivate.h:1597
H5_DLL herr_t H5C__mark_flush_dep_serialized(H5C_cache_entry_t *entry_ptr)
Definition: H5C.c:7855
int64_t LRU_scan_restarts
Definition: H5Cpkg.h:6041
size_t max_pl_size
Definition: H5Cpkg.h:6023
hsize_t
Definition: H5overflow.txt:44
uint32_t pl_len
Definition: H5Cpkg.h:5891
Definition: H5public.h:339
const H5C_class_t *const * class_table_ptr
Definition: H5Cpkg.h:5843
uint32_t pel_len
Definition: H5Cpkg.h:5897
int32_t images_created
Definition: H5Cpkg.h:6045
H5C_write_permitted_func_t check_write_permitted
Definition: H5Cpkg.h:5846
int64_t cache_flush_size_changes[H5C__MAX_NUM_TYPE_IDS+1]
Definition: H5Cpkg.h:6003
H5C_cache_entry_t * pl_tail_ptr
Definition: H5Cpkg.h:5894
hbool_t write_permitted
Definition: H5Cpkg.h:5847
int64_t pinned_flushes[H5C__MAX_NUM_TYPE_IDS+1]
Definition: H5Cpkg.h:5998