diff options
author | brain <brain@e03df62e-2008-0410-955e-edbf42e46eb7> | 2006-11-18 01:03:47 +0000 |
---|---|---|
committer | brain <brain@e03df62e-2008-0410-955e-edbf42e46eb7> | 2006-11-18 01:03:47 +0000 |
commit | 96495c200968da4523e3883ae48030cee61d87a1 (patch) | |
tree | 60298fed6c66eb047056e437e2f298e5886d18af /src/hashcomp.cpp | |
parent | 77300844a4607a7ad97e0a1c0907770f22e7b4af (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.cpp | 10 |
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 |