pag.cpp (Firebird-3.0.2.32703-0.tar.bz2) | : | pag.cpp (Firebird-3.0.4.33054-0.tar.bz2) | ||
---|---|---|---|---|
skipping to change at line 642 | skipping to change at line 642 | |||
CCH_MARK(tdbb, &pip_window); | CCH_MARK(tdbb, &pip_window); | |||
for (ULONG i = firstBit; i <= lastBit; i++) | for (ULONG i = firstBit; i <= lastBit; i++) | |||
{ | { | |||
UCHAR* byte = &pip_page->pip_bits[i / 8]; | UCHAR* byte = &pip_page->pip_bits[i / 8]; | |||
int mask = 1 << (i % 8); | int mask = 1 << (i % 8); | |||
*byte &= ~mask; | *byte &= ~mask; | |||
#ifdef VIO_DEBUG | #ifdef VIO_DEBUG | |||
VIO_trace(DEBUG_WRITES_INFO, | VIO_trace(DEBUG_WRITES_INFO, | |||
"\tPAG_allocate: allocated page %" SLONG | "PAG_allocate: allocated page %" SLONGFO | |||
FORMAT"\n", | RMAT"\n", | |||
i + sequence * pageMgr.pa | i + sequence * pageMgr.pagesPerPIP); | |||
gesPerPIP); | ||||
#endif | #endif | |||
} | } | |||
pipMin = MIN(pipMin, firstBit); | pipMin = MIN(pipMin, firstBit); | |||
if (pipMin == firstBit) | if (pipMin == firstBit) | |||
pipMin = lastBit + 1; | pipMin = lastBit + 1; | |||
if (pipExtent == MAX_ULONG) | if (pipExtent == MAX_ULONG) | |||
pipExtent = pip_page->pip_extent; | pipExtent = pip_page->pip_extent; | |||
skipping to change at line 713 | skipping to change at line 713 | |||
pip_page->pip_used = pipUsed; | pip_page->pip_used = pipUsed; | |||
for (const ULONG *bit = extraPages.begin(); bit < extraPa ges.end(); bit++) | for (const ULONG *bit = extraPages.begin(); bit < extraPa ges.end(); bit++) | |||
{ | { | |||
UCHAR* byte = &pip_page->pip_bits[*bit / 8]; | UCHAR* byte = &pip_page->pip_bits[*bit / 8]; | |||
const int mask = 1 << (*bit % 8); | const int mask = 1 << (*bit % 8); | |||
*byte &= ~mask; | *byte &= ~mask; | |||
#ifdef VIO_DEBUG | #ifdef VIO_DEBUG | |||
VIO_trace(DEBUG_WRITES_INFO, | VIO_trace(DEBUG_WRITES_INFO, | |||
"\tPAG_allocate: allocated page %" SLONG | "PAG_allocate: allocated page %" SLONGFO | |||
FORMAT"\n", | RMAT"\n", | |||
bit + sequence * pageMgr. | bit + sequence * pageMgr.pagesPerPIP); | |||
pagesPerPIP); | ||||
#endif | #endif | |||
} | } | |||
if (extraPages.getCount()) | if (extraPages.getCount()) | |||
CCH_must_write(tdbb, &pip_window); | CCH_must_write(tdbb, &pip_window); | |||
} | } | |||
CCH_RELEASE(tdbb, &pip_window); | CCH_RELEASE(tdbb, &pip_window); | |||
if (!toAlloc) | if (!toAlloc) | |||
skipping to change at line 954 | skipping to change at line 954 | |||
WIN window(HEADER_PAGE_NUMBER); | WIN window(HEADER_PAGE_NUMBER); | |||
header_page* header = (header_page*) CCH_fake(tdbb, &window, 1); | header_page* header = (header_page*) CCH_fake(tdbb, &window, 1); | |||
header->hdr_header.pag_scn = 0; | header->hdr_header.pag_scn = 0; | |||
*(ISC_TIMESTAMP*) header->hdr_creation_date = TimeStamp::getCurrentTimeSt amp().value(); | *(ISC_TIMESTAMP*) header->hdr_creation_date = TimeStamp::getCurrentTimeSt amp().value(); | |||
// should we include milliseconds or not? | // should we include milliseconds or not? | |||
//TimeStamp::round_time(header->hdr_creation_date->timestamp_time, 0); | //TimeStamp::round_time(header->hdr_creation_date->timestamp_time, 0); | |||
header->hdr_header.pag_type = pag_header; | header->hdr_header.pag_type = pag_header; | |||
header->hdr_page_size = dbb->dbb_page_size; | header->hdr_page_size = dbb->dbb_page_size; | |||
header->hdr_ods_version = ODS_VERSION | ODS_FIREBIRD_FLAG; | header->hdr_ods_version = ODS_VERSION | ODS_FIREBIRD_FLAG; | |||
DbImplementation::current.store(header); | DbImplementation::current.store(header); | |||
header->hdr_ods_minor = ODS_CURRENT; | ||||
#define ODS12_MINOR ODS_CURRENT | ||||
#if defined(WIN_NT) | ||||
#undef ODS12_MINOR | ||||
#define ODS12_MINOR ODS_CURRENT12_0 | ||||
#endif // WIN_NT | ||||
#if defined(LINUX) && SIZEOF_VOID_P == 8 | ||||
#undef ODS12_MINOR | ||||
#define ODS12_MINOR ODS_CURRENT12_0 | ||||
#endif // LINUX-64bit | ||||
header->hdr_ods_minor = ODS12_MINOR; | ||||
header->hdr_oldest_transaction = 1; | header->hdr_oldest_transaction = 1; | |||
header->hdr_end = HDR_SIZE; | header->hdr_end = HDR_SIZE; | |||
header->hdr_data[0] = HDR_end; | header->hdr_data[0] = HDR_end; | |||
if (dbb->dbb_flags & DBB_DB_SQL_dialect_3) | if (dbb->dbb_flags & DBB_DB_SQL_dialect_3) | |||
header->hdr_flags |= hdr_SQL_dialect_3; | header->hdr_flags |= hdr_SQL_dialect_3; | |||
dbb->dbb_ods_version = header->hdr_ods_version & ~ODS_FIREBIRD_FLAG; | dbb->dbb_ods_version = header->hdr_ods_version & ~ODS_FIREBIRD_FLAG; | |||
dbb->dbb_minor_version = header->hdr_ods_minor; | dbb->dbb_minor_version = header->hdr_ods_minor; | |||
dbb->dbb_implementation = DbImplementation(header); | ||||
CCH_RELEASE(tdbb, &window); | CCH_RELEASE(tdbb, &window); | |||
} | } | |||
void PAG_format_pip(thread_db* tdbb, PageSpace& pageSpace) | void PAG_format_pip(thread_db* tdbb, PageSpace& pageSpace) | |||
{ | { | |||
/************************************** | /************************************** | |||
* | * | |||
* P A G _ f o r m a t _ p i p | * P A G _ f o r m a t _ p i p | |||
* | * | |||
skipping to change at line 1254 | skipping to change at line 1268 | |||
UCHAR* const temp_page = FB_ALIGN(temp_buffer, PAGE_ALIGNMENT); | UCHAR* const temp_page = FB_ALIGN(temp_buffer, PAGE_ALIGNMENT); | |||
PIO_header(tdbb, temp_page, RAW_HEADER_SIZE); | PIO_header(tdbb, temp_page, RAW_HEADER_SIZE); | |||
const header_page* header = (header_page*) temp_page; | const header_page* header = (header_page*) temp_page; | |||
if (header->hdr_header.pag_type != pag_header || header->hdr_sequence) | if (header->hdr_header.pag_type != pag_header || header->hdr_sequence) | |||
ERR_post(Arg::Gds(isc_bad_db_format) << Arg::Str(attachment->att_ filename)); | ERR_post(Arg::Gds(isc_bad_db_format) << Arg::Str(attachment->att_ filename)); | |||
const USHORT ods_version = header->hdr_ods_version & ~ODS_FIREBIRD_FLAG; | const USHORT ods_version = header->hdr_ods_version & ~ODS_FIREBIRD_FLAG; | |||
if (!Ods::isSupported(header->hdr_ods_version, header->hdr_ods_minor)) | if (!Ods::isSupported(header)) | |||
{ | { | |||
ERR_post(Arg::Gds(isc_wrong_ods) << Arg::Str(attachment->att_file name) << | ERR_post(Arg::Gds(isc_wrong_ods) << Arg::Str(attachment->att_file name) << | |||
Arg::Num(ods_version) << | Arg::Num(ods_version) << | |||
Arg::Num(header->hdr_ods_minor) << | Arg::Num(header->hdr_ods_minor) << | |||
Arg::Num(ODS_VERSION) << | Arg::Num(ODS_VERSION) << | |||
Arg::Num(ODS_CURRENT)); | Arg::Num(ODS_CURRENT)); | |||
} | } | |||
// Note that if this check is turned on, it should be recoded in order th at | // Note that if this check is turned on, it should be recoded in order th at | |||
// the Intel platforms can share databases. At present (Feb 95) it is po ssible | // the Intel platforms can share databases. At present (Feb 95) it is po ssible | |||
skipping to change at line 1285 | skipping to change at line 1299 | |||
// is accessed with engine built for another architecture. - Nickolay 9-F eb-2005 | // is accessed with engine built for another architecture. - Nickolay 9-F eb-2005 | |||
if (!DbImplementation(header).compatible(DbImplementation::current)) | if (!DbImplementation(header).compatible(DbImplementation::current)) | |||
ERR_post(Arg::Gds(isc_bad_db_format) << Arg::Str(attachment->att_ filename)); | ERR_post(Arg::Gds(isc_bad_db_format) << Arg::Str(attachment->att_ filename)); | |||
if (header->hdr_page_size < MIN_PAGE_SIZE || header->hdr_page_size > MAX_ PAGE_SIZE) | if (header->hdr_page_size < MIN_PAGE_SIZE || header->hdr_page_size > MAX_ PAGE_SIZE) | |||
ERR_post(Arg::Gds(isc_bad_db_format) << Arg::Str(attachment->att_ filename)); | ERR_post(Arg::Gds(isc_bad_db_format) << Arg::Str(attachment->att_ filename)); | |||
dbb->dbb_ods_version = ods_version; | dbb->dbb_ods_version = ods_version; | |||
dbb->dbb_minor_version = header->hdr_ods_minor; | dbb->dbb_minor_version = header->hdr_ods_minor; | |||
dbb->dbb_implementation = DbImplementation(header); | ||||
dbb->dbb_page_size = header->hdr_page_size; | dbb->dbb_page_size = header->hdr_page_size; | |||
dbb->dbb_page_buffers = header->hdr_page_buffers; | dbb->dbb_page_buffers = header->hdr_page_buffers; | |||
} | } | |||
void PAG_init(thread_db* tdbb) | void PAG_init(thread_db* tdbb) | |||
{ | { | |||
/************************************** | /************************************** | |||
* | * | |||
* P A G _ i n i t | * P A G _ i n i t | |||
skipping to change at line 1544 | skipping to change at line 1559 | |||
CHECK_DBB(dbb); | CHECK_DBB(dbb); | |||
PageManager& pageMgr = dbb->dbb_page_manager; | PageManager& pageMgr = dbb->dbb_page_manager; | |||
PageSpace* pageSpace = pageMgr.findPageSpace(pageSpaceID); | PageSpace* pageSpace = pageMgr.findPageSpace(pageSpaceID); | |||
fb_assert(pageSpace); | fb_assert(pageSpace); | |||
WIN pip_window(pageSpaceID, -1); | WIN pip_window(pageSpaceID, -1); | |||
page_inv_page* pages = NULL; | page_inv_page* pages = NULL; | |||
ULONG sequence = 0; | ULONG sequence = 0; | |||
#ifdef VIO_DEBUG | ||||
string dbg = "PAG_release_pages: about to release pages: "; | ||||
#endif | ||||
for (int i = 0; i < cntRelease; i++) | for (int i = 0; i < cntRelease; i++) | |||
{ | { | |||
#ifdef VIO_DEBUG | #ifdef VIO_DEBUG | |||
VIO_trace(DEBUG_WRITES_INFO, | if (i > 0) | |||
"\tPAG_release_pages: about to release page %" SLONGFORM | dbg.append(", "); | |||
AT"\n", pgNums[i]); | ||||
char num[16]; | ||||
_ltoa_s(pgNums[i], num, sizeof(num), 10); | ||||
dbg.append(num); | ||||
#endif | #endif | |||
const ULONG seq = pgNums[i] / pageMgr.pagesPerPIP; | const ULONG seq = pgNums[i] / pageMgr.pagesPerPIP; | |||
if (!pages || seq != sequence) | if (!pages || seq != sequence) | |||
{ | { | |||
if (pages) | if (pages) | |||
{ | { | |||
pageSpace->pipHighWater.exchangeLower(sequence); | pageSpace->pipHighWater.exchangeLower(sequence); | |||
if (pages->pip_extent < pageMgr.pagesPerPIP) | if (pages->pip_extent < pageMgr.pagesPerPIP) | |||
skipping to change at line 1583 | skipping to change at line 1606 | |||
const ULONG relative_bit = pgNums[i] % pageMgr.pagesPerPIP; | const ULONG relative_bit = pgNums[i] % pageMgr.pagesPerPIP; | |||
UCHAR* byte = &pages->pip_bits[relative_bit >> 3]; | UCHAR* byte = &pages->pip_bits[relative_bit >> 3]; | |||
*byte |= 1 << (relative_bit & 7); | *byte |= 1 << (relative_bit & 7); | |||
if (*byte == 0xFF) // assume PAGES_IN_EXTENT == 8 | if (*byte == 0xFF) // assume PAGES_IN_EXTENT == 8 | |||
{ | { | |||
pages->pip_extent = MIN(pages->pip_extent, relative_bit & ~0x07); | pages->pip_extent = MIN(pages->pip_extent, relative_bit & ~0x07); | |||
} | } | |||
pages->pip_min = MIN(pages->pip_min, relative_bit); | pages->pip_min = MIN(pages->pip_min, relative_bit); | |||
} | } | |||
#ifdef VIO_DEBUG | ||||
VIO_trace(DEBUG_WRITES_INFO, "%s\n", dbg.c_str()); | ||||
#endif | ||||
pageSpace->pipHighWater.exchangeLower(sequence); | pageSpace->pipHighWater.exchangeLower(sequence); | |||
if (pages->pip_extent < pageMgr.pagesPerPIP) | if (pages->pip_extent < pageMgr.pagesPerPIP) | |||
pageSpace->pipWithExtent.exchangeLower(sequence); | pageSpace->pipWithExtent.exchangeLower(sequence); | |||
CCH_RELEASE(tdbb, &pip_window); | CCH_RELEASE(tdbb, &pip_window); | |||
} | } | |||
void PAG_set_force_write(thread_db* tdbb, bool flag) | void PAG_set_force_write(thread_db* tdbb, bool flag) | |||
{ | { | |||
skipping to change at line 2130 | skipping to change at line 2157 | |||
} | } | |||
else | else | |||
mask >>= 1; | mask >>= 1; | |||
last_bit--; | last_bit--; | |||
} | } | |||
CCH_RELEASE(tdbb, &window); | CCH_RELEASE(tdbb, &window); | |||
pipMaxKnown = pipLast; | pipMaxKnown = pipLast; | |||
if (pipLast == pipFirst) | return last_bit + (pipLast == pipFirst ? 0 : pipLast); | |||
return last_bit + 1; | ||||
return last_bit + pipLast + 1; | ||||
} | } | |||
ULONG PageSpace::lastUsedPage(const Database* dbb) | ULONG PageSpace::lastUsedPage(const Database* dbb) | |||
{ | { | |||
PageSpace* pgSpace = dbb->dbb_page_manager.findPageSpace(DB_PAGE_SPACE); | PageSpace* pgSpace = dbb->dbb_page_manager.findPageSpace(DB_PAGE_SPACE); | |||
return pgSpace->lastUsedPage(); | return pgSpace->lastUsedPage(); | |||
} | } | |||
const UCHAR bitsInByte[256] = | const UCHAR bitsInByte[256] = | |||
{ | { | |||
End of changes. 10 change blocks. | ||||
16 lines changed or deleted | 38 lines changed or added |