[PATCH 13/13 v2] msvcp90: Add implementation of _Concurrent_vector_Internal_push_back.
Signed-off-by: Hua meng <161220092(a)smail.nju.edu.cn> --- dlls/msvcp90/misc.c | 20 +++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) diff --git a/dlls/msvcp90/misc.c b/dlls/msvcp90/misc.c index 2e1bf9542f..342fed7c08 100644 --- a/dlls/msvcp90/misc.c +++ b/dlls/msvcp90/misc.c @@ -2198,10 +2198,24 @@ MSVCP_size_t __thiscall _Concurrent_vector_base_v4__Internal_grow_to_at_least_wi /* ?_Internal_push_back(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IEAAPEAX_KAEA_K(a)Z */ DEFINE_THISCALL_WRAPPER(_Concurrent_vector_base_v4__Internal_push_back, 12) void * __thiscall _Concurrent_vector_base_v4__Internal_push_back( - _Concurrent_vector_base_v4 *this, MSVCP_size_t len1, MSVCP_size_t *len2) + _Concurrent_vector_base_v4 *this, MSVCP_size_t element_size, MSVCP_size_t *idx) { - FIXME("(%p %ld %p) stub\n", this, len1, len2); - return NULL; + MSVCP_size_t index, seg, segment_base; + void *data; + + TRACE("(%p %ld %p)\n", this, element_size, idx); + + do { + index = this->early_size; + _Concurrent_vector_base_v4__Internal_reserve(this, index + 1, + element_size, MSVCP_SIZE_T_MAX / element_size); + } while(InterlockedCompareExchangeSizeT(&this->early_size, index + 1, index) != index); + seg = _vector_base_v4__Segment_index_of(index); + segment_base = (seg == 0) ? 0 : (1 << seg); + data = (BYTE*)this->segment[seg] + element_size * (index - segment_base); + *idx = index; + + return data; } /* ?_Internal_resize(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAEXIIIP6AXPAXI(a)ZP6AX0PBXI@Z2(a)Z */ -- 2.11.0
participants (1)
-
Hua Meng