From 96495c200968da4523e3883ae48030cee61d87a1 Mon Sep 17 00:00:00 2001 From: brain Date: Sat, 18 Nov 2006 01:03:47 +0000 Subject: Fix a major whoopsie in that class i just added. It must be derived using virtual methods, because each TYPE of bitmask must have its own static allocation of flags. See the (long winded) comments. git-svn-id: http://svn.inspircd.org/repository/trunk/inspircd@5762 e03df62e-2008-0410-955e-edbf42e46eb7 --- src/hashcomp.cpp | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) (limited to 'src/hashcomp.cpp') diff --git a/src/hashcomp.cpp b/src/hashcomp.cpp index d44ab54c2..27c71defa 100644 --- a/src/hashcomp.cpp +++ b/src/hashcomp.cpp @@ -473,24 +473,20 @@ long irc::portparser::GetToken() } } -irc::dynamicbitmask::dynamicbitmask() +irc::dynamicbitmask::dynamicbitmask() : bits_size(4) { /* We start with 4 bytes allocated which is room * for 4 items. Something makes me doubt its worth * allocating less than 4 bytes. */ - bits_size = 4; bits = new unsigned char[bits_size]; - freebits = new unsigned char[bits_size]; memset(bits, 0, bits_size); - memset(freebits, 0, bits_size); } irc::dynamicbitmask::~dynamicbitmask() { /* Tidy up the entire used memory on delete */ delete[] bits; - delete[] freebits; } irc::bitfield irc::dynamicbitmask::Allocate() @@ -499,6 +495,7 @@ irc::bitfield irc::dynamicbitmask::Allocate() * should only be allocating bitfields on load, the Toggle and * Get methods are O(1) as these are called much more often. */ + unsigned char* freebits = this->GetFreeBits(); for (unsigned char i = 0; i < bits_size; i++) { /* Yes, this is right. You'll notice we terminate the loop when !current_pos, @@ -536,6 +533,7 @@ irc::bitfield irc::dynamicbitmask::Allocate() */ bits = temp_bits; freebits = temp_freebits; + this->SetFreeBits(freebits); /* Initialize the new byte on the end of * the bitfields, pre-allocate the one bit * for this allocation @@ -560,7 +558,7 @@ bool irc::dynamicbitmask::Deallocate(irc::bitfield &pos) */ if (pos.first < bits_size) { - freebits[pos.first] &= ~pos.second; + this->GetFreeBits()[pos.first] &= ~pos.second; return true; } /* They gave a bitfield outside of the -- cgit v1.2.3