[PATCH 13/13] msvcp90: Add implementation of _Concurrent_vector_Internal_push_back.
Hua Meng
161220092 at smail.nju.edu.cn
Tue Jul 31 04:43:13 CDT 2018
Signed-off-by: Hua meng <161220092 at 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 9d2a3ced88..680241dad3 100644
--- a/dlls/msvcp90/misc.c
+++ b/dlls/msvcp90/misc.c
@@ -2029,10 +2029,24 @@ MSVCP_size_t __thiscall _Concurrent_vector_base_v4__Internal_grow_to_at_least_wi
/* ?_Internal_push_back at _Concurrent_vector_base_v4@details at Concurrency@@IEAAPEAX_KAEA_K at 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 at _Concurrent_vector_base_v4@details at Concurrency@@IAEXIIIP6AXPAXI at ZP6AX0PBXI@Z2 at Z */
--
2.11.0
More information about the wine-devel
mailing list