aboutsummaryrefslogtreecommitdiff
path: root/libstdc++-v3/include/ext/mt_allocator.h
diff options
context:
space:
mode:
Diffstat (limited to 'libstdc++-v3/include/ext/mt_allocator.h')
-rw-r--r--libstdc++-v3/include/ext/mt_allocator.h38
1 files changed, 23 insertions, 15 deletions
diff --git a/libstdc++-v3/include/ext/mt_allocator.h b/libstdc++-v3/include/ext/mt_allocator.h
index 1fc0ccb..9737700 100644
--- a/libstdc++-v3/include/ext/mt_allocator.h
+++ b/libstdc++-v3/include/ext/mt_allocator.h
@@ -342,23 +342,32 @@ namespace __gnu_cxx
__block->_M_next = reinterpret_cast<_Block_record*>(__c);
__block = __block->_M_next;
}
+ __block->_M_next = NULL;
}
else
{
- if (__block_count > __bin._M_free[0])
- __block_count = __bin._M_free[0];
- const size_t __added = __block_count;
- _Block_record* __first = __bin._M_first[0];
- __block = __first;
- --__block_count;
- while (__block_count-- > 0)
- __block = __block->_M_next;
- __bin._M_first[0] = __block->_M_next;
- __bin._M_free[0] -= __added;
+ // Is the number of required blocks greater than or
+ // equal to the number that can be provided by the
+ // global free list?
+ __bin._M_first[__thread_id] = __bin._M_first[0];
+ if (__block_count >= __bin._M_free[0])
+ {
+ __bin._M_free[__thread_id] = __bin._M_free[0];
+ __bin._M_free[0] = 0;
+ __bin._M_first[0] = NULL;
+ }
+ else
+ {
+ __bin._M_free[__thread_id] = __block_count;
+ __bin._M_free[0] -= __block_count;
+ --__block_count;
+ __block = __bin._M_first[0];
+ while (__block_count-- > 0)
+ __block = __block->_M_next;
+ __bin._M_first[0] = __block->_M_next;
+ __block->_M_next = NULL;
+ }
__gthread_mutex_unlock(__bin._M_mutex);
-
- __bin._M_first[__thread_id] = __first;
- __bin._M_free[__thread_id] += __added;
}
}
else
@@ -375,9 +384,8 @@ namespace __gnu_cxx
__block->_M_next = reinterpret_cast<_Block_record*>(__c);
__block = __block->_M_next;
}
+ __block->_M_next = NULL;
}
-
- __block->_M_next = NULL;
}
__block = __bin._M_first[__thread_id];