Eine aufbereitete Darstellung der Quelle

 
     
 
 
Anforderungen  |   Konzepte  |   Entwurf  |   Entwicklung  |   Qualitätssicherung  |   Lebenszyklus  |   Steuerung
 
 
 
 

Benutzer

Quelle  datapagemap.c

  Sprache: C
 

/*-------------------------------------------------------------------------
 *
 * datapagemap.c
 *   A data structure for keeping track of data pages that have changed.
 *
 * This is a fairly simple bitmap.
 *
 * Copyright (c) 2013-2025, PostgreSQL Global Development Group
 *
 *-------------------------------------------------------------------------
 */


#include "postgres_fe.h"

#include "common/logging.h"
#include "datapagemap.h"

struct datapagemap_iterator
{
 datapagemap_t *map;
 BlockNumber nextblkno;
};

/*****
 * Public functions
 */


/*
 * Add a block to the bitmap.
 */

void
datapagemap_add(datapagemap_t *map, BlockNumber blkno)
{
 int   offset;
 int   bitno;

 offset = blkno / 8;
 bitno = blkno % 8;

 /* enlarge or create bitmap if needed */
 if (map->bitmapsize <= offset)
 {
  int   oldsize = map->bitmapsize;
  int   newsize;

  /*
   * The minimum to hold the new bit is offset + 1. But add some
   * headroom, so that we don't need to repeatedly enlarge the bitmap in
   * the common case that blocks are modified in order, from beginning
   * of a relation to the end.
 */

  newsize = offset + 1;
  newsize += 10;

  map->bitmap = pg_realloc(map->bitmap, newsize);

  /* zero out the newly allocated region */
  memset(&map->bitmap[oldsize], 0, newsize - oldsize);

  map->bitmapsize = newsize;
 }

 /* Set the bit */
 map->bitmap[offset] |= (1 << bitno);
}

/*
 * Start iterating through all entries in the page map.
 *
 * After datapagemap_iterate, call datapagemap_next to return the entries,
 * until it returns false. After you're done, use pg_free() to destroy the
 * iterator.
 */

datapagemap_iterator_t *
datapagemap_iterate(datapagemap_t *map)
{
 datapagemap_iterator_t *iter;

 iter = pg_malloc(sizeof(datapagemap_iterator_t));
 iter->map = map;
 iter->nextblkno = 0;

 return iter;
}

bool
datapagemap_next(datapagemap_iterator_t *iter, BlockNumber *blkno)
{
 datapagemap_t *map = iter->map;

 for (;;)
 {
  BlockNumber blk = iter->nextblkno;
  int   nextoff = blk / 8;
  int   bitno = blk % 8;

  if (nextoff >= map->bitmapsize)
   break;

  iter->nextblkno++;

  if (map->bitmap[nextoff] & (1 << bitno))
  {
   *blkno = blk;
   return true;
  }
 }

 /* no more set bits in this bitmap. */
 return false;
}

/*
 * A debugging aid. Prints out the contents of the page map.
 */

void
datapagemap_print(datapagemap_t *map)
{
 datapagemap_iterator_t *iter;
 BlockNumber blocknum;

 iter = datapagemap_iterate(map);
 while (datapagemap_next(iter, &blocknum))
  pg_log_debug("block %u", blocknum);

 pg_free(iter);
}

Messung V0.5 in Prozent
C=93 H=82 G=87

¤ Dauer der Verarbeitung: 0.15 Sekunden  (vorverarbeitet am  2026-08-07) ¤

*© Formatika GbR, Deutschland






Wurzel

Suchen

PVS Prover

Isabelle Prover

NIST Cobol Testsuite

Cephes Mathematical Library

Vienna Development Method

Haftungshinweis

Die Informationen auf dieser Webseite wurden nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit, noch Qualität der bereit gestellten Informationen zugesichert.

Bemerkung:

Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.






                                                                                                                                                                                                                                                                                                                                                                                                     


Neuigkeiten

     Aktuelles
     Motto des Tages

Open Source Software

     Quellcodebibliothek
     Eigene Quellcodes
     Fremde Quellcodes
     Suchen

Jenseits des Üblichen ....
    

Besucherstatistik

Besucherstatistik

Statistik
#Sources=277311
#Domains=752002