mirror of
https://github.com/OpenTTD/OpenTTD.git
synced 2025-02-06 22:37:22 +00:00
(svn r8508) -Codechange (r5762): [win32] Use an atomic operation to query and set the value of _global_dir_is_in_use for opendir etc to guarantee concurrency.
This commit is contained in:
parent
3c2cb4871e
commit
50909e272b
@ -625,20 +625,19 @@ static void Win32InitializeExceptions(void)
|
|||||||
|
|
||||||
/* suballocator - satisfies most requests with a reusable static instance.
|
/* suballocator - satisfies most requests with a reusable static instance.
|
||||||
* this avoids hundreds of alloc/free which would fragment the heap.
|
* this avoids hundreds of alloc/free which would fragment the heap.
|
||||||
* To guarantee reentrancy, we fall back to malloc if the instance is
|
* To guarantee concurrency, we fall back to malloc if the instance is
|
||||||
* already in use (it's important to avoid suprises since this is such a
|
* already in use (it's important to avoid suprises since this is such a
|
||||||
* low-level routine). */
|
* low-level routine). */
|
||||||
static DIR _global_dir;
|
static DIR _global_dir;
|
||||||
static bool _global_dir_is_in_use = false;
|
static LONG _global_dir_is_in_use = false;
|
||||||
|
|
||||||
static inline DIR *dir_calloc(void)
|
static inline DIR *dir_calloc(void)
|
||||||
{
|
{
|
||||||
DIR *d;
|
DIR *d;
|
||||||
|
|
||||||
if (_global_dir_is_in_use) {
|
if (InterlockedExchange(&_global_dir_is_in_use, true) == (LONG)true) {
|
||||||
d = CallocT<DIR>(1);
|
d = CallocT<DIR>(1);
|
||||||
} else {
|
} else {
|
||||||
_global_dir_is_in_use = true;
|
|
||||||
d = &_global_dir;
|
d = &_global_dir;
|
||||||
memset(d, 0, sizeof(*d));
|
memset(d, 0, sizeof(*d));
|
||||||
}
|
}
|
||||||
@ -648,7 +647,7 @@ static inline DIR *dir_calloc(void)
|
|||||||
static inline void dir_free(DIR *d)
|
static inline void dir_free(DIR *d)
|
||||||
{
|
{
|
||||||
if (d == &_global_dir) {
|
if (d == &_global_dir) {
|
||||||
_global_dir_is_in_use = false;
|
_global_dir_is_in_use = (LONG)false;
|
||||||
} else {
|
} else {
|
||||||
free(d);
|
free(d);
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user