Hi Hua,
On 07/31/18 17:16, Hua Meng wrote:
> +/* ?_Internal_reserve@_Concurrent_vector_base_v4@details@Concurrency@@IAEXIII@Z */
> +/* ?_Internal_reserve@_Concurrent_vector_base_v4@details@Concurrency@@IEAAX_K00@Z */
> +DEFINE_THISCALL_WRAPPER(_Concurrent_vector_base_v4__Internal_reserve, 16)
> +void __thiscall _Concurrent_vector_base_v4__Internal_reserve(
> + _Concurrent_vector_base_v4 *this, MSVCP_size_t size,
> + MSVCP_size_t element_size, MSVCP_size_t max_size)
> +{
> + MSVCP_size_t block_idx, capacity;
> + int i;
> + void **new_segment;
> +
> + TRACE("(%p %ld %ld %ld)\n", this, size, element_size, max_size);
> +
> + if(size > max_size) _vector_base_v4__Internal_throw_exception(this, 0);
> + capacity = _Concurrent_vector_base_v4__Internal_capacity(this);
> + if(size <= capacity) return;
> + block_idx = _vector_base_v4__Segment_index_of(size - 1);
> + if(!this->first_block)
> + InterlockedCompareExchangeSizeT(&this->first_block, block_idx + 1, 0);
> + i = _vector_base_v4__Segment_index_of(capacity);
> + if(this->storage == this->segment) {
> + for(; i <= block_idx && i < STORAGE_SIZE; i++)
> + concurrent_vector_alloc_segment(this, i, element_size);
> + if(block_idx >= STORAGE_SIZE) {
> + new_segment = malloc(SEGMENT_SIZE * sizeof(void*));
> + if(new_segment == NULL) _vector_base_v4__Internal_throw_exception(this, 2);
> + memset(new_segment, 0, SEGMENT_SIZE * sizeof(void*));
Please change it to:
memset(new_segment, 0, SEGMENT_SIZE * sizeof(*new_segment));
> + memcpy(new_segment, this->storage, STORAGE_SIZE * element_size);
Copied data size is wrong here. There should be:
memcpy(new_segment, this->storage, STORAGE_SIZE * sizeof(*new_segment));
> + if(InterlockedCompareExchangePointer((void*)&this->segment, new_segment,
> + this->storage) != this->storage)
> + free(new_segment);
> + }
> + }
> + for(; i <= block_idx; i++)
> + concurrent_vector_alloc_segment(this, i, element_size);
> +}
Thanks,
Piotr