fixpool: allocate a new chunk on creation
Allocate the first chunk when the fixpool is created. This avoid a undefined behavior reported in issue #413 without requiring an extra comparison in allocate(). * spot/misc/fixpool.hh, spot/misc/fixpool.cc (new_chunk_): New method extracted from allocate(). Use it in the constructor as well. * NEWS: Mention the bug.
This commit is contained in:
parent
a0767e3c1e
commit
645935f796
3 changed files with 23 additions and 14 deletions
2
NEWS
2
NEWS
|
|
@ -34,6 +34,8 @@ New in spot 2.9.0.dev (not yet released)
|
||||||
|
|
||||||
Bugs fixed:
|
Bugs fixed:
|
||||||
|
|
||||||
|
- Work around undefined behavior reported by clang 10.0.0's UBsan.
|
||||||
|
|
||||||
- spot::twa_sub_statistics was very slow at computing the number of
|
- spot::twa_sub_statistics was very slow at computing the number of
|
||||||
transitons, and could overflow. It is now avoiding some costly
|
transitons, and could overflow. It is now avoiding some costly
|
||||||
loop of BDD operations, and storing the result using at least 64
|
loop of BDD operations, and storing the result using at least 64
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,5 @@
|
||||||
// -*- coding: utf-8 -*-
|
// -*- coding: utf-8 -*-
|
||||||
// Copyright (C) 2017-2018 Laboratoire de Recherche et
|
// Copyright (C) 2017-2018, 2020 Laboratoire de Recherche et
|
||||||
// Développement de l'Epita (LRDE)
|
// Développement de l'Epita (LRDE)
|
||||||
//
|
//
|
||||||
// This file is part of Spot, a model checking library.
|
// This file is part of Spot, a model checking library.
|
||||||
|
|
@ -106,7 +106,20 @@ namespace spot
|
||||||
return (size + mask) & ~mask;
|
return (size + mask) & ~mask;
|
||||||
}
|
}
|
||||||
}(size)),
|
}(size)),
|
||||||
freelist_(nullptr), free_start_(nullptr),
|
freelist_(nullptr),
|
||||||
free_end_(nullptr), chunklist_(nullptr)
|
chunklist_(nullptr)
|
||||||
{}
|
{
|
||||||
|
new_chunk_();
|
||||||
|
}
|
||||||
|
|
||||||
|
void fixed_size_pool::new_chunk_()
|
||||||
|
{
|
||||||
|
const size_t requested = (size_ > 128 ? size_ : 128) * 8192 - 64;
|
||||||
|
chunk_* c = reinterpret_cast<chunk_*>(::operator new(requested));
|
||||||
|
c->prev = chunklist_;
|
||||||
|
chunklist_ = c;
|
||||||
|
|
||||||
|
free_start_ = c->data_ + size_;
|
||||||
|
free_end_ = c->data_ + requested;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,5 @@
|
||||||
// -*- coding: utf-8 -*-
|
// -*- coding: utf-8 -*-
|
||||||
// Copyright (C) 2011, 2015-2018 Laboratoire de Recherche et
|
// Copyright (C) 2011, 2015-2018, 2020 Laboratoire de Recherche et
|
||||||
// Développement de l'Epita (LRDE)
|
// Développement de l'Epita (LRDE)
|
||||||
//
|
//
|
||||||
// This file is part of Spot, a model checking library.
|
// This file is part of Spot, a model checking library.
|
||||||
|
|
@ -68,15 +68,7 @@ namespace spot
|
||||||
|
|
||||||
// If all the last chunk has been used, allocate one more.
|
// If all the last chunk has been used, allocate one more.
|
||||||
if (free_start_ + size_ > free_end_)
|
if (free_start_ + size_ > free_end_)
|
||||||
{
|
new_chunk_();
|
||||||
const size_t requested = (size_ > 128 ? size_ : 128) * 8192 - 64;
|
|
||||||
chunk_* c = reinterpret_cast<chunk_*>(::operator new(requested));
|
|
||||||
c->prev = chunklist_;
|
|
||||||
chunklist_ = c;
|
|
||||||
|
|
||||||
free_start_ = c->data_ + size_;
|
|
||||||
free_end_ = c->data_ + requested;
|
|
||||||
}
|
|
||||||
|
|
||||||
void* res = free_start_;
|
void* res = free_start_;
|
||||||
free_start_ += size_;
|
free_start_ += size_;
|
||||||
|
|
@ -105,6 +97,8 @@ namespace spot
|
||||||
}
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
void new_chunk_();
|
||||||
|
|
||||||
const size_t size_;
|
const size_t size_;
|
||||||
struct block_ { block_* next; }* freelist_;
|
struct block_ { block_* next; }* freelist_;
|
||||||
char* free_start_;
|
char* free_start_;
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue