summaryrefslogtreecommitdiff
path: root/src/hashcomp.cpp
diff options
context:
space:
mode:
authorbrain <brain@e03df62e-2008-0410-955e-edbf42e46eb7>2006-11-18 01:03:47 +0000
committerbrain <brain@e03df62e-2008-0410-955e-edbf42e46eb7>2006-11-18 01:03:47 +0000
commit96495c200968da4523e3883ae48030cee61d87a1 (patch)
tree60298fed6c66eb047056e437e2f298e5886d18af /src/hashcomp.cpp
parent77300844a4607a7ad97e0a1c0907770f22e7b4af (diff)
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
Diffstat (limited to 'src/hashcomp.cpp')
-rw-r--r--src/hashcomp.cpp10
1 files changed, 4 insertions, 6 deletions
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