Wine-devel
Threads by month
- ----- 2025 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2024 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2023 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2022 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2021 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2020 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2019 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2018 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2017 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2016 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2015 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2014 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2013 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2012 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2011 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2010 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2009 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2008 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2007 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2006 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2005 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2004 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2003 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2002 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2001 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
May 2018
- 74 participants
- 631 discussions
[PATCH 1/8] urlmon: Store aggregated protocol handler IUnknown in BindProtocol.
by Jacek Caban 08 May '18
by Jacek Caban 08 May '18
08 May '18
Signed-off-by: Jacek Caban <jacek(a)codeweavers.com>
---
dlls/urlmon/bindprot.c | 18 +++++++++++++-----
dlls/urlmon/urlmon_main.h | 1 +
2 files changed, 14 insertions(+), 5 deletions(-)
1
0
08 May '18
Resent since it did not get through the first time.
The index of the joystick increments, so the index passed into
try_create does not match the actaul joystick index anymore.
Signed-off-by: Aric Stewart <aric(a)codeweavers.com>
---
dlls/winebus.sys/bus_sdl.c | 10 +++++-----
1 file changed, 5 insertions(+), 5 deletions(-)
1
0
Signed-off-by: Hua Meng <161220092(a)smail.nju.edu.cn>
---
dlls/concrt140/concrt140.spec | 106 +++++++++++++--------------
dlls/msvcp100/msvcp100.spec | 48 ++++++-------
dlls/msvcp110/msvcp110.spec | 72 +++++++++----------
dlls/msvcp120/msvcp120.spec | 72 +++++++++----------
dlls/msvcp120_app/msvcp120_app.spec | 72 +++++++++----------
dlls/msvcp90/misc.c | 139 ++++++++++++++++++++++++++++++++++++
tools/make_specfiles | 1 +
7 files changed, 325 insertions(+), 185 deletions(-)
diff --git a/dlls/concrt140/concrt140.spec b/dlls/concrt140/concrt140.spec
index f0a2cd1..9b83cf7 100644
--- a/dlls/concrt140/concrt140.spec
+++ b/dlls/concrt140/concrt140.spec
@@ -10,8 +10,8 @@
@ varargs -arch=win64 ??0SchedulerPolicy(a)Concurrency@@QEAA(a)_KZZ(ptr long) msvcr120.??0SchedulerPolicy(a)Concurrency@@QEAA(a)_KZZ
@ stub -arch=i386 ??0_Cancellation_beacon(a)details@Concurrency@@QAE(a)XZ
@ stub -arch=win64 ??0_Cancellation_beacon(a)details@Concurrency@@QEAA(a)XZ
-@ thiscall -arch=i386 ??0_Concurrent_queue_base_v4(a)details@Concurrency@@IAE(a)I@Z(ptr long) msvcp120.??0_Concurrent_queue_base_v4(a)details@Concurrency@@IAE(a)I@Z
-@ cdecl -arch=win64 ??0_Concurrent_queue_base_v4(a)details@Concurrency@@IEAA(a)_K@Z(ptr long) msvcp120.??0_Concurrent_queue_base_v4(a)details@Concurrency@@IEAA(a)_K@Z
+@ thiscall -arch=i386 ??0_Concurrent_queue_base_v4(a)details@Concurrency@@IAE(a)I@Z(ptr long) msvcp120_app.??0_Concurrent_queue_base_v4(a)details@Concurrency@@IAE(a)I@Z
+@ cdecl -arch=win64 ??0_Concurrent_queue_base_v4(a)details@Concurrency@@IEAA(a)_K@Z(ptr long) msvcp120_app.??0_Concurrent_queue_base_v4(a)details@Concurrency@@IEAA(a)_K@Z
@ stub -arch=i386 ??0_Concurrent_queue_iterator_base_v4(a)details@Concurrency@@IAE(a)ABV_Concurrent_queue_base_v4@12@@Z
@ stub -arch=win64 ??0_Concurrent_queue_iterator_base_v4(a)details@Concurrency@@IEAA(a)AEBV_Concurrent_queue_base_v4@12@@Z
@ thiscall -arch=i386 ??0_Condition_variable(a)details@Concurrency@@QAE(a)XZ(ptr) msvcr120.??0_Condition_variable(a)details@Concurrency@@QAE(a)XZ
@@ -30,10 +30,10 @@
@ stub -arch=win64 ??0_ReentrantLock(a)details@Concurrency@@QEAA(a)XZ
@ thiscall -arch=i386 ??0_ReentrantPPLLock(a)details@Concurrency@@QAE(a)XZ(ptr) msvcr120.??0_ReentrantPPLLock(a)details@Concurrency@@QAE(a)XZ
@ cdecl -arch=win64 ??0_ReentrantPPLLock(a)details@Concurrency@@QEAA(a)XZ(ptr) msvcr120.??0_ReentrantPPLLock(a)details@Concurrency@@QEAA(a)XZ
-@ thiscall -arch=i386 ??0_Runtime_object(a)details@Concurrency@@QAE(a)H@Z(ptr long) msvcp120.??0_Runtime_object(a)details@Concurrency@@QAE(a)H@Z
-@ cdecl -arch=win64 ??0_Runtime_object(a)details@Concurrency@@QEAA(a)H@Z(ptr long) msvcp120.??0_Runtime_object(a)details@Concurrency@@QEAA(a)H@Z
-@ thiscall -arch=i386 ??0_Runtime_object(a)details@Concurrency@@QAE(a)XZ(ptr) msvcp120.??0_Runtime_object(a)details@Concurrency@@QAE(a)XZ
-@ cdecl -arch=win64 ??0_Runtime_object(a)details@Concurrency@@QEAA(a)XZ(ptr) msvcp120.??0_Runtime_object(a)details@Concurrency@@QEAA(a)XZ
+@ thiscall -arch=i386 ??0_Runtime_object(a)details@Concurrency@@QAE(a)H@Z(ptr long) msvcp120_app.??0_Runtime_object(a)details@Concurrency@@QAE(a)H@Z
+@ cdecl -arch=win64 ??0_Runtime_object(a)details@Concurrency@@QEAA(a)H@Z(ptr long) msvcp120_app.??0_Runtime_object(a)details@Concurrency@@QEAA(a)H@Z
+@ thiscall -arch=i386 ??0_Runtime_object(a)details@Concurrency@@QAE(a)XZ(ptr) msvcp120_app.??0_Runtime_object(a)details@Concurrency@@QAE(a)XZ
+@ cdecl -arch=win64 ??0_Runtime_object(a)details@Concurrency@@QEAA(a)XZ(ptr) msvcp120_app.??0_Runtime_object(a)details@Concurrency@@QEAA(a)XZ
@ thiscall -arch=i386 ??0_Scheduler(a)details@Concurrency@@QAE(a)PAVScheduler@2@@Z(ptr ptr) msvcr120.??0_Scheduler(a)details@Concurrency@@QAE(a)PAVScheduler@2@@Z
@ cdecl -arch=win64 ??0_Scheduler(a)details@Concurrency@@QEAA(a)PEAVScheduler@2@@Z(ptr ptr) msvcr120.??0_Scheduler(a)details@Concurrency@@QEAA(a)PEAVScheduler@2@@Z
@ stub -arch=i386 ??0_Scoped_lock(a)_NonReentrantPPLLock@details(a)Concurrency@@QAE(a)AAV123@@Z
@@ -160,12 +160,12 @@
@ cdecl -arch=win64 ??1SchedulerPolicy(a)Concurrency@@QEAA(a)XZ(ptr) msvcr120.??1SchedulerPolicy(a)Concurrency@@QEAA(a)XZ
@ stub -arch=i386 ??1_Cancellation_beacon(a)details@Concurrency@@QAE(a)XZ
@ stub -arch=win64 ??1_Cancellation_beacon(a)details@Concurrency@@QEAA(a)XZ
-@ thiscall -arch=i386 ??1_Concurrent_queue_base_v4(a)details@Concurrency@@MAE(a)XZ(ptr) msvcp120.??1_Concurrent_queue_base_v4(a)details@Concurrency@@MAE(a)XZ
-@ cdecl -arch=win64 ??1_Concurrent_queue_base_v4(a)details@Concurrency@@MEAA(a)XZ(ptr) msvcp120.??1_Concurrent_queue_base_v4(a)details@Concurrency@@MEAA(a)XZ
+@ thiscall -arch=i386 ??1_Concurrent_queue_base_v4(a)details@Concurrency@@MAE(a)XZ(ptr) msvcp120_app.??1_Concurrent_queue_base_v4(a)details@Concurrency@@MAE(a)XZ
+@ cdecl -arch=win64 ??1_Concurrent_queue_base_v4(a)details@Concurrency@@MEAA(a)XZ(ptr) msvcp120_app.??1_Concurrent_queue_base_v4(a)details@Concurrency@@MEAA(a)XZ
@ stub -arch=i386 ??1_Concurrent_queue_iterator_base_v4(a)details@Concurrency@@IAE(a)XZ
@ stub -arch=win64 ??1_Concurrent_queue_iterator_base_v4(a)details@Concurrency@@IEAA(a)XZ
-@ stub -arch=i386 ??1_Concurrent_vector_base_v4(a)details@Concurrency@@IAE(a)XZ
-@ stub -arch=win64 ??1_Concurrent_vector_base_v4(a)details@Concurrency@@IEAA(a)XZ
+@ thiscall -arch=i386 ??1_Concurrent_vector_base_v4(a)details@Concurrency@@IAE(a)XZ(ptr) msvcp120_app.??1_Concurrent_vector_base_v4(a)details@Concurrency@@IAE(a)XZ
+@ cdecl -arch=win64 ??1_Concurrent_vector_base_v4(a)details@Concurrency@@IEAA(a)XZ(ptr) msvcp120_app.??1_Concurrent_vector_base_v4(a)details@Concurrency@@IEAA(a)XZ
@ thiscall -arch=i386 ??1_Condition_variable(a)details@Concurrency@@QAE(a)XZ(ptr) msvcr120.??1_Condition_variable(a)details@Concurrency@@QAE(a)XZ
@ cdecl -arch=win64 ??1_Condition_variable(a)details@Concurrency@@QEAA(a)XZ(ptr) msvcr120.??1_Condition_variable(a)details@Concurrency@@QEAA(a)XZ
@ thiscall -arch=i386 ??1_NonReentrantBlockingLock(a)details@Concurrency@@QAE(a)XZ(ptr) msvcr120.??1_NonReentrantBlockingLock(a)details@Concurrency@@QAE(a)XZ
@@ -347,46 +347,46 @@
@ thiscall -arch=i386 ?_GetScheduler(a)_Scheduler@details(a)Concurrency@@QAEPAVScheduler(a)3@XZ(ptr) msvcr120.?_GetScheduler(a)_Scheduler@details(a)Concurrency@@QAEPAVScheduler(a)3@XZ
@ cdecl -arch=win64 ?_GetScheduler(a)_Scheduler@details(a)Concurrency@@QEAAPEAVScheduler(a)3@XZ(ptr) msvcr120.?_GetScheduler(a)_Scheduler@details(a)Concurrency@@QEAAPEAVScheduler(a)3@XZ
@ cdecl ?_Id(a)_CurrentScheduler@details(a)Concurrency@@SAIXZ() msvcr120.?_Id(a)_CurrentScheduler@details(a)Concurrency@@SAIXZ
-@ stub -arch=i386 ?_Internal_assign(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAEXABV123(a)IP6AXPAXI@ZP6AX1PBXI(a)Z4@Z
-@ stub -arch=win64 ?_Internal_assign(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IEAAXAEBV123(a)_KP6AXPEAX1@ZP6AX2PEBX1(a)Z5@Z
-@ stub -arch=i386 ?_Internal_capacity(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IBEIXZ
-@ stub -arch=win64 ?_Internal_capacity(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IEBA_KXZ
-@ stub -arch=i386 ?_Internal_clear(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAEIP6AXPAXI(a)Z@Z
-@ stub -arch=win64 ?_Internal_clear(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IEAA_KP6AXPEAX_K(a)Z@Z
-@ stub -arch=i386 ?_Internal_compact(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAEPAXIPAXP6AX0I(a)ZP6AX0PBXI@Z(a)Z
-@ stub -arch=win64 ?_Internal_compact(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IEAAPEAX_KPEAXP6AX10(a)ZP6AX1PEBX0@Z(a)Z
-@ stub -arch=i386 ?_Internal_copy(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAEXABV123(a)IP6AXPAXPBXI@Z(a)Z
-@ stub -arch=win64 ?_Internal_copy(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IEAAXAEBV123(a)_KP6AXPEAXPEBX1@Z(a)Z
-@ thiscall -arch=i386 ?_Internal_empty(a)_Concurrent_queue_base_v4@details(a)Concurrency@@IBE_NXZ(ptr) msvcp120.?_Internal_empty(a)_Concurrent_queue_base_v4@details(a)Concurrency@@IBE_NXZ
-@ cdecl -arch=win64 ?_Internal_empty(a)_Concurrent_queue_base_v4@details(a)Concurrency@@IEBA_NXZ(ptr) msvcp120.?_Internal_empty(a)_Concurrent_queue_base_v4@details(a)Concurrency@@IEBA_NXZ
-@ thiscall -arch=i386 ?_Internal_finish_clear(a)_Concurrent_queue_base_v4@details(a)Concurrency@@IAEXXZ(ptr) msvcp120.?_Internal_finish_clear(a)_Concurrent_queue_base_v4@details(a)Concurrency@@IAEXXZ
-@ cdecl -arch=win64 ?_Internal_finish_clear(a)_Concurrent_queue_base_v4@details(a)Concurrency@@IEAAXXZ(ptr) msvcp120.?_Internal_finish_clear(a)_Concurrent_queue_base_v4@details(a)Concurrency@@IEAAXXZ
-@ stub -arch=i386 ?_Internal_grow_by(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAEIIIP6AXPAXPBXI(a)Z1@Z
-@ stub -arch=win64 ?_Internal_grow_by(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IEAA_K_K0P6AXPEAXPEBX0(a)Z2@Z
-@ stub -arch=i386 ?_Internal_grow_to_at_least_with_result(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAEIIIP6AXPAXPBXI(a)Z1@Z
-@ stub -arch=win64 ?_Internal_grow_to_at_least_with_result(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IEAA_K_K0P6AXPEAXPEBX0(a)Z2@Z
-@ thiscall -arch=i386 ?_Internal_move_push(a)_Concurrent_queue_base_v4@details(a)Concurrency@@IAEXPAX(a)Z(ptr ptr) msvcp120.?_Internal_move_push(a)_Concurrent_queue_base_v4@details(a)Concurrency@@IAEXPAX(a)Z
-@ cdecl -arch=win64 ?_Internal_move_push(a)_Concurrent_queue_base_v4@details(a)Concurrency@@IEAAXPEAX(a)Z(ptr ptr) msvcp120.?_Internal_move_push(a)_Concurrent_queue_base_v4@details(a)Concurrency@@IEAAXPEAX(a)Z
-@ thiscall -arch=i386 ?_Internal_pop_if_present(a)_Concurrent_queue_base_v4@details(a)Concurrency@@IAE_NPAX(a)Z(ptr ptr) msvcp120.?_Internal_pop_if_present(a)_Concurrent_queue_base_v4@details(a)Concurrency@@IAE_NPAX(a)Z
-@ cdecl -arch=win64 ?_Internal_pop_if_present(a)_Concurrent_queue_base_v4@details(a)Concurrency@@IEAA_NPEAX(a)Z(ptr ptr) msvcp120.?_Internal_pop_if_present(a)_Concurrent_queue_base_v4@details(a)Concurrency@@IEAA_NPEAX(a)Z
-@ thiscall -arch=i386 ?_Internal_push(a)_Concurrent_queue_base_v4@details(a)Concurrency@@IAEXPBX(a)Z(ptr ptr) msvcp120.?_Internal_push(a)_Concurrent_queue_base_v4@details(a)Concurrency@@IAEXPBX(a)Z
-@ cdecl -arch=win64 ?_Internal_push(a)_Concurrent_queue_base_v4@details(a)Concurrency@@IEAAXPEBX(a)Z(ptr ptr) msvcp120.?_Internal_push(a)_Concurrent_queue_base_v4@details(a)Concurrency@@IEAAXPEBX(a)Z
-@ stub -arch=i386 ?_Internal_push_back(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAEPAXIAAI(a)Z
-@ stub -arch=win64 ?_Internal_push_back(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IEAAPEAX_KAEA_K(a)Z
-@ stub -arch=i386 ?_Internal_reserve(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAEXIII(a)Z
-@ stub -arch=win64 ?_Internal_reserve(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IEAAX_K00(a)Z
-@ stub -arch=i386 ?_Internal_resize(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAEXIIIP6AXPAXI(a)ZP6AX0PBXI@Z2(a)Z
-@ stub -arch=win64 ?_Internal_resize(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IEAAX_K00P6AXPEAX0(a)ZP6AX1PEBX0@Z3(a)Z
-@ thiscall -arch=i386 ?_Internal_size(a)_Concurrent_queue_base_v4@details(a)Concurrency@@IBEIXZ(ptr) msvcp120.?_Internal_size(a)_Concurrent_queue_base_v4@details(a)Concurrency@@IBEIXZ
-@ cdecl -arch=win64 ?_Internal_size(a)_Concurrent_queue_base_v4@details(a)Concurrency@@IEBA_KXZ(ptr) msvcp120.?_Internal_size(a)_Concurrent_queue_base_v4@details(a)Concurrency@@IEBA_KXZ
-@ thiscall -arch=i386 ?_Internal_swap(a)_Concurrent_queue_base_v4@details(a)Concurrency@@IAEXAAV123@@Z(ptr ptr) msvcp120.?_Internal_swap(a)_Concurrent_queue_base_v4@details(a)Concurrency@@IAEXAAV123@@Z
-@ cdecl -arch=win64 ?_Internal_swap(a)_Concurrent_queue_base_v4@details(a)Concurrency@@IEAAXAEAV123@@Z(ptr ptr) msvcp120.?_Internal_swap(a)_Concurrent_queue_base_v4@details(a)Concurrency@@IEAAXAEAV123@@Z
-@ stub -arch=i386 ?_Internal_swap(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAEXAAV123@@Z
-@ stub -arch=win64 ?_Internal_swap(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IEAAXAEAV123@@Z
-@ thiscall -arch=i386 ?_Internal_throw_exception(a)_Concurrent_queue_base_v4@details(a)Concurrency@@IBEXXZ(ptr) msvcp120.?_Internal_throw_exception(a)_Concurrent_queue_base_v4@details(a)Concurrency@@IBEXXZ
-@ cdecl -arch=win64 ?_Internal_throw_exception(a)_Concurrent_queue_base_v4@details(a)Concurrency@@IEBAXXZ(ptr) msvcp120.?_Internal_throw_exception(a)_Concurrent_queue_base_v4@details(a)Concurrency@@IEBAXXZ
-@ thiscall -arch=i386 ?_Internal_throw_exception(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IBEXI(a)Z(ptr long) msvcp120.?_Internal_throw_exception(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IBEXI(a)Z
-@ cdecl -arch=win64 ?_Internal_throw_exception(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IEBAX_K(a)Z(ptr long) msvcp120.?_Internal_throw_exception(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IEBAX_K(a)Z
+@ thiscall -arch=i386 ?_Internal_assign(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAEXABV123(a)IP6AXPAXI@ZP6AX1PBXI(a)Z4@Z(ptr ptr long ptr ptr ptr) msvcp120_app.?_Internal_assign(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAEXABV123(a)IP6AXPAXI@ZP6AX1PBXI(a)Z4@Z
+@ cdecl -arch=win64 ?_Internal_assign(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IEAAXAEBV123(a)_KP6AXPEAX1@ZP6AX2PEBX1(a)Z5@Z(ptr ptr long ptr ptr ptr) msvcp120_app.?_Internal_assign(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IEAAXAEBV123(a)_KP6AXPEAX1@ZP6AX2PEBX1(a)Z5@Z
+@ thiscall -arch=i386 ?_Internal_capacity(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IBEIXZ(ptr) msvcp120_app.?_Internal_capacity(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IBEIXZ
+@ cdecl -arch=win64 ?_Internal_capacity(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IEBA_KXZ(ptr) msvcp120_app.?_Internal_capacity(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IEBA_KXZ
+@ thiscall -arch=i386 ?_Internal_clear(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAEIP6AXPAXI(a)Z@Z(ptr ptr) msvcp120_app.?_Internal_clear(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAEIP6AXPAXI(a)Z@Z
+@ cdecl -arch=win64 ?_Internal_clear(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IEAA_KP6AXPEAX_K(a)Z@Z(ptr ptr) msvcp120_app.?_Internal_clear(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IEAA_KP6AXPEAX_K(a)Z@Z
+@ thiscall -arch=i386 ?_Internal_compact(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAEPAXIPAXP6AX0I(a)ZP6AX0PBXI@Z(a)Z(ptr long ptr ptr ptr) msvcp120_app.?_Internal_compact(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAEPAXIPAXP6AX0I(a)ZP6AX0PBXI@Z(a)Z
+@ cdecl -arch=win64 ?_Internal_compact(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IEAAPEAX_KPEAXP6AX10(a)ZP6AX1PEBX0@Z(a)Z(ptr long ptr ptr ptr) msvcp120_app.?_Internal_compact(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IEAAPEAX_KPEAXP6AX10(a)ZP6AX1PEBX0@Z(a)Z
+@ thiscall -arch=i386 ?_Internal_copy(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAEXABV123(a)IP6AXPAXPBXI@Z(a)Z(ptr ptr long ptr) msvcp120_app.?_Internal_copy(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAEXABV123(a)IP6AXPAXPBXI@Z(a)Z
+@ cdecl -arch=win64 ?_Internal_copy(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IEAAXAEBV123(a)_KP6AXPEAXPEBX1@Z(a)Z(ptr ptr long ptr) msvcp120_app.?_Internal_copy(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IEAAXAEBV123(a)_KP6AXPEAXPEBX1@Z(a)Z
+@ thiscall -arch=i386 ?_Internal_empty(a)_Concurrent_queue_base_v4@details(a)Concurrency@@IBE_NXZ(ptr) msvcp120_app.?_Internal_empty(a)_Concurrent_queue_base_v4@details(a)Concurrency@@IBE_NXZ
+@ cdecl -arch=win64 ?_Internal_empty(a)_Concurrent_queue_base_v4@details(a)Concurrency@@IEBA_NXZ(ptr) msvcp120_app.?_Internal_empty(a)_Concurrent_queue_base_v4@details(a)Concurrency@@IEBA_NXZ
+@ thiscall -arch=i386 ?_Internal_finish_clear(a)_Concurrent_queue_base_v4@details(a)Concurrency@@IAEXXZ(ptr) msvcp120_app.?_Internal_finish_clear(a)_Concurrent_queue_base_v4@details(a)Concurrency@@IAEXXZ
+@ cdecl -arch=win64 ?_Internal_finish_clear(a)_Concurrent_queue_base_v4@details(a)Concurrency@@IEAAXXZ(ptr) msvcp120_app.?_Internal_finish_clear(a)_Concurrent_queue_base_v4@details(a)Concurrency@@IEAAXXZ
+@ thiscall -arch=i386 ?_Internal_grow_by(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAEIIIP6AXPAXPBXI(a)Z1@Z(ptr long long ptr ptr) msvcp120_app.?_Internal_grow_by(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAEIIIP6AXPAXPBXI(a)Z1@Z
+@ cdecl -arch=win64 ?_Internal_grow_by(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IEAA_K_K0P6AXPEAXPEBX0(a)Z2@Z(ptr long long ptr ptr) msvcp120_app.?_Internal_grow_by(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IEAA_K_K0P6AXPEAXPEBX0(a)Z2@Z
+@ thiscall -arch=i386 ?_Internal_grow_to_at_least_with_result(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAEIIIP6AXPAXPBXI(a)Z1@Z(ptr long long ptr ptr) msvcp120_app.?_Internal_grow_to_at_least_with_result(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAEIIIP6AXPAXPBXI(a)Z1@Z
+@ cdecl -arch=win64 ?_Internal_grow_to_at_least_with_result(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IEAA_K_K0P6AXPEAXPEBX0(a)Z2@Z(ptr long long ptr ptr) msvcp120_app.?_Internal_grow_to_at_least_with_result(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IEAA_K_K0P6AXPEAXPEBX0(a)Z2@Z
+@ thiscall -arch=i386 ?_Internal_move_push(a)_Concurrent_queue_base_v4@details(a)Concurrency@@IAEXPAX(a)Z(ptr ptr) msvcp120_app.?_Internal_move_push(a)_Concurrent_queue_base_v4@details(a)Concurrency@@IAEXPAX(a)Z
+@ cdecl -arch=win64 ?_Internal_move_push(a)_Concurrent_queue_base_v4@details(a)Concurrency@@IEAAXPEAX(a)Z(ptr ptr) msvcp120_app.?_Internal_move_push(a)_Concurrent_queue_base_v4@details(a)Concurrency@@IEAAXPEAX(a)Z
+@ thiscall -arch=i386 ?_Internal_pop_if_present(a)_Concurrent_queue_base_v4@details(a)Concurrency@@IAE_NPAX(a)Z(ptr ptr) msvcp120_app.?_Internal_pop_if_present(a)_Concurrent_queue_base_v4@details(a)Concurrency@@IAE_NPAX(a)Z
+@ cdecl -arch=win64 ?_Internal_pop_if_present(a)_Concurrent_queue_base_v4@details(a)Concurrency@@IEAA_NPEAX(a)Z(ptr ptr) msvcp120_app.?_Internal_pop_if_present(a)_Concurrent_queue_base_v4@details(a)Concurrency@@IEAA_NPEAX(a)Z
+@ thiscall -arch=i386 ?_Internal_push(a)_Concurrent_queue_base_v4@details(a)Concurrency@@IAEXPBX(a)Z(ptr ptr) msvcp120_app.?_Internal_push(a)_Concurrent_queue_base_v4@details(a)Concurrency@@IAEXPBX(a)Z
+@ cdecl -arch=win64 ?_Internal_push(a)_Concurrent_queue_base_v4@details(a)Concurrency@@IEAAXPEBX(a)Z(ptr ptr) msvcp120_app.?_Internal_push(a)_Concurrent_queue_base_v4@details(a)Concurrency@@IEAAXPEBX(a)Z
+@ thiscall -arch=i386 ?_Internal_push_back(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAEPAXIAAI(a)Z(ptr long long) msvcp120_app.?_Internal_push_back(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAEPAXIAAI(a)Z
+@ cdecl -arch=win64 ?_Internal_push_back(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IEAAPEAX_KAEA_K(a)Z(ptr long long) msvcp120_app.?_Internal_push_back(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IEAAPEAX_KAEA_K(a)Z
+@ thiscall -arch=i386 ?_Internal_reserve(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAEXIII(a)Z(ptr long long long) msvcp120_app.?_Internal_reserve(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAEXIII(a)Z
+@ cdecl -arch=win64 ?_Internal_reserve(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IEAAX_K00(a)Z(ptr long long long) msvcp120_app.?_Internal_reserve(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IEAAX_K00(a)Z
+@ thiscall -arch=i386 ?_Internal_resize(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAEXIIIP6AXPAXI(a)ZP6AX0PBXI@Z2(a)Z(ptr long long long ptr ptr ptr) msvcp120_app.?_Internal_resize(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAEXIIIP6AXPAXI(a)ZP6AX0PBXI@Z2(a)Z
+@ cdecl -arch=win64 ?_Internal_resize(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IEAAX_K00P6AXPEAX0(a)ZP6AX1PEBX0@Z3(a)Z(ptr long long long ptr ptr ptr) msvcp120_app.?_Internal_resize(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IEAAX_K00P6AXPEAX0(a)ZP6AX1PEBX0@Z3(a)Z
+@ thiscall -arch=i386 ?_Internal_size(a)_Concurrent_queue_base_v4@details(a)Concurrency@@IBEIXZ(ptr) msvcp120_app.?_Internal_size(a)_Concurrent_queue_base_v4@details(a)Concurrency@@IBEIXZ
+@ cdecl -arch=win64 ?_Internal_size(a)_Concurrent_queue_base_v4@details(a)Concurrency@@IEBA_KXZ(ptr) msvcp120_app.?_Internal_size(a)_Concurrent_queue_base_v4@details(a)Concurrency@@IEBA_KXZ
+@ thiscall -arch=i386 ?_Internal_swap(a)_Concurrent_queue_base_v4@details(a)Concurrency@@IAEXAAV123@@Z(ptr ptr) msvcp120_app.?_Internal_swap(a)_Concurrent_queue_base_v4@details(a)Concurrency@@IAEXAAV123@@Z
+@ cdecl -arch=win64 ?_Internal_swap(a)_Concurrent_queue_base_v4@details(a)Concurrency@@IEAAXAEAV123@@Z(ptr ptr) msvcp120_app.?_Internal_swap(a)_Concurrent_queue_base_v4@details(a)Concurrency@@IEAAXAEAV123@@Z
+@ thiscall -arch=i386 ?_Internal_swap(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAEXAAV123@@Z(ptr ptr) msvcp120_app.?_Internal_swap(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAEXAAV123@@Z
+@ cdecl -arch=win64 ?_Internal_swap(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IEAAXAEAV123@@Z(ptr ptr) msvcp120_app.?_Internal_swap(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IEAAXAEAV123@@Z
+@ thiscall -arch=i386 ?_Internal_throw_exception(a)_Concurrent_queue_base_v4@details(a)Concurrency@@IBEXXZ(ptr) msvcp120_app.?_Internal_throw_exception(a)_Concurrent_queue_base_v4@details(a)Concurrency@@IBEXXZ
+@ cdecl -arch=win64 ?_Internal_throw_exception(a)_Concurrent_queue_base_v4@details(a)Concurrency@@IEBAXXZ(ptr) msvcp120_app.?_Internal_throw_exception(a)_Concurrent_queue_base_v4@details(a)Concurrency@@IEBAXXZ
+@ thiscall -arch=i386 ?_Internal_throw_exception(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IBEXI(a)Z(ptr long) msvcp120_app.?_Internal_throw_exception(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IBEXI(a)Z
+@ cdecl -arch=win64 ?_Internal_throw_exception(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IEBAX_K(a)Z(ptr long) msvcp120_app.?_Internal_throw_exception(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IEBAX_K(a)Z
@ stub -arch=i386 ?_IsCanceling(a)_StructuredTaskCollection@details(a)Concurrency@@QAE_NXZ
@ stub -arch=win64 ?_IsCanceling(a)_StructuredTaskCollection@details(a)Concurrency@@QEAA_NXZ
@ stub -arch=i386 ?_IsCanceling(a)_TaskCollection@details(a)Concurrency@@QAE_NXZ
@@ -436,8 +436,8 @@
@ stub -arch=win64 ?_Schedule(a)_TaskCollection@details(a)Concurrency@@QEAAXPEAV_UnrealizedChore(a)23@PEAVlocation(a)3@@Z
@ cdecl -arch=win32 ?_ScheduleTask(a)_CurrentScheduler@details(a)Concurrency@@SAXP6AXPAX(a)Z0@Z(ptr ptr) msvcr120.?_ScheduleTask(a)_CurrentScheduler@details(a)Concurrency@@SAXP6AXPAX(a)Z0@Z
@ cdecl -arch=win64 ?_ScheduleTask(a)_CurrentScheduler@details(a)Concurrency@@SAXP6AXPEAX(a)Z0@Z(ptr ptr) msvcr120.?_ScheduleTask(a)_CurrentScheduler@details(a)Concurrency@@SAXP6AXPEAX(a)Z0@Z
-@ cdecl -arch=win32 ?_Segment_index_of(a)_Concurrent_vector_base_v4@details(a)Concurrency@@KAII(a)Z(long) msvcp120.?_Segment_index_of(a)_Concurrent_vector_base_v4@details(a)Concurrency@@KAII(a)Z
-@ cdecl -arch=win64 ?_Segment_index_of(a)_Concurrent_vector_base_v4@details(a)Concurrency@@KA_K_K(a)Z(long) msvcp120.?_Segment_index_of(a)_Concurrent_vector_base_v4@details(a)Concurrency@@KA_K_K(a)Z
+@ cdecl -arch=win32 ?_Segment_index_of(a)_Concurrent_vector_base_v4@details(a)Concurrency@@KAII(a)Z(long) msvcp120_app.?_Segment_index_of(a)_Concurrent_vector_base_v4@details(a)Concurrency@@KAII(a)Z
+@ cdecl -arch=win64 ?_Segment_index_of(a)_Concurrent_vector_base_v4@details(a)Concurrency@@KA_K_K(a)Z(long) msvcp120_app.?_Segment_index_of(a)_Concurrent_vector_base_v4@details(a)Concurrency@@KA_K_K(a)Z
@ thiscall -arch=i386 ?_SetSpinCount@?$_SpinWait@$00(a)details@Concurrency@@QAEXI(a)Z(ptr long) msvcr120.?_SetSpinCount@?$_SpinWait@$00(a)details@Concurrency@@QAEXI(a)Z
@ cdecl -arch=win64 ?_SetSpinCount@?$_SpinWait@$00(a)details@Concurrency@@QEAAXI(a)Z(ptr long) msvcr120.?_SetSpinCount@?$_SpinWait@$00(a)details@Concurrency@@QEAAXI(a)Z
@ thiscall -arch=i386 ?_SetSpinCount@?$_SpinWait@$0A@@details(a)Concurrency@@QAEXI(a)Z(ptr long) msvcr120.?_SetSpinCount@?$_SpinWait@$0A@@details(a)Concurrency@@QAEXI(a)Z
@@ -477,7 +477,7 @@
@ stub ?from_numa_node(a)location@Concurrency@@SA?AV12(a)G@Z
@ thiscall -arch=i386 ?get_error_code(a)scheduler_resource_allocation_error@Concurrency@@QBEJXZ(ptr) msvcr120.?get_error_code(a)scheduler_resource_allocation_error@Concurrency@@QBEJXZ
@ cdecl -arch=win64 ?get_error_code(a)scheduler_resource_allocation_error@Concurrency@@QEBAJXZ(ptr) msvcr120.?get_error_code(a)scheduler_resource_allocation_error@Concurrency@@QEBAJXZ
-@ cdecl ?is_current_task_group_canceling(a)Concurrency@@YA_NXZ() msvcp120.?is_current_task_group_canceling(a)Concurrency@@YA_NXZ
+@ cdecl ?is_current_task_group_canceling(a)Concurrency@@YA_NXZ() msvcp120_app.?is_current_task_group_canceling(a)Concurrency@@YA_NXZ
@ thiscall -arch=i386 ?lock(a)critical_section@Concurrency@@QAEXXZ(ptr) msvcr120.?lock(a)critical_section@Concurrency@@QAEXXZ
@ cdecl -arch=win64 ?lock(a)critical_section@Concurrency@@QEAAXXZ(ptr) msvcr120.?lock(a)critical_section@Concurrency@@QEAAXXZ
@ thiscall -arch=win32 ?lock(a)reader_writer_lock@Concurrency@@QAEXXZ(ptr) msvcr120.?lock(a)reader_writer_lock@Concurrency@@QAEXXZ
diff --git a/dlls/msvcp100/msvcp100.spec b/dlls/msvcp100/msvcp100.spec
index 0d6e6dc..9da72a4 100644
--- a/dlls/msvcp100/msvcp100.spec
+++ b/dlls/msvcp100/msvcp100.spec
@@ -312,8 +312,8 @@
@ cdecl -arch=win64 ??1_Concurrent_queue_base_v4(a)details@Concurrency@@MEAA(a)XZ(ptr) _Concurrent_queue_base_v4_dtor
@ stub -arch=win32 ??1_Concurrent_queue_iterator_base_v4(a)details@Concurrency@@IAE(a)XZ
@ stub -arch=win64 ??1_Concurrent_queue_iterator_base_v4(a)details@Concurrency@@IEAA(a)XZ
-@ stub -arch=win32 ??1_Concurrent_vector_base_v4(a)details@Concurrency@@IAE(a)XZ
-@ stub -arch=win64 ??1_Concurrent_vector_base_v4(a)details@Concurrency@@IEAA(a)XZ
+@ thiscall -arch=win32 ??1_Concurrent_vector_base_v4(a)details@Concurrency@@IAE(a)XZ(ptr) _Concurrent_vector_base_v4_dtor
+@ cdecl -arch=win64 ??1_Concurrent_vector_base_v4(a)details@Concurrency@@IEAA(a)XZ(ptr) _Concurrent_vector_base_v4_dtor
@ cdecl -arch=arm ??1_Container_base12(a)std@@QAA(a)XZ(ptr) _Container_base12_dtor
@ thiscall -arch=i386 ??1_Container_base12(a)std@@QAE(a)XZ(ptr) _Container_base12_dtor
@ cdecl -arch=win64 ??1_Container_base12(a)std@@QEAA(a)XZ(ptr) _Container_base12_dtor
@@ -1029,38 +1029,38 @@
@ stub -arch=win64 ?_Init_locks_ctor(a)_Init_locks@std@@CAXPEAV12@@Z
@ stub -arch=win32 ?_Init_locks_dtor(a)_Init_locks@std@@CAXPAV12@@Z
@ stub -arch=win64 ?_Init_locks_dtor(a)_Init_locks@std@@CAXPEAV12@@Z
-@ stub -arch=win32 ?_Internal_assign(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAEXABV123(a)IP6AXPAXI@ZP6AX1PBXI(a)Z4@Z
-@ stub -arch=win64 ?_Internal_assign(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IEAAXAEBV123(a)_KP6AXPEAX1@ZP6AX2PEBX1(a)Z5@Z
-@ stub -arch=win32 ?_Internal_capacity(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IBEIXZ
-@ stub -arch=win64 ?_Internal_capacity(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IEBA_KXZ
-@ stub -arch=win32 ?_Internal_clear(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAEIP6AXPAXI(a)Z@Z
-@ stub -arch=win64 ?_Internal_clear(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IEAA_KP6AXPEAX_K(a)Z@Z
-@ stub -arch=win32 ?_Internal_compact(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAEPAXIPAXP6AX0I(a)ZP6AX0PBXI@Z(a)Z
-@ stub -arch=win64 ?_Internal_compact(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IEAAPEAX_KPEAXP6AX10(a)ZP6AX1PEBX0@Z(a)Z
-@ stub -arch=win32 ?_Internal_copy(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAEXABV123(a)IP6AXPAXPBXI@Z(a)Z
-@ stub -arch=win64 ?_Internal_copy(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IEAAXAEBV123(a)_KP6AXPEAXPEBX1@Z(a)Z
+@ cdecl -arch=win32 ?_Internal_assign(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAEXABV123(a)IP6AXPAXI@ZP6AX1PBXI(a)Z4@Z(ptr ptr long ptr ptr ptr) _Concurrent_vector_base_v4__Internal_assign
+@ thiscall -arch=win64 ?_Internal_assign(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IEAAXAEBV123(a)_KP6AXPEAX1@ZP6AX2PEBX1(a)Z5@Z(ptr ptr long ptr ptr ptr) _Concurrent_vector_base_v4__Internal_assign
+@ thiscall -arch=win32 ?_Internal_capacity(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IBEIXZ(ptr) _Concurrent_vector_base_v4__Internal_capacity
+@ cdecl -arch=win64 ?_Internal_capacity(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IEBA_KXZ(ptr) _Concurrent_vector_base_v4__Internal_capacity
+@ thiscall -arch=win32 ?_Internal_clear(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAEIP6AXPAXI(a)Z@Z(ptr ptr) _Concurrent_vector_base_v4__Internal_clear
+@ cdecl -arch=win64 ?_Internal_clear(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IEAA_KP6AXPEAX_K(a)Z@Z(ptr ptr) _Concurrent_vector_base_v4__Internal_clear
+@ thiscall -arch=win32 ?_Internal_compact(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAEPAXIPAXP6AX0I(a)ZP6AX0PBXI@Z(a)Z(ptr long ptr ptr ptr) _Concurrent_vector_base_v4__Internal_compact
+@ cdecl -arch=win64 ?_Internal_compact(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IEAAPEAX_KPEAXP6AX10(a)ZP6AX1PEBX0@Z(a)Z(ptr long ptr ptr ptr) _Concurrent_vector_base_v4__Internal_compact
+@ thiscall -arch=win32 ?_Internal_copy(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAEXABV123(a)IP6AXPAXPBXI@Z(a)Z(ptr ptr long ptr) _Concurrent_vector_base_v4__Internal_copy
+@ cdecl -arch=win64 ?_Internal_copy(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IEAAXAEBV123(a)_KP6AXPEAXPEBX1@Z(a)Z(ptr ptr long ptr) _Concurrent_vector_base_v4__Internal_copy
@ thiscall -arch=win32 ?_Internal_empty(a)_Concurrent_queue_base_v4@details(a)Concurrency@@IBE_NXZ(ptr) _Concurrent_queue_base_v4__Internal_empty
@ cdecl -arch=win64 ?_Internal_empty(a)_Concurrent_queue_base_v4@details(a)Concurrency@@IEBA_NXZ(ptr) _Concurrent_queue_base_v4__Internal_empty
@ thiscall -arch=win32 ?_Internal_finish_clear(a)_Concurrent_queue_base_v4@details(a)Concurrency@@IAEXXZ(ptr) _Concurrent_queue_base_v4__Internal_finish_clear
@ cdecl -arch=win64 ?_Internal_finish_clear(a)_Concurrent_queue_base_v4@details(a)Concurrency@@IEAAXXZ(ptr) _Concurrent_queue_base_v4__Internal_finish_clear
-@ stub -arch=win32 ?_Internal_grow_by(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAEIIIP6AXPAXPBXI(a)Z1@Z
-@ stub -arch=win64 ?_Internal_grow_by(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IEAA_K_K0P6AXPEAXPEBX0(a)Z2@Z
-@ stub -arch=win32 ?_Internal_grow_to_at_least_with_result(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAEIIIP6AXPAXPBXI(a)Z1@Z
-@ stub -arch=win64 ?_Internal_grow_to_at_least_with_result(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IEAA_K_K0P6AXPEAXPEBX0(a)Z2@Z
+@ thiscall -arch=win32 ?_Internal_grow_by(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAEIIIP6AXPAXPBXI(a)Z1@Z(ptr long long ptr ptr) _Concurrent_vector_base_v4__Internal_grow_by
+@ cdecl -arch=win64 ?_Internal_grow_by(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IEAA_K_K0P6AXPEAXPEBX0(a)Z2@Z(ptr long long ptr ptr) _Concurrent_vector_base_v4__Internal_grow_by
+@ thiscall -arch=win32 ?_Internal_grow_to_at_least_with_result(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAEIIIP6AXPAXPBXI(a)Z1@Z(ptr long long ptr ptr) _Concurrent_vector_base_v4__Internal_grow_to_at_least_with_result
+@ cdecl -arch=win64 ?_Internal_grow_to_at_least_with_result(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IEAA_K_K0P6AXPEAXPEBX0(a)Z2@Z(ptr long long ptr ptr) _Concurrent_vector_base_v4__Internal_grow_to_at_least_with_result
@ thiscall -arch=win32 ?_Internal_pop_if_present(a)_Concurrent_queue_base_v4@details(a)Concurrency@@IAE_NPAX(a)Z(ptr ptr) _Concurrent_queue_base_v4__Internal_pop_if_present
@ cdecl -arch=win64 ?_Internal_pop_if_present(a)_Concurrent_queue_base_v4@details(a)Concurrency@@IEAA_NPEAX(a)Z(ptr ptr) _Concurrent_queue_base_v4__Internal_pop_if_present
@ thiscall -arch=win32 ?_Internal_push(a)_Concurrent_queue_base_v4@details(a)Concurrency@@IAEXPBX(a)Z(ptr ptr) _Concurrent_queue_base_v4__Internal_push
@ cdecl -arch=win64 ?_Internal_push(a)_Concurrent_queue_base_v4@details(a)Concurrency@@IEAAXPEBX(a)Z(ptr ptr) _Concurrent_queue_base_v4__Internal_push
-@ stub -arch=win32 ?_Internal_push_back(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAEPAXIAAI(a)Z
-@ stub -arch=win64 ?_Internal_push_back(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IEAAPEAX_KAEA_K(a)Z
-@ stub -arch=win32 ?_Internal_reserve(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAEXIII(a)Z
-@ stub -arch=win64 ?_Internal_reserve(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IEAAX_K00(a)Z
-@ stub -arch=win32 ?_Internal_resize(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAEXIIIP6AXPAXI(a)ZP6AX0PBXI@Z2(a)Z
-@ stub -arch=win64 ?_Internal_resize(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IEAAX_K00P6AXPEAX0(a)ZP6AX1PEBX0@Z3(a)Z
+@ thiscall -arch=win32 ?_Internal_push_back(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAEPAXIAAI(a)Z(ptr long long) _Concurrent_vector_base_v4__Internal_push_back
+@ cdecl -arch=win64 ?_Internal_push_back(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IEAAPEAX_KAEA_K(a)Z(ptr long long) _Concurrent_vector_base_v4__Internal_push_back
+@ thiscall -arch=win32 ?_Internal_reserve(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAEXIII(a)Z(ptr long long long) _Concurrent_vector_base_v4__Internal_reserve
+@ cdecl -arch=win64 ?_Internal_reserve(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IEAAX_K00(a)Z(ptr long long long) _Concurrent_vector_base_v4__Internal_reserve
+@ thiscall -arch=win32 ?_Internal_resize(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAEXIIIP6AXPAXI(a)ZP6AX0PBXI@Z2(a)Z(ptr long long long ptr ptr ptr) _Concurrent_vector_base_v4__Internal_resize
+@ cdecl -arch=win64 ?_Internal_resize(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IEAAX_K00P6AXPEAX0(a)ZP6AX1PEBX0@Z3(a)Z(ptr long long long ptr ptr ptr) _Concurrent_vector_base_v4__Internal_resize
@ thiscall -arch=win32 ?_Internal_size(a)_Concurrent_queue_base_v4@details(a)Concurrency@@IBEIXZ(ptr) _Concurrent_queue_base_v4__Internal_size
@ cdecl -arch=win64 ?_Internal_size(a)_Concurrent_queue_base_v4@details(a)Concurrency@@IEBA_KXZ(ptr) _Concurrent_queue_base_v4__Internal_size
-@ stub -arch=win32 ?_Internal_swap(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAEXAAV123@@Z
-@ stub -arch=win64 ?_Internal_swap(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IEAAXAEAV123@@Z
+@ thiscall -arch=win32 ?_Internal_swap(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAEXAAV123@@Z(ptr ptr) _Concurrent_vector_base_v4__Internal_swap
+@ cdecl -arch=win64 ?_Internal_swap(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IEAAXAEAV123@@Z(ptr ptr) _Concurrent_vector_base_v4__Internal_swap
@ thiscall -arch=win32 ?_Internal_throw_exception(a)_Concurrent_queue_base_v4@details(a)Concurrency@@IBEXXZ(ptr) _Concurrent_queue_base_v4__Internal_throw_exception
@ cdecl -arch=win64 ?_Internal_throw_exception(a)_Concurrent_queue_base_v4@details(a)Concurrency@@IEBAXXZ(ptr) _Concurrent_queue_base_v4__Internal_throw_exception
@ thiscall -arch=win32 ?_Internal_throw_exception(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IBEXI(a)Z(ptr long) _vector_base_v4__Internal_throw_exception
diff --git a/dlls/msvcp110/msvcp110.spec b/dlls/msvcp110/msvcp110.spec
index 08c3a09..c7c8831 100644
--- a/dlls/msvcp110/msvcp110.spec
+++ b/dlls/msvcp110/msvcp110.spec
@@ -475,9 +475,9 @@
@ stub -arch=arm ??1_Concurrent_queue_iterator_base_v4(a)details@Concurrency@@IAA(a)XZ
@ stub -arch=i386 ??1_Concurrent_queue_iterator_base_v4(a)details@Concurrency@@IAE(a)XZ
@ stub -arch=win64 ??1_Concurrent_queue_iterator_base_v4(a)details@Concurrency@@IEAA(a)XZ
-@ stub -arch=arm ??1_Concurrent_vector_base_v4(a)details@Concurrency@@IAA(a)XZ
-@ stub -arch=i386 ??1_Concurrent_vector_base_v4(a)details@Concurrency@@IAE(a)XZ
-@ stub -arch=win64 ??1_Concurrent_vector_base_v4(a)details@Concurrency@@IEAA(a)XZ
+@ cdecl -arch=arm ??1_Concurrent_vector_base_v4(a)details@Concurrency@@IAA(a)XZ(ptr) _Concurrent_vector_base_v4_dtor
+@ thiscall -arch=i386 ??1_Concurrent_vector_base_v4(a)details@Concurrency@@IAE(a)XZ(ptr) _Concurrent_vector_base_v4_dtor
+@ cdecl -arch=win64 ??1_Concurrent_vector_base_v4(a)details@Concurrency@@IEAA(a)XZ(ptr) _Concurrent_vector_base_v4_dtor
@ cdecl -arch=arm ??1_Container_base12(a)std@@QAA(a)XZ(ptr) _Container_base12_dtor
@ thiscall -arch=i386 ??1_Container_base12(a)std@@QAE(a)XZ(ptr) _Container_base12_dtor
@ cdecl -arch=win64 ??1_Container_base12(a)std@@QEAA(a)XZ(ptr) _Container_base12_dtor
@@ -1482,33 +1482,33 @@
@ stub -arch=win64 ?_Init_locks_ctor(a)_Init_locks@std@@CAXPEAV12@@Z
@ stub -arch=win32 ?_Init_locks_dtor(a)_Init_locks@std@@CAXPAV12@@Z
@ stub -arch=win64 ?_Init_locks_dtor(a)_Init_locks@std@@CAXPEAV12@@Z
-@ stub -arch=arm ?_Internal_assign(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAAXABV123(a)IP6AXPAXI@ZP6AX1PBXI(a)Z4@Z
-@ stub -arch=i386 ?_Internal_assign(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAEXABV123(a)IP6AXPAXI@ZP6AX1PBXI(a)Z4@Z
-@ stub -arch=win64 ?_Internal_assign(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IEAAXAEBV123(a)_KP6AXPEAX1@ZP6AX2PEBX1(a)Z5@Z
-@ stub -arch=arm ?_Internal_capacity(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IBAIXZ
-@ stub -arch=i386 ?_Internal_capacity(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IBEIXZ
-@ stub -arch=win64 ?_Internal_capacity(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IEBA_KXZ
-@ stub -arch=arm ?_Internal_clear(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAAIP6AXPAXI(a)Z@Z
-@ stub -arch=i386 ?_Internal_clear(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAEIP6AXPAXI(a)Z@Z
-@ stub -arch=win64 ?_Internal_clear(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IEAA_KP6AXPEAX_K(a)Z@Z
-@ stub -arch=arm ?_Internal_compact(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAAPAXIPAXP6AX0I(a)ZP6AX0PBXI@Z(a)Z
-@ stub -arch=i386 ?_Internal_compact(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAEPAXIPAXP6AX0I(a)ZP6AX0PBXI@Z(a)Z
-@ stub -arch=win64 ?_Internal_compact(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IEAAPEAX_KPEAXP6AX10(a)ZP6AX1PEBX0@Z(a)Z
-@ stub -arch=arm ?_Internal_copy(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAAXABV123(a)IP6AXPAXPBXI@Z(a)Z
-@ stub -arch=i386 ?_Internal_copy(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAEXABV123(a)IP6AXPAXPBXI@Z(a)Z
-@ stub -arch=win64 ?_Internal_copy(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IEAAXAEBV123(a)_KP6AXPEAXPEBX1@Z(a)Z
+@ cdecl -arch=arm ?_Internal_assign(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAAXABV123(a)IP6AXPAXI@ZP6AX1PBXI(a)Z4@Z(ptr ptr long ptr ptr ptr) _Concurrent_vector_base_v4__Internal_assign
+@ thiscall -arch=i386 ?_Internal_assign(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAEXABV123(a)IP6AXPAXI@ZP6AX1PBXI(a)Z4@Z(ptr ptr long ptr ptr ptr) _Concurrent_vector_base_v4__Internal_assign
+@ cdecl -arch=win64 ?_Internal_assign(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IEAAXAEBV123(a)_KP6AXPEAX1@ZP6AX2PEBX1(a)Z5@Z(ptr ptr long ptr ptr ptr) _Concurrent_vector_base_v4__Internal_assign
+@ cdecl -arch=arm ?_Internal_capacity(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IBAIXZ(ptr) _Concurrent_vector_base_v4__Internal_capacity
+@ thiscall -arch=i386 ?_Internal_capacity(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IBEIXZ(ptr) _Concurrent_vector_base_v4__Internal_capacity
+@ cdecl -arch=win64 ?_Internal_capacity(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IEBA_KXZ(ptr) _Concurrent_vector_base_v4__Internal_capacity
+@ cdecl -arch=arm ?_Internal_clear(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAAIP6AXPAXI(a)Z@Z(ptr ptr) _Concurrent_vector_base_v4__Internal_clear
+@ thiscall -arch=i386 ?_Internal_clear(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAEIP6AXPAXI(a)Z@Z(ptr ptr) _Concurrent_vector_base_v4__Internal_clear
+@ cdecl -arch=win64 ?_Internal_clear(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IEAA_KP6AXPEAX_K(a)Z@Z(ptr ptr) _Concurrent_vector_base_v4__Internal_clear
+@ cdecl -arch=arm ?_Internal_compact(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAAPAXIPAXP6AX0I(a)ZP6AX0PBXI@Z(a)Z(ptr long ptr ptr ptr) _Concurrent_vector_base_v4__Internal_compact
+@ thiscall -arch=i386 ?_Internal_compact(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAEPAXIPAXP6AX0I(a)ZP6AX0PBXI@Z(a)Z(ptr long ptr ptr ptr) _Concurrent_vector_base_v4__Internal_compact
+@ cdecl -arch=win64 ?_Internal_compact(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IEAAPEAX_KPEAXP6AX10(a)ZP6AX1PEBX0@Z(a)Z(ptr long ptr ptr ptr) _Concurrent_vector_base_v4__Internal_compact
+@ cdecl -arch=arm ?_Internal_copy(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAAXABV123(a)IP6AXPAXPBXI@Z(a)Z(ptr ptr long ptr) _Concurrent_vector_base_v4__Internal_copy
+@ thiscall -arch=i386 ?_Internal_copy(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAEXABV123(a)IP6AXPAXPBXI@Z(a)Z(ptr ptr long ptr) _Concurrent_vector_base_v4__Internal_copy
+@ cdecl -arch=win64 ?_Internal_copy(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IEAAXAEBV123(a)_KP6AXPEAXPEBX1@Z(a)Z(ptr ptr long ptr) _Concurrent_vector_base_v4__Internal_copy
@ cdecl -arch=arm ?_Internal_empty(a)_Concurrent_queue_base_v4@details(a)Concurrency@@IBA_NXZ(ptr) _Concurrent_queue_base_v4__Internal_empty
@ thiscall -arch=i386 ?_Internal_empty(a)_Concurrent_queue_base_v4@details(a)Concurrency@@IBE_NXZ(ptr) _Concurrent_queue_base_v4__Internal_empty
@ cdecl -arch=win64 ?_Internal_empty(a)_Concurrent_queue_base_v4@details(a)Concurrency@@IEBA_NXZ(ptr) _Concurrent_queue_base_v4__Internal_empty
@ cdecl -arch=arm ?_Internal_finish_clear(a)_Concurrent_queue_base_v4@details(a)Concurrency@@IAAXXZ(ptr) _Concurrent_queue_base_v4__Internal_finish_clear
@ thiscall -arch=i386 ?_Internal_finish_clear(a)_Concurrent_queue_base_v4@details(a)Concurrency@@IAEXXZ(ptr) _Concurrent_queue_base_v4__Internal_finish_clear
@ cdecl -arch=win64 ?_Internal_finish_clear(a)_Concurrent_queue_base_v4@details(a)Concurrency@@IEAAXXZ(ptr) _Concurrent_queue_base_v4__Internal_finish_clear
-@ stub -arch=arm ?_Internal_grow_by(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAAIIIP6AXPAXPBXI(a)Z1@Z
-@ stub -arch=i386 ?_Internal_grow_by(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAEIIIP6AXPAXPBXI(a)Z1@Z
-@ stub -arch=win64 ?_Internal_grow_by(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IEAA_K_K0P6AXPEAXPEBX0(a)Z2@Z
-@ stub -arch=arm ?_Internal_grow_to_at_least_with_result(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAAIIIP6AXPAXPBXI(a)Z1@Z
-@ stub -arch=i386 ?_Internal_grow_to_at_least_with_result(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAEIIIP6AXPAXPBXI(a)Z1@Z
-@ stub -arch=win64 ?_Internal_grow_to_at_least_with_result(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IEAA_K_K0P6AXPEAXPEBX0(a)Z2@Z
+@ cdecl -arch=arm ?_Internal_grow_by(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAAIIIP6AXPAXPBXI(a)Z1@Z(ptr long long ptr ptr) _Concurrent_vector_base_v4__Internal_grow_by
+@ thiscall -arch=i386 ?_Internal_grow_by(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAEIIIP6AXPAXPBXI(a)Z1@Z(ptr long long ptr ptr) _Concurrent_vector_base_v4__Internal_grow_by
+@ cdecl -arch=win64 ?_Internal_grow_by(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IEAA_K_K0P6AXPEAXPEBX0(a)Z2@Z(ptr long long ptr ptr) _Concurrent_vector_base_v4__Internal_grow_by
+@ cdecl -arch=arm ?_Internal_grow_to_at_least_with_result(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAAIIIP6AXPAXPBXI(a)Z1@Z(ptr long long ptr ptr) _Concurrent_vector_base_v4__Internal_grow_to_at_least_with_result
+@ thiscall -arch=i386 ?_Internal_grow_to_at_least_with_result(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAEIIIP6AXPAXPBXI(a)Z1@Z(ptr long long ptr ptr) _Concurrent_vector_base_v4__Internal_grow_to_at_least_with_result
+@ cdecl -arch=win64 ?_Internal_grow_to_at_least_with_result(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IEAA_K_K0P6AXPEAXPEBX0(a)Z2@Z(ptr long long ptr ptr) _Concurrent_vector_base_v4__Internal_grow_to_at_least_with_result
@ cdecl -arch=arm ?_Internal_move_push(a)_Concurrent_queue_base_v4@details(a)Concurrency@@IAAXPAX(a)Z(ptr ptr) _Concurrent_queue_base_v4__Internal_move_push
@ thiscall -arch=i386 ?_Internal_move_push(a)_Concurrent_queue_base_v4@details(a)Concurrency@@IAEXPAX(a)Z(ptr ptr) _Concurrent_queue_base_v4__Internal_move_push
@ cdecl -arch=win64 ?_Internal_move_push(a)_Concurrent_queue_base_v4@details(a)Concurrency@@IEAAXPEAX(a)Z(ptr ptr) _Concurrent_queue_base_v4__Internal_move_push
@@ -1518,24 +1518,24 @@
@ cdecl -arch=arm ?_Internal_push(a)_Concurrent_queue_base_v4@details(a)Concurrency@@IAAXPBX(a)Z(ptr ptr) _Concurrent_queue_base_v4__Internal_push
@ thiscall -arch=i386 ?_Internal_push(a)_Concurrent_queue_base_v4@details(a)Concurrency@@IAEXPBX(a)Z(ptr ptr) _Concurrent_queue_base_v4__Internal_push
@ cdecl -arch=win64 ?_Internal_push(a)_Concurrent_queue_base_v4@details(a)Concurrency@@IEAAXPEBX(a)Z(ptr ptr) _Concurrent_queue_base_v4__Internal_push
-@ stub -arch=arm ?_Internal_push_back(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAAPAXIAAI(a)Z
-@ stub -arch=i386 ?_Internal_push_back(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAEPAXIAAI(a)Z
-@ stub -arch=win64 ?_Internal_push_back(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IEAAPEAX_KAEA_K(a)Z
-@ stub -arch=arm ?_Internal_reserve(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAAXIII(a)Z
-@ stub -arch=i386 ?_Internal_reserve(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAEXIII(a)Z
-@ stub -arch=win64 ?_Internal_reserve(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IEAAX_K00(a)Z
-@ stub -arch=arm ?_Internal_resize(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAAXIIIP6AXPAXI(a)ZP6AX0PBXI@Z2(a)Z
-@ stub -arch=i386 ?_Internal_resize(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAEXIIIP6AXPAXI(a)ZP6AX0PBXI@Z2(a)Z
-@ stub -arch=win64 ?_Internal_resize(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IEAAX_K00P6AXPEAX0(a)ZP6AX1PEBX0@Z3(a)Z
+@ cdecl -arch=arm ?_Internal_push_back(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAAPAXIAAI(a)Z(ptr long long) _Concurrent_vector_base_v4__Internal_push_back
+@ thiscall -arch=i386 ?_Internal_push_back(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAEPAXIAAI(a)Z(ptr long long) _Concurrent_vector_base_v4__Internal_push_back
+@ cdecl -arch=win64 ?_Internal_push_back(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IEAAPEAX_KAEA_K(a)Z(ptr long long) _Concurrent_vector_base_v4__Internal_push_back
+@ cdecl -arch=arm ?_Internal_reserve(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAAXIII(a)Z(ptr long long long) _Concurrent_vector_base_v4__Internal_reserve
+@ thiscall -arch=i386 ?_Internal_reserve(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAEXIII(a)Z(ptr long long long) _Concurrent_vector_base_v4__Internal_reserve
+@ cdecl -arch=win64 ?_Internal_reserve(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IEAAX_K00(a)Z(ptr long long long) _Concurrent_vector_base_v4__Internal_reserve
+@ cdecl -arch=arm ?_Internal_resize(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAAXIIIP6AXPAXI(a)ZP6AX0PBXI@Z2(a)Z(ptr long long long ptr ptr ptr) _Concurrent_vector_base_v4__Internal_resize
+@ thiscall -arch=i386 ?_Internal_resize(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAEXIIIP6AXPAXI(a)ZP6AX0PBXI@Z2(a)Z(ptr long long long ptr ptr ptr) _Concurrent_vector_base_v4__Internal_resize
+@ cdecl -arch=win64 ?_Internal_resize(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IEAAX_K00P6AXPEAX0(a)ZP6AX1PEBX0@Z3(a)Z(ptr long long long ptr ptr ptr) _Concurrent_vector_base_v4__Internal_resize
@ cdecl -arch=arm ?_Internal_size(a)_Concurrent_queue_base_v4@details(a)Concurrency@@IBAIXZ(ptr) _Concurrent_queue_base_v4__Internal_size
@ thiscall -arch=i386 ?_Internal_size(a)_Concurrent_queue_base_v4@details(a)Concurrency@@IBEIXZ(ptr) _Concurrent_queue_base_v4__Internal_size
@ cdecl -arch=win64 ?_Internal_size(a)_Concurrent_queue_base_v4@details(a)Concurrency@@IEBA_KXZ(ptr) _Concurrent_queue_base_v4__Internal_size
@ cdecl -arch=arm ?_Internal_swap(a)_Concurrent_queue_base_v4@details(a)Concurrency@@IAAXAAV123@@Z(ptr ptr) _Concurrent_queue_base_v4__Internal_swap
@ thiscall -arch=i386 ?_Internal_swap(a)_Concurrent_queue_base_v4@details(a)Concurrency@@IAEXAAV123@@Z(ptr ptr) _Concurrent_queue_base_v4__Internal_swap
@ cdecl -arch=win64 ?_Internal_swap(a)_Concurrent_queue_base_v4@details(a)Concurrency@@IEAAXAEAV123@@Z(ptr ptr) _Concurrent_queue_base_v4__Internal_swap
-@ stub -arch=arm ?_Internal_swap(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAAXAAV123@@Z
-@ stub -arch=i386 ?_Internal_swap(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAEXAAV123@@Z
-@ stub -arch=win64 ?_Internal_swap(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IEAAXAEAV123@@Z
+@ cdecl -arch=arm ?_Internal_swap(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAAXAAV123@@Z(ptr ptr) _Concurrent_vector_base_v4__Internal_swap
+@ thiscall -arch=i386 ?_Internal_swap(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAEXAAV123@@Z(ptr ptr) _Concurrent_vector_base_v4__Internal_swap
+@ cdecl -arch=win64 ?_Internal_swap(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IEAAXAEAV123@@Z(ptr ptr) _Concurrent_vector_base_v4__Internal_swap
@ cdecl -arch=arm ?_Internal_throw_exception(a)_Concurrent_queue_base_v4@details(a)Concurrency@@IBAXXZ(ptr) _Concurrent_queue_base_v4__Internal_throw_exception
@ thiscall -arch=i386 ?_Internal_throw_exception(a)_Concurrent_queue_base_v4@details(a)Concurrency@@IBEXXZ(ptr) _Concurrent_queue_base_v4__Internal_throw_exception
@ cdecl -arch=win64 ?_Internal_throw_exception(a)_Concurrent_queue_base_v4@details(a)Concurrency@@IEBAXXZ(ptr) _Concurrent_queue_base_v4__Internal_throw_exception
diff --git a/dlls/msvcp120/msvcp120.spec b/dlls/msvcp120/msvcp120.spec
index aebfa71..104c32b 100644
--- a/dlls/msvcp120/msvcp120.spec
+++ b/dlls/msvcp120/msvcp120.spec
@@ -475,9 +475,9 @@
@ stub -arch=arm ??1_Concurrent_queue_iterator_base_v4(a)details@Concurrency@@IAA(a)XZ
@ stub -arch=i386 ??1_Concurrent_queue_iterator_base_v4(a)details@Concurrency@@IAE(a)XZ
@ stub -arch=win64 ??1_Concurrent_queue_iterator_base_v4(a)details@Concurrency@@IEAA(a)XZ
-@ stub -arch=arm ??1_Concurrent_vector_base_v4(a)details@Concurrency@@IAA(a)XZ
-@ stub -arch=i386 ??1_Concurrent_vector_base_v4(a)details@Concurrency@@IAE(a)XZ
-@ stub -arch=win64 ??1_Concurrent_vector_base_v4(a)details@Concurrency@@IEAA(a)XZ
+@ cdecl -arch=arm ??1_Concurrent_vector_base_v4(a)details@Concurrency@@IAA(a)XZ(ptr) _Concurrent_vector_base_v4_dtor
+@ thiscall -arch=i386 ??1_Concurrent_vector_base_v4(a)details@Concurrency@@IAE(a)XZ(ptr) _Concurrent_vector_base_v4_dtor
+@ cdecl -arch=win64 ??1_Concurrent_vector_base_v4(a)details@Concurrency@@IEAA(a)XZ(ptr) _Concurrent_vector_base_v4_dtor
@ cdecl -arch=arm ??1_Container_base12(a)std@@QAA(a)XZ(ptr) _Container_base12_dtor
@ thiscall -arch=i386 ??1_Container_base12(a)std@@QAE(a)XZ(ptr) _Container_base12_dtor
@ cdecl -arch=win64 ??1_Container_base12(a)std@@QEAA(a)XZ(ptr) _Container_base12_dtor
@@ -1443,33 +1443,33 @@
@ stub -arch=win64 ?_Init_locks_ctor(a)_Init_locks@std@@CAXPEAV12@@Z
@ stub -arch=win32 ?_Init_locks_dtor(a)_Init_locks@std@@CAXPAV12@@Z
@ stub -arch=win64 ?_Init_locks_dtor(a)_Init_locks@std@@CAXPEAV12@@Z
-@ stub -arch=arm ?_Internal_assign(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAAXABV123(a)IP6AXPAXI@ZP6AX1PBXI(a)Z4@Z
-@ stub -arch=i386 ?_Internal_assign(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAEXABV123(a)IP6AXPAXI@ZP6AX1PBXI(a)Z4@Z
-@ stub -arch=win64 ?_Internal_assign(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IEAAXAEBV123(a)_KP6AXPEAX1@ZP6AX2PEBX1(a)Z5@Z
-@ stub -arch=arm ?_Internal_capacity(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IBAIXZ
-@ stub -arch=i386 ?_Internal_capacity(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IBEIXZ
-@ stub -arch=win64 ?_Internal_capacity(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IEBA_KXZ
-@ stub -arch=arm ?_Internal_clear(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAAIP6AXPAXI(a)Z@Z
-@ stub -arch=i386 ?_Internal_clear(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAEIP6AXPAXI(a)Z@Z
-@ stub -arch=win64 ?_Internal_clear(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IEAA_KP6AXPEAX_K(a)Z@Z
-@ stub -arch=arm ?_Internal_compact(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAAPAXIPAXP6AX0I(a)ZP6AX0PBXI@Z(a)Z
-@ stub -arch=i386 ?_Internal_compact(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAEPAXIPAXP6AX0I(a)ZP6AX0PBXI@Z(a)Z
-@ stub -arch=win64 ?_Internal_compact(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IEAAPEAX_KPEAXP6AX10(a)ZP6AX1PEBX0@Z(a)Z
-@ stub -arch=arm ?_Internal_copy(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAAXABV123(a)IP6AXPAXPBXI@Z(a)Z
-@ stub -arch=i386 ?_Internal_copy(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAEXABV123(a)IP6AXPAXPBXI@Z(a)Z
-@ stub -arch=win64 ?_Internal_copy(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IEAAXAEBV123(a)_KP6AXPEAXPEBX1@Z(a)Z
+@ cdecl -arch=arm ?_Internal_assign(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAAXABV123(a)IP6AXPAXI@ZP6AX1PBXI(a)Z4@Z(ptr ptr long ptr ptr ptr) _Concurrent_vector_base_v4__Internal_assign
+@ thiscall -arch=i386 ?_Internal_assign(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAEXABV123(a)IP6AXPAXI@ZP6AX1PBXI(a)Z4@Z(ptr ptr long ptr ptr ptr) _Concurrent_vector_base_v4__Internal_assign
+@ cdecl -arch=win64 ?_Internal_assign(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IEAAXAEBV123(a)_KP6AXPEAX1@ZP6AX2PEBX1(a)Z5@Z(ptr ptr long ptr ptr ptr) _Concurrent_vector_base_v4__Internal_assign
+@ cdecl -arch=arm ?_Internal_capacity(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IBAIXZ(ptr) _Concurrent_vector_base_v4__Internal_capacity
+@ thiscall -arch=i386 ?_Internal_capacity(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IBEIXZ(ptr) _Concurrent_vector_base_v4__Internal_capacity
+@ cdecl -arch=win64 ?_Internal_capacity(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IEBA_KXZ(ptr) _Concurrent_vector_base_v4__Internal_capacity
+@ cdecl -arch=arm ?_Internal_clear(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAAIP6AXPAXI(a)Z@Z(ptr ptr) _Concurrent_vector_base_v4__Internal_clear
+@ thiscall -arch=i386 ?_Internal_clear(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAEIP6AXPAXI(a)Z@Z(ptr ptr) _Concurrent_vector_base_v4__Internal_clear
+@ cdecl -arch=win64 ?_Internal_clear(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IEAA_KP6AXPEAX_K(a)Z@Z(ptr ptr) _Concurrent_vector_base_v4__Internal_clear
+@ cdecl -arch=arm ?_Internal_compact(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAAPAXIPAXP6AX0I(a)ZP6AX0PBXI@Z(a)Z(ptr long ptr ptr ptr) _Concurrent_vector_base_v4__Internal_compact
+@ thiscall -arch=i386 ?_Internal_compact(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAEPAXIPAXP6AX0I(a)ZP6AX0PBXI@Z(a)Z(ptr long ptr ptr ptr) _Concurrent_vector_base_v4__Internal_compact
+@ cdecl -arch=win64 ?_Internal_compact(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IEAAPEAX_KPEAXP6AX10(a)ZP6AX1PEBX0@Z(a)Z(ptr long ptr ptr ptr) _Concurrent_vector_base_v4__Internal_compact
+@ cdecl -arch=arm ?_Internal_copy(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAAXABV123(a)IP6AXPAXPBXI@Z(a)Z(ptr ptr long ptr) _Concurrent_vector_base_v4__Internal_copy
+@ thiscall -arch=i386 ?_Internal_copy(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAEXABV123(a)IP6AXPAXPBXI@Z(a)Z(ptr ptr long ptr) _Concurrent_vector_base_v4__Internal_copy
+@ cdecl -arch=win64 ?_Internal_copy(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IEAAXAEBV123(a)_KP6AXPEAXPEBX1@Z(a)Z(ptr ptr long ptr) _Concurrent_vector_base_v4__Internal_copy
@ cdecl -arch=arm ?_Internal_empty(a)_Concurrent_queue_base_v4@details(a)Concurrency@@IBA_NXZ(ptr) _Concurrent_queue_base_v4__Internal_empty
@ thiscall -arch=i386 ?_Internal_empty(a)_Concurrent_queue_base_v4@details(a)Concurrency@@IBE_NXZ(ptr) _Concurrent_queue_base_v4__Internal_empty
@ cdecl -arch=win64 ?_Internal_empty(a)_Concurrent_queue_base_v4@details(a)Concurrency@@IEBA_NXZ(ptr) _Concurrent_queue_base_v4__Internal_empty
@ cdecl -arch=arm ?_Internal_finish_clear(a)_Concurrent_queue_base_v4@details(a)Concurrency@@IAAXXZ(ptr) _Concurrent_queue_base_v4__Internal_finish_clear
@ thiscall -arch=i386 ?_Internal_finish_clear(a)_Concurrent_queue_base_v4@details(a)Concurrency@@IAEXXZ(ptr) _Concurrent_queue_base_v4__Internal_finish_clear
@ cdecl -arch=win64 ?_Internal_finish_clear(a)_Concurrent_queue_base_v4@details(a)Concurrency@@IEAAXXZ(ptr) _Concurrent_queue_base_v4__Internal_finish_clear
-@ stub -arch=arm ?_Internal_grow_by(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAAIIIP6AXPAXPBXI(a)Z1@Z
-@ stub -arch=i386 ?_Internal_grow_by(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAEIIIP6AXPAXPBXI(a)Z1@Z
-@ stub -arch=win64 ?_Internal_grow_by(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IEAA_K_K0P6AXPEAXPEBX0(a)Z2@Z
-@ stub -arch=arm ?_Internal_grow_to_at_least_with_result(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAAIIIP6AXPAXPBXI(a)Z1@Z
-@ stub -arch=i386 ?_Internal_grow_to_at_least_with_result(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAEIIIP6AXPAXPBXI(a)Z1@Z
-@ stub -arch=win64 ?_Internal_grow_to_at_least_with_result(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IEAA_K_K0P6AXPEAXPEBX0(a)Z2@Z
+@ cdecl -arch=arm ?_Internal_grow_by(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAAIIIP6AXPAXPBXI(a)Z1@Z(ptr long long ptr ptr) _Concurrent_vector_base_v4__Internal_grow_by
+@ thiscall -arch=i386 ?_Internal_grow_by(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAEIIIP6AXPAXPBXI(a)Z1@Z(ptr long long ptr ptr) _Concurrent_vector_base_v4__Internal_grow_by
+@ cdecl -arch=win64 ?_Internal_grow_by(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IEAA_K_K0P6AXPEAXPEBX0(a)Z2@Z(ptr long long ptr ptr) _Concurrent_vector_base_v4__Internal_grow_by
+@ cdecl -arch=arm ?_Internal_grow_to_at_least_with_result(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAAIIIP6AXPAXPBXI(a)Z1@Z(ptr long long ptr ptr) _Concurrent_vector_base_v4__Internal_grow_to_at_least_with_result
+@ thiscall -arch=i386 ?_Internal_grow_to_at_least_with_result(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAEIIIP6AXPAXPBXI(a)Z1@Z(ptr long long ptr ptr) _Concurrent_vector_base_v4__Internal_grow_to_at_least_with_result
+@ cdecl -arch=win64 ?_Internal_grow_to_at_least_with_result(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IEAA_K_K0P6AXPEAXPEBX0(a)Z2@Z(ptr long long ptr ptr) _Concurrent_vector_base_v4__Internal_grow_to_at_least_with_result
@ cdecl -arch=arm ?_Internal_move_push(a)_Concurrent_queue_base_v4@details(a)Concurrency@@IAAXPAX(a)Z(ptr ptr) _Concurrent_queue_base_v4__Internal_move_push
@ thiscall -arch=i386 ?_Internal_move_push(a)_Concurrent_queue_base_v4@details(a)Concurrency@@IAEXPAX(a)Z(ptr ptr) _Concurrent_queue_base_v4__Internal_move_push
@ cdecl -arch=win64 ?_Internal_move_push(a)_Concurrent_queue_base_v4@details(a)Concurrency@@IEAAXPEAX(a)Z(ptr ptr) _Concurrent_queue_base_v4__Internal_move_push
@@ -1479,24 +1479,24 @@
@ cdecl -arch=arm ?_Internal_push(a)_Concurrent_queue_base_v4@details(a)Concurrency@@IAAXPBX(a)Z(ptr ptr) _Concurrent_queue_base_v4__Internal_push
@ thiscall -arch=i386 ?_Internal_push(a)_Concurrent_queue_base_v4@details(a)Concurrency@@IAEXPBX(a)Z(ptr ptr) _Concurrent_queue_base_v4__Internal_push
@ cdecl -arch=win64 ?_Internal_push(a)_Concurrent_queue_base_v4@details(a)Concurrency@@IEAAXPEBX(a)Z(ptr ptr) _Concurrent_queue_base_v4__Internal_push
-@ stub -arch=arm ?_Internal_push_back(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAAPAXIAAI(a)Z
-@ stub -arch=i386 ?_Internal_push_back(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAEPAXIAAI(a)Z
-@ stub -arch=win64 ?_Internal_push_back(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IEAAPEAX_KAEA_K(a)Z
-@ stub -arch=arm ?_Internal_reserve(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAAXIII(a)Z
-@ stub -arch=i386 ?_Internal_reserve(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAEXIII(a)Z
-@ stub -arch=win64 ?_Internal_reserve(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IEAAX_K00(a)Z
-@ stub -arch=arm ?_Internal_resize(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAAXIIIP6AXPAXI(a)ZP6AX0PBXI@Z2(a)Z
-@ stub -arch=i386 ?_Internal_resize(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAEXIIIP6AXPAXI(a)ZP6AX0PBXI@Z2(a)Z
-@ stub -arch=win64 ?_Internal_resize(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IEAAX_K00P6AXPEAX0(a)ZP6AX1PEBX0@Z3(a)Z
+@ cdecl -arch=arm ?_Internal_push_back(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAAPAXIAAI(a)Z(ptr long long) _Concurrent_vector_base_v4__Internal_push_back
+@ thiscall -arch=i386 ?_Internal_push_back(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAEPAXIAAI(a)Z(ptr long long) _Concurrent_vector_base_v4__Internal_push_back
+@ cdecl -arch=win64 ?_Internal_push_back(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IEAAPEAX_KAEA_K(a)Z(ptr long long) _Concurrent_vector_base_v4__Internal_push_back
+@ cdecl -arch=arm ?_Internal_reserve(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAAXIII(a)Z(ptr long long long) _Concurrent_vector_base_v4__Internal_reserve
+@ thiscall -arch=i386 ?_Internal_reserve(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAEXIII(a)Z(ptr long long long) _Concurrent_vector_base_v4__Internal_reserve
+@ cdecl -arch=win64 ?_Internal_reserve(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IEAAX_K00(a)Z(ptr long long long) _Concurrent_vector_base_v4__Internal_reserve
+@ cdecl -arch=arm ?_Internal_resize(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAAXIIIP6AXPAXI(a)ZP6AX0PBXI@Z2(a)Z(ptr long long long ptr ptr ptr) _Concurrent_vector_base_v4__Internal_resize
+@ thiscall -arch=i386 ?_Internal_resize(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAEXIIIP6AXPAXI(a)ZP6AX0PBXI@Z2(a)Z(ptr long long long ptr ptr ptr) _Concurrent_vector_base_v4__Internal_resize
+@ cdecl -arch=win64 ?_Internal_resize(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IEAAX_K00P6AXPEAX0(a)ZP6AX1PEBX0@Z3(a)Z(ptr long long long ptr ptr ptr) _Concurrent_vector_base_v4__Internal_resize
@ cdecl -arch=arm ?_Internal_size(a)_Concurrent_queue_base_v4@details(a)Concurrency@@IBAIXZ(ptr) _Concurrent_queue_base_v4__Internal_size
@ thiscall -arch=i386 ?_Internal_size(a)_Concurrent_queue_base_v4@details(a)Concurrency@@IBEIXZ(ptr) _Concurrent_queue_base_v4__Internal_size
@ cdecl -arch=win64 ?_Internal_size(a)_Concurrent_queue_base_v4@details(a)Concurrency@@IEBA_KXZ(ptr) _Concurrent_queue_base_v4__Internal_size
@ cdecl -arch=arm ?_Internal_swap(a)_Concurrent_queue_base_v4@details(a)Concurrency@@IAAXAAV123@@Z(ptr ptr) _Concurrent_queue_base_v4__Internal_swap
@ thiscall -arch=i386 ?_Internal_swap(a)_Concurrent_queue_base_v4@details(a)Concurrency@@IAEXAAV123@@Z(ptr ptr) _Concurrent_queue_base_v4__Internal_swap
@ cdecl -arch=win64 ?_Internal_swap(a)_Concurrent_queue_base_v4@details(a)Concurrency@@IEAAXAEAV123@@Z(ptr ptr) _Concurrent_queue_base_v4__Internal_swap
-@ stub -arch=arm ?_Internal_swap(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAAXAAV123@@Z
-@ stub -arch=i386 ?_Internal_swap(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAEXAAV123@@Z
-@ stub -arch=win64 ?_Internal_swap(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IEAAXAEAV123@@Z
+@ cdecl -arch=arm ?_Internal_swap(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAAXAAV123@@Z(ptr ptr) _Concurrent_vector_base_v4__Internal_swap
+@ thiscall -arch=i386 ?_Internal_swap(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAEXAAV123@@Z(ptr ptr) _Concurrent_vector_base_v4__Internal_swap
+@ cdecl -arch=win64 ?_Internal_swap(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IEAAXAEAV123@@Z(ptr ptr) _Concurrent_vector_base_v4__Internal_swap
@ cdecl -arch=arm ?_Internal_throw_exception(a)_Concurrent_queue_base_v4@details(a)Concurrency@@IBAXXZ(ptr) _Concurrent_queue_base_v4__Internal_throw_exception
@ thiscall -arch=i386 ?_Internal_throw_exception(a)_Concurrent_queue_base_v4@details(a)Concurrency@@IBEXXZ(ptr) _Concurrent_queue_base_v4__Internal_throw_exception
@ cdecl -arch=win64 ?_Internal_throw_exception(a)_Concurrent_queue_base_v4@details(a)Concurrency@@IEBAXXZ(ptr) _Concurrent_queue_base_v4__Internal_throw_exception
diff --git a/dlls/msvcp120_app/msvcp120_app.spec b/dlls/msvcp120_app/msvcp120_app.spec
index 17fa12c..6609bd7 100644
--- a/dlls/msvcp120_app/msvcp120_app.spec
+++ b/dlls/msvcp120_app/msvcp120_app.spec
@@ -475,9 +475,9 @@
@ stub -arch=arm ??1_Concurrent_queue_iterator_base_v4(a)details@Concurrency@@IAA(a)XZ
@ stub -arch=i386 ??1_Concurrent_queue_iterator_base_v4(a)details@Concurrency@@IAE(a)XZ
@ stub -arch=win64 ??1_Concurrent_queue_iterator_base_v4(a)details@Concurrency@@IEAA(a)XZ
-@ stub -arch=arm ??1_Concurrent_vector_base_v4(a)details@Concurrency@@IAA(a)XZ
-@ stub -arch=i386 ??1_Concurrent_vector_base_v4(a)details@Concurrency@@IAE(a)XZ
-@ stub -arch=win64 ??1_Concurrent_vector_base_v4(a)details@Concurrency@@IEAA(a)XZ
+@ cdecl -arch=arm ??1_Concurrent_vector_base_v4(a)details@Concurrency@@IAA(a)XZ(ptr) msvcp120.??1_Concurrent_vector_base_v4(a)details@Concurrency@@IAA(a)XZ
+@ thiscall -arch=i386 ??1_Concurrent_vector_base_v4(a)details@Concurrency@@IAE(a)XZ(ptr) msvcp120.??1_Concurrent_vector_base_v4(a)details@Concurrency@@IAE(a)XZ
+@ cdecl -arch=win64 ??1_Concurrent_vector_base_v4(a)details@Concurrency@@IEAA(a)XZ(ptr) msvcp120.??1_Concurrent_vector_base_v4(a)details@Concurrency@@IEAA(a)XZ
@ cdecl -arch=arm ??1_Container_base12(a)std@@QAA(a)XZ(ptr) msvcp120.??1_Container_base12(a)std@@QAA(a)XZ
@ thiscall -arch=i386 ??1_Container_base12(a)std@@QAE(a)XZ(ptr) msvcp120.??1_Container_base12(a)std@@QAE(a)XZ
@ cdecl -arch=win64 ??1_Container_base12(a)std@@QEAA(a)XZ(ptr) msvcp120.??1_Container_base12(a)std@@QEAA(a)XZ
@@ -1443,33 +1443,33 @@
@ stub -arch=win64 ?_Init_locks_ctor(a)_Init_locks@std@@CAXPEAV12@@Z
@ stub -arch=win32 ?_Init_locks_dtor(a)_Init_locks@std@@CAXPAV12@@Z
@ stub -arch=win64 ?_Init_locks_dtor(a)_Init_locks@std@@CAXPEAV12@@Z
-@ stub -arch=arm ?_Internal_assign(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAAXABV123(a)IP6AXPAXI@ZP6AX1PBXI(a)Z4@Z
-@ stub -arch=i386 ?_Internal_assign(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAEXABV123(a)IP6AXPAXI@ZP6AX1PBXI(a)Z4@Z
-@ stub -arch=win64 ?_Internal_assign(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IEAAXAEBV123(a)_KP6AXPEAX1@ZP6AX2PEBX1(a)Z5@Z
-@ stub -arch=arm ?_Internal_capacity(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IBAIXZ
-@ stub -arch=i386 ?_Internal_capacity(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IBEIXZ
-@ stub -arch=win64 ?_Internal_capacity(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IEBA_KXZ
-@ stub -arch=arm ?_Internal_clear(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAAIP6AXPAXI(a)Z@Z
-@ stub -arch=i386 ?_Internal_clear(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAEIP6AXPAXI(a)Z@Z
-@ stub -arch=win64 ?_Internal_clear(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IEAA_KP6AXPEAX_K(a)Z@Z
-@ stub -arch=arm ?_Internal_compact(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAAPAXIPAXP6AX0I(a)ZP6AX0PBXI@Z(a)Z
-@ stub -arch=i386 ?_Internal_compact(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAEPAXIPAXP6AX0I(a)ZP6AX0PBXI@Z(a)Z
-@ stub -arch=win64 ?_Internal_compact(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IEAAPEAX_KPEAXP6AX10(a)ZP6AX1PEBX0@Z(a)Z
-@ stub -arch=arm ?_Internal_copy(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAAXABV123(a)IP6AXPAXPBXI@Z(a)Z
-@ stub -arch=i386 ?_Internal_copy(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAEXABV123(a)IP6AXPAXPBXI@Z(a)Z
-@ stub -arch=win64 ?_Internal_copy(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IEAAXAEBV123(a)_KP6AXPEAXPEBX1@Z(a)Z
+@ cdecl -arch=arm ?_Internal_assign(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAAXABV123(a)IP6AXPAXI@ZP6AX1PBXI(a)Z4@Z(ptr ptr long ptr ptr ptr) msvcp120.?_Internal_assign(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAAXABV123(a)IP6AXPAXI@ZP6AX1PBXI(a)Z4@Z
+@ thiscall -arch=i386 ?_Internal_assign(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAEXABV123(a)IP6AXPAXI@ZP6AX1PBXI(a)Z4@Z(ptr ptr long ptr ptr ptr) msvcp120.?_Internal_assign(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAEXABV123(a)IP6AXPAXI@ZP6AX1PBXI(a)Z4@Z
+@ cdecl -arch=win64 ?_Internal_assign(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IEAAXAEBV123(a)_KP6AXPEAX1@ZP6AX2PEBX1(a)Z5@Z(ptr ptr long ptr ptr ptr) msvcp120.?_Internal_assign(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IEAAXAEBV123(a)_KP6AXPEAX1@ZP6AX2PEBX1(a)Z5@Z
+@ cdecl -arch=arm ?_Internal_capacity(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IBAIXZ(ptr) msvcp120.?_Internal_capacity(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IBAIXZ
+@ thiscall -arch=i386 ?_Internal_capacity(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IBEIXZ(ptr) msvcp120.?_Internal_capacity(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IBEIXZ
+@ cdecl -arch=win64 ?_Internal_capacity(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IEBA_KXZ(ptr) msvcp120.?_Internal_capacity(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IEBA_KXZ
+@ cdecl -arch=arm ?_Internal_clear(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAAIP6AXPAXI(a)Z@Z(ptr ptr) msvcp120.?_Internal_clear(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAAIP6AXPAXI(a)Z@Z
+@ thiscall -arch=i386 ?_Internal_clear(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAEIP6AXPAXI(a)Z@Z(ptr ptr) msvcp120.?_Internal_clear(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAEIP6AXPAXI(a)Z@Z
+@ cdecl -arch=win64 ?_Internal_clear(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IEAA_KP6AXPEAX_K(a)Z@Z(ptr ptr) msvcp120.?_Internal_clear(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IEAA_KP6AXPEAX_K(a)Z@Z
+@ cdecl -arch=arm ?_Internal_compact(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAAPAXIPAXP6AX0I(a)ZP6AX0PBXI@Z(a)Z(ptr long ptr ptr ptr) msvcp120.?_Internal_compact(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAAPAXIPAXP6AX0I(a)ZP6AX0PBXI@Z(a)Z
+@ thiscall -arch=i386 ?_Internal_compact(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAEPAXIPAXP6AX0I(a)ZP6AX0PBXI@Z(a)Z(ptr long ptr ptr ptr) msvcp120.?_Internal_compact(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAEPAXIPAXP6AX0I(a)ZP6AX0PBXI@Z(a)Z
+@ cdecl -arch=win64 ?_Internal_compact(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IEAAPEAX_KPEAXP6AX10(a)ZP6AX1PEBX0@Z(a)Z(ptr long ptr ptr ptr) msvcp120.?_Internal_compact(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IEAAPEAX_KPEAXP6AX10(a)ZP6AX1PEBX0@Z(a)Z
+@ cdecl -arch=arm ?_Internal_copy(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAAXABV123(a)IP6AXPAXPBXI@Z(a)Z(ptr ptr long ptr) msvcp120.?_Internal_copy(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAAXABV123(a)IP6AXPAXPBXI@Z(a)Z
+@ thiscall -arch=i386 ?_Internal_copy(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAEXABV123(a)IP6AXPAXPBXI@Z(a)Z(ptr ptr long ptr) msvcp120.?_Internal_copy(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAEXABV123(a)IP6AXPAXPBXI@Z(a)Z
+@ cdecl -arch=win64 ?_Internal_copy(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IEAAXAEBV123(a)_KP6AXPEAXPEBX1@Z(a)Z(ptr ptr long ptr) msvcp120.?_Internal_copy(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IEAAXAEBV123(a)_KP6AXPEAXPEBX1@Z(a)Z
@ cdecl -arch=arm ?_Internal_empty(a)_Concurrent_queue_base_v4@details(a)Concurrency@@IBA_NXZ(ptr) msvcp120.?_Internal_empty(a)_Concurrent_queue_base_v4@details(a)Concurrency@@IBA_NXZ
@ thiscall -arch=i386 ?_Internal_empty(a)_Concurrent_queue_base_v4@details(a)Concurrency@@IBE_NXZ(ptr) msvcp120.?_Internal_empty(a)_Concurrent_queue_base_v4@details(a)Concurrency@@IBE_NXZ
@ cdecl -arch=win64 ?_Internal_empty(a)_Concurrent_queue_base_v4@details(a)Concurrency@@IEBA_NXZ(ptr) msvcp120.?_Internal_empty(a)_Concurrent_queue_base_v4@details(a)Concurrency@@IEBA_NXZ
@ cdecl -arch=arm ?_Internal_finish_clear(a)_Concurrent_queue_base_v4@details(a)Concurrency@@IAAXXZ(ptr) msvcp120.?_Internal_finish_clear(a)_Concurrent_queue_base_v4@details(a)Concurrency@@IAAXXZ
@ thiscall -arch=i386 ?_Internal_finish_clear(a)_Concurrent_queue_base_v4@details(a)Concurrency@@IAEXXZ(ptr) msvcp120.?_Internal_finish_clear(a)_Concurrent_queue_base_v4@details(a)Concurrency@@IAEXXZ
@ cdecl -arch=win64 ?_Internal_finish_clear(a)_Concurrent_queue_base_v4@details(a)Concurrency@@IEAAXXZ(ptr) msvcp120.?_Internal_finish_clear(a)_Concurrent_queue_base_v4@details(a)Concurrency@@IEAAXXZ
-@ stub -arch=arm ?_Internal_grow_by(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAAIIIP6AXPAXPBXI(a)Z1@Z
-@ stub -arch=i386 ?_Internal_grow_by(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAEIIIP6AXPAXPBXI(a)Z1@Z
-@ stub -arch=win64 ?_Internal_grow_by(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IEAA_K_K0P6AXPEAXPEBX0(a)Z2@Z
-@ stub -arch=arm ?_Internal_grow_to_at_least_with_result(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAAIIIP6AXPAXPBXI(a)Z1@Z
-@ stub -arch=i386 ?_Internal_grow_to_at_least_with_result(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAEIIIP6AXPAXPBXI(a)Z1@Z
-@ stub -arch=win64 ?_Internal_grow_to_at_least_with_result(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IEAA_K_K0P6AXPEAXPEBX0(a)Z2@Z
+@ cdecl -arch=arm ?_Internal_grow_by(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAAIIIP6AXPAXPBXI(a)Z1@Z(ptr long long ptr ptr) msvcp120.?_Internal_grow_by(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAAIIIP6AXPAXPBXI(a)Z1@Z
+@ thiscall -arch=i386 ?_Internal_grow_by(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAEIIIP6AXPAXPBXI(a)Z1@Z(ptr long long ptr ptr) msvcp120.?_Internal_grow_by(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAEIIIP6AXPAXPBXI(a)Z1@Z
+@ cdecl -arch=win64 ?_Internal_grow_by(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IEAA_K_K0P6AXPEAXPEBX0(a)Z2@Z(ptr long long ptr ptr) msvcp120.?_Internal_grow_by(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IEAA_K_K0P6AXPEAXPEBX0(a)Z2@Z
+@ cdecl -arch=arm ?_Internal_grow_to_at_least_with_result(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAAIIIP6AXPAXPBXI(a)Z1@Z(ptr long long ptr ptr) msvcp120.?_Internal_grow_to_at_least_with_result(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAAIIIP6AXPAXPBXI(a)Z1@Z
+@ thiscall -arch=i386 ?_Internal_grow_to_at_least_with_result(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAEIIIP6AXPAXPBXI(a)Z1@Z(ptr long long ptr ptr) msvcp120.?_Internal_grow_to_at_least_with_result(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAEIIIP6AXPAXPBXI(a)Z1@Z
+@ cdecl -arch=win64 ?_Internal_grow_to_at_least_with_result(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IEAA_K_K0P6AXPEAXPEBX0(a)Z2@Z(ptr long long ptr ptr) msvcp120.?_Internal_grow_to_at_least_with_result(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IEAA_K_K0P6AXPEAXPEBX0(a)Z2@Z
@ cdecl -arch=arm ?_Internal_move_push(a)_Concurrent_queue_base_v4@details(a)Concurrency@@IAAXPAX(a)Z(ptr ptr) msvcp120.?_Internal_move_push(a)_Concurrent_queue_base_v4@details(a)Concurrency@@IAAXPAX(a)Z
@ thiscall -arch=i386 ?_Internal_move_push(a)_Concurrent_queue_base_v4@details(a)Concurrency@@IAEXPAX(a)Z(ptr ptr) msvcp120.?_Internal_move_push(a)_Concurrent_queue_base_v4@details(a)Concurrency@@IAEXPAX(a)Z
@ cdecl -arch=win64 ?_Internal_move_push(a)_Concurrent_queue_base_v4@details(a)Concurrency@@IEAAXPEAX(a)Z(ptr ptr) msvcp120.?_Internal_move_push(a)_Concurrent_queue_base_v4@details(a)Concurrency@@IEAAXPEAX(a)Z
@@ -1479,24 +1479,24 @@
@ cdecl -arch=arm ?_Internal_push(a)_Concurrent_queue_base_v4@details(a)Concurrency@@IAAXPBX(a)Z(ptr ptr) msvcp120.?_Internal_push(a)_Concurrent_queue_base_v4@details(a)Concurrency@@IAAXPBX(a)Z
@ thiscall -arch=i386 ?_Internal_push(a)_Concurrent_queue_base_v4@details(a)Concurrency@@IAEXPBX(a)Z(ptr ptr) msvcp120.?_Internal_push(a)_Concurrent_queue_base_v4@details(a)Concurrency@@IAEXPBX(a)Z
@ cdecl -arch=win64 ?_Internal_push(a)_Concurrent_queue_base_v4@details(a)Concurrency@@IEAAXPEBX(a)Z(ptr ptr) msvcp120.?_Internal_push(a)_Concurrent_queue_base_v4@details(a)Concurrency@@IEAAXPEBX(a)Z
-@ stub -arch=arm ?_Internal_push_back(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAAPAXIAAI(a)Z
-@ stub -arch=i386 ?_Internal_push_back(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAEPAXIAAI(a)Z
-@ stub -arch=win64 ?_Internal_push_back(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IEAAPEAX_KAEA_K(a)Z
-@ stub -arch=arm ?_Internal_reserve(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAAXIII(a)Z
-@ stub -arch=i386 ?_Internal_reserve(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAEXIII(a)Z
-@ stub -arch=win64 ?_Internal_reserve(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IEAAX_K00(a)Z
-@ stub -arch=arm ?_Internal_resize(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAAXIIIP6AXPAXI(a)ZP6AX0PBXI@Z2(a)Z
-@ stub -arch=i386 ?_Internal_resize(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAEXIIIP6AXPAXI(a)ZP6AX0PBXI@Z2(a)Z
-@ stub -arch=win64 ?_Internal_resize(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IEAAX_K00P6AXPEAX0(a)ZP6AX1PEBX0@Z3(a)Z
+@ cdecl -arch=arm ?_Internal_push_back(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAAPAXIAAI(a)Z(ptr long long) msvcp120.?_Internal_push_back(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAAPAXIAAI(a)Z
+@ thiscall -arch=i386 ?_Internal_push_back(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAEPAXIAAI(a)Z(ptr long long) msvcp120.?_Internal_push_back(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAEPAXIAAI(a)Z
+@ cdecl -arch=win64 ?_Internal_push_back(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IEAAPEAX_KAEA_K(a)Z(ptr long long) msvcp120.?_Internal_push_back(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IEAAPEAX_KAEA_K(a)Z
+@ cdecl -arch=arm ?_Internal_reserve(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAAXIII(a)Z(ptr long long long) msvcp120.?_Internal_reserve(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAAXIII(a)Z
+@ thiscall -arch=i386 ?_Internal_reserve(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAEXIII(a)Z(ptr long long long) msvcp120.?_Internal_reserve(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAEXIII(a)Z
+@ cdecl -arch=win64 ?_Internal_reserve(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IEAAX_K00(a)Z(ptr long long long) msvcp120.?_Internal_reserve(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IEAAX_K00(a)Z
+@ cdecl -arch=arm ?_Internal_resize(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAAXIIIP6AXPAXI(a)ZP6AX0PBXI@Z2(a)Z(ptr long long long ptr ptr ptr) msvcp120.?_Internal_resize(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAAXIIIP6AXPAXI(a)ZP6AX0PBXI@Z2(a)Z
+@ thiscall -arch=i386 ?_Internal_resize(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAEXIIIP6AXPAXI(a)ZP6AX0PBXI@Z2(a)Z(ptr long long long ptr ptr ptr) msvcp120.?_Internal_resize(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAEXIIIP6AXPAXI(a)ZP6AX0PBXI@Z2(a)Z
+@ cdecl -arch=win64 ?_Internal_resize(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IEAAX_K00P6AXPEAX0(a)ZP6AX1PEBX0@Z3(a)Z(ptr long long long ptr ptr ptr) msvcp120.?_Internal_resize(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IEAAX_K00P6AXPEAX0(a)ZP6AX1PEBX0@Z3(a)Z
@ cdecl -arch=arm ?_Internal_size(a)_Concurrent_queue_base_v4@details(a)Concurrency@@IBAIXZ(ptr) msvcp120.?_Internal_size(a)_Concurrent_queue_base_v4@details(a)Concurrency@@IBAIXZ
@ thiscall -arch=i386 ?_Internal_size(a)_Concurrent_queue_base_v4@details(a)Concurrency@@IBEIXZ(ptr) msvcp120.?_Internal_size(a)_Concurrent_queue_base_v4@details(a)Concurrency@@IBEIXZ
@ cdecl -arch=win64 ?_Internal_size(a)_Concurrent_queue_base_v4@details(a)Concurrency@@IEBA_KXZ(ptr) msvcp120.?_Internal_size(a)_Concurrent_queue_base_v4@details(a)Concurrency@@IEBA_KXZ
@ cdecl -arch=arm ?_Internal_swap(a)_Concurrent_queue_base_v4@details(a)Concurrency@@IAAXAAV123@@Z(ptr ptr) msvcp120.?_Internal_swap(a)_Concurrent_queue_base_v4@details(a)Concurrency@@IAAXAAV123@@Z
@ thiscall -arch=i386 ?_Internal_swap(a)_Concurrent_queue_base_v4@details(a)Concurrency@@IAEXAAV123@@Z(ptr ptr) msvcp120.?_Internal_swap(a)_Concurrent_queue_base_v4@details(a)Concurrency@@IAEXAAV123@@Z
@ cdecl -arch=win64 ?_Internal_swap(a)_Concurrent_queue_base_v4@details(a)Concurrency@@IEAAXAEAV123@@Z(ptr ptr) msvcp120.?_Internal_swap(a)_Concurrent_queue_base_v4@details(a)Concurrency@@IEAAXAEAV123@@Z
-@ stub -arch=arm ?_Internal_swap(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAAXAAV123@@Z
-@ stub -arch=i386 ?_Internal_swap(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAEXAAV123@@Z
-@ stub -arch=win64 ?_Internal_swap(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IEAAXAEAV123@@Z
+@ cdecl -arch=arm ?_Internal_swap(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAAXAAV123@@Z(ptr ptr) msvcp120.?_Internal_swap(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAAXAAV123@@Z
+@ thiscall -arch=i386 ?_Internal_swap(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAEXAAV123@@Z(ptr ptr) msvcp120.?_Internal_swap(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAEXAAV123@@Z
+@ cdecl -arch=win64 ?_Internal_swap(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IEAAXAEAV123@@Z(ptr ptr) msvcp120.?_Internal_swap(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IEAAXAEAV123@@Z
@ cdecl -arch=arm ?_Internal_throw_exception(a)_Concurrent_queue_base_v4@details(a)Concurrency@@IBAXXZ(ptr) msvcp120.?_Internal_throw_exception(a)_Concurrent_queue_base_v4@details(a)Concurrency@@IBAXXZ
@ thiscall -arch=i386 ?_Internal_throw_exception(a)_Concurrent_queue_base_v4@details(a)Concurrency@@IBEXXZ(ptr) msvcp120.?_Internal_throw_exception(a)_Concurrent_queue_base_v4@details(a)Concurrency@@IBEXXZ
@ cdecl -arch=win64 ?_Internal_throw_exception(a)_Concurrent_queue_base_v4@details(a)Concurrency@@IEBAXXZ(ptr) msvcp120.?_Internal_throw_exception(a)_Concurrent_queue_base_v4@details(a)Concurrency@@IEBAXXZ
diff --git a/dlls/msvcp90/misc.c b/dlls/msvcp90/misc.c
index d9e01d4..1f69410 100644
--- a/dlls/msvcp90/misc.c
+++ b/dlls/msvcp90/misc.c
@@ -1603,6 +1603,145 @@ DEFINE_RTTI_DATA0(_Runtime_object, 0, ".?AV_Runtime_object(a)details@Concurrency@@
#endif
+struct __Concurrent_vector_base_v4;
+
+typedef struct
+{
+ void* (__cdecl *allocator)
+ (struct __Concurrent_vector_base_v4 *, MSVCP_size_t);
+ void *storage[3];
+ MSVCP_size_t first_block;
+ MSVCP_size_t early_size;
+ void **segment;
+} _Concurrent_vector_base_v4;
+
+/* ??1_Concurrent_vector_base_v4(a)details@Concurrency@@IAE(a)XZ */
+/* ??1_Concurrent_vector_base_v4(a)details@Concurrency@@IEAA(a)XZ */
+DEFINE_THISCALL_WRAPPER(_Concurrent_vector_base_v4_dtor, 4)
+void __thiscall _Concurrent_vector_base_v4_dtor(
+ _Concurrent_vector_base_v4 *this)
+{
+ FIXME("(%p) stub\n", this);
+}
+
+/* ?_Internal_assign(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAEXABV123(a)IP6AXPAXI@ZP6AX1PBXI(a)Z4@Z */
+/* ?_Internal_assign(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IEAAXAEBV123(a)_KP6AXPEAX1@ZP6AX2PEBX1(a)Z5@Z */
+DEFINE_THISCALL_WRAPPER(_Concurrent_vector_base_v4__Internal_assign, 24)
+void __thiscall _Concurrent_vector_base_v4__Internal_assign(
+ _Concurrent_vector_base_v4 *this,
+ _Concurrent_vector_base_v4 const *v,
+ MSVCP_size_t len,
+ void (__cdecl *func0)(void *, MSVCP_size_t),
+ void (__cdecl *func1)(void *, void const *, MSVCP_size_t),
+ void (__cdecl *func2)(void *, void const *, MSVCP_size_t))
+{
+ FIXME("(%p %p %ld %p %p %p) stub\n", this, v, len, func0, func1, func2);
+}
+
+/* ?_Internal_capacity(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IBEIXZ */
+/* ?_Internal_capacity(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IEBA_KXZ */
+DEFINE_THISCALL_WRAPPER(_Concurrent_vector_base_v4__Internal_capacity, 4)
+MSVCP_size_t __thiscall _Concurrent_vector_base_v4__Internal_capacity(
+ const _Concurrent_vector_base_v4 *this)
+{
+ FIXME("(%p) stub\n", this);
+ return 0;
+}
+
+/* ?_Internal_clear(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAEIP6AXPAXI(a)Z@Z */
+/* ?_Internal_clear(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IEAA_KP6AXPEAX_K(a)Z@Z */
+DEFINE_THISCALL_WRAPPER(_Concurrent_vector_base_v4__Internal_clear, 8)
+MSVCP_size_t __thiscall _Concurrent_vector_base_v4__Internal_clear(
+ _Concurrent_vector_base_v4 *this, void (__cdecl *clear)(void *, MSVCP_size_t))
+{
+ FIXME("(%p %p) stub\n", this, clear);
+ return 0;
+}
+
+/* ?_Internal_compact(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAEPAXIPAXP6AX0I(a)ZP6AX0PBXI@Z(a)Z */
+/* ?_Internal_compact(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IEAAPEAX_KPEAXP6AX10(a)ZP6AX1PEBX0@Z(a)Z */
+DEFINE_THISCALL_WRAPPER(_Concurrent_vector_base_v4__Internal_compact, 20)
+void * __thiscall _Concurrent_vector_base_v4__Internal_compact(
+ _Concurrent_vector_base_v4 *this, MSVCP_size_t len, void *v,
+ void (__cdecl *clear)(void *, MSVCP_size_t),
+ void (__cdecl *copy)(void *, void const *, MSVCP_size_t))
+{
+ FIXME("(%p %ld %p %p %p) stub\n", this, len, v, clear, copy);
+ return NULL;
+}
+
+/* ?_Internal_copy(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAEXABV123(a)IP6AXPAXPBXI@Z(a)Z */
+/* ?_Internal_copy(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IEAAXAEBV123(a)_KP6AXPEAXPEBX1@Z(a)Z */
+DEFINE_THISCALL_WRAPPER(_Concurrent_vector_base_v4__Internal_copy, 16)
+void __thiscall _Concurrent_vector_base_v4__Internal_copy(
+ _Concurrent_vector_base_v4 *this, _Concurrent_vector_base_v4 const *v,
+ MSVCP_size_t len, void (__cdecl *copy)(void *, void const *, MSVCP_size_t))
+{
+ FIXME("(%p %p %ld %p) stub\n", this, v, len, copy);
+}
+
+/* ?_Internal_grow_by(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAEIIIP6AXPAXPBXI(a)Z1@Z */
+/* ?_Internal_grow_by(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IEAA_K_K0P6AXPEAXPEBX0(a)Z2@Z */
+DEFINE_THISCALL_WRAPPER(_Concurrent_vector_base_v4__Internal_grow_by, 20)
+MSVCP_size_t __thiscall _Concurrent_vector_base_v4__Internal_grow_by(
+ _Concurrent_vector_base_v4 *this, MSVCP_size_t count, MSVCP_size_t element_size,
+ void (__cdecl *copy)(void *, void const *, MSVCP_size_t), void const *v)
+{
+ FIXME("(%p %ld %ld %p %p) stub\n", this, count, element_size, copy, v);
+ return 0;
+}
+
+/* ?_Internal_grow_to_at_least_with_result(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAEIIIP6AXPAXPBXI(a)Z1@Z */
+/* ?_Internal_grow_to_at_least_with_result(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IEAA_K_K0P6AXPEAXPEBX0(a)Z2@Z */
+DEFINE_THISCALL_WRAPPER(_Concurrent_vector_base_v4__Internal_grow_to_at_least_with_result, 20)
+MSVCP_size_t __thiscall _Concurrent_vector_base_v4__Internal_grow_to_at_least_with_result(
+ _Concurrent_vector_base_v4 *this, MSVCP_size_t count, MSVCP_size_t element_size,
+ void (__cdecl *copy)(void *, void const *, MSVCP_size_t), void const *v)
+{
+ FIXME("(%p %ld %ld %p %p) stub\n", this, count, element_size, copy, v);
+ return 0;
+}
+
+/* ?_Internal_push_back(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAEPAXIAAI(a)Z */
+/* ?_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)
+{
+ FIXME("(%p %ld %p) stub\n", this, len1, len2);
+ return NULL;
+}
+
+/* ?_Internal_reserve(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAEXIII(a)Z */
+/* ?_Internal_reserve(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IEAAX_K00(a)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 len1,
+ MSVCP_size_t len2, MSVCP_size_t len3)
+{
+ FIXME("(%p %ld %ld %ld) stub\n", this, len1, len2, len3);
+}
+
+/* ?_Internal_resize(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAEXIIIP6AXPAXI(a)ZP6AX0PBXI@Z2(a)Z */
+/* ?_Internal_resize(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IEAAX_K00P6AXPEAX0(a)ZP6AX1PEBX0@Z3(a)Z */
+DEFINE_THISCALL_WRAPPER(_Concurrent_vector_base_v4__Internal_resize, 28)
+void __thiscall _Concurrent_vector_base_v4__Internal_resize(
+ _Concurrent_vector_base_v4 *this, MSVCP_size_t len1, MSVCP_size_t len2,
+ MSVCP_size_t len3, void (__cdecl *clear)(void *, MSVCP_size_t),
+ void (__cdecl *copy)(void *, void const *, MSVCP_size_t), void const *v)
+{
+ FIXME("(%p %ld %ld %ld %p %p %p) stub", this, len1, len2, len3, clear, copy, v);
+}
+
+/* ?_Internal_swap(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAEXAAV123@@Z */
+/* ?_Internal_swap(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IEAAXAEAV123@@Z */
+DEFINE_THISCALL_WRAPPER(_Concurrent_vector_base_v4__Internal_swap, 8)
+void __thiscall _Concurrent_vector_base_v4__Internal_swap(
+ _Concurrent_vector_base_v4 *this, _Concurrent_vector_base_v4 const * v)
+{
+ FIXME("(%p %p) stub\n", this, v);
+}
+
#ifndef __GNUC__
void __asm_dummy_vtables(void) {
#endif
diff --git a/tools/make_specfiles b/tools/make_specfiles
index 6fe79f6..daa4c62 100755
--- a/tools/make_specfiles
+++ b/tools/make_specfiles
@@ -49,6 +49,7 @@ my @dll_groups =
[
"msvcr120",
"msvcr120_app",
+ "msvcp120_app",
"concrt140",
],
[
--
2.7.4
1
0
This patch allows Adobe Premiere CS4 for me to start (with only native msdmo due to other bug) without the winetricks atmlib , see bug https://bugs.winehq.org/show_bug.cgi?id=21017
Apparently this dll is present in about all windowsversions (at least at
testbot);
Found atmlib functions are documented here:
web.mit.edu/PS/Adobe/Documents/5073.ATM_Adv_Win.ps
Signed-off-by: Louis Lenders <xerox.xerox2000x(a)gmail.com>
---
configure | 2 ++
configure.ac | 1 +
dlls/atmlib/Makefile.in | 4 +++
dlls/atmlib/atmlib.spec | 76 +++++++++++++++++++++++++++++++++++++++++
dlls/atmlib/main.c | 47 +++++++++++++++++++++++++
5 files changed, 130 insertions(+)
create mode 100644 dlls/atmlib/Makefile.in
create mode 100644 dlls/atmlib/atmlib.spec
create mode 100644 dlls/atmlib/main.c
diff --git a/configure b/configure
index 119391d91b..fea3babb07 100755
--- a/configure
+++ b/configure
@@ -1107,6 +1107,7 @@ enable_atl100
enable_atl110
enable_atl80
enable_atl90
+enable_atmlib
enable_authz
enable_avicap32
enable_avifil32
@@ -18421,6 +18422,7 @@ wine_fn_config_makefile dlls/atl110 enable_atl110
wine_fn_config_makefile dlls/atl80 enable_atl80
wine_fn_config_makefile dlls/atl80/tests enable_tests
wine_fn_config_makefile dlls/atl90 enable_atl90
+wine_fn_config_makefile dlls/atmlib enable_atmlib
wine_fn_config_makefile dlls/authz enable_authz
wine_fn_config_makefile dlls/avicap32 enable_avicap32
wine_fn_config_makefile dlls/avifil32 enable_avifil32
diff --git a/configure.ac b/configure.ac
index 1bc3d13fc3..8c2dcb90b4 100644
--- a/configure.ac
+++ b/configure.ac
@@ -3043,6 +3043,7 @@ WINE_CONFIG_MAKEFILE(dlls/atl110)
WINE_CONFIG_MAKEFILE(dlls/atl80)
WINE_CONFIG_MAKEFILE(dlls/atl80/tests)
WINE_CONFIG_MAKEFILE(dlls/atl90)
+WINE_CONFIG_MAKEFILE(dlls/atmlib)
WINE_CONFIG_MAKEFILE(dlls/authz)
WINE_CONFIG_MAKEFILE(dlls/avicap32)
WINE_CONFIG_MAKEFILE(dlls/avifil32)
diff --git a/dlls/atmlib/Makefile.in b/dlls/atmlib/Makefile.in
new file mode 100644
index 0000000000..904cbbb54a
--- /dev/null
+++ b/dlls/atmlib/Makefile.in
@@ -0,0 +1,4 @@
+MODULE = atmlib.dll
+
+C_SRCS = \
+ main.c
diff --git a/dlls/atmlib/atmlib.spec b/dlls/atmlib/atmlib.spec
new file mode 100644
index 0000000000..387486dd4d
--- /dev/null
+++ b/dlls/atmlib/atmlib.spec
@@ -0,0 +1,76 @@
+@ stub ATMAddFont
+@ stub ATMAddFontA
+@ stub ATMAddFontEx
+@ stub ATMAddFontExA
+@ stub ATMAddFontExW
+@ stub ATMAddFontW
+@ stub ATMBBoxBaseXYShowText
+@ stub ATMBBoxBaseXYShowTextA
+@ stub ATMBBoxBaseXYShowTextW
+@ stub ATMBeginFontChange
+@ stub ATMClient
+@ stub ATMEndFontChange
+@ stub ATMEnumFonts
+@ stub ATMEnumFontsA
+@ stub ATMEnumFontsW
+@ stub ATMEnumMMFonts
+@ stub ATMEnumMMFontsA
+@ stub ATMEnumMMFontsW
+@ stub ATMFinish
+@ stub ATMFontAvailable
+@ stub ATMFontAvailableA
+@ stub ATMFontAvailableW
+@ stub ATMFontSelected
+@ stub ATMFontStatus
+@ stub ATMFontStatusA
+@ stub ATMFontStatusW
+@ stub ATMForceFontChange
+@ stub ATMGetBuildStr
+@ stub ATMGetBuildStrA
+@ stub ATMGetBuildStrW
+@ stub ATMGetFontBBox
+@ stub ATMGetFontInfo
+@ stub ATMGetFontInfoA
+@ stub ATMGetFontInfoW
+@ stub ATMGetFontPaths
+@ stub ATMGetFontPathsA
+@ stub ATMGetFontPathsW
+@ stub ATMGetGlyphList
+@ stub ATMGetGlyphListA
+@ stub ATMGetGlyphListW
+@ stub ATMGetMenuName
+@ stub ATMGetMenuNameA
+@ stub ATMGetMenuNameW
+@ stub ATMGetNtmFields
+@ stub ATMGetNtmFieldsA
+@ stub ATMGetNtmFieldsW
+@ stub ATMGetOutline
+@ stub ATMGetOutlineA
+@ stub ATMGetOutlineW
+@ stub ATMGetPostScriptName
+@ stub ATMGetPostScriptNameA
+@ stub ATMGetPostScriptNameW
+@ stub ATMGetVersion
+@ stub ATMGetVersionEx
+@ stub ATMGetVersionExA
+@ stub ATMGetVersionExW
+@ stub ATMInstallSubstFontA
+@ stub ATMInstallSubstFontW
+@ stub ATMMakePFM
+@ stub ATMMakePFMA
+@ stub ATMMakePFMW
+@ stub ATMMakePSS
+@ stub ATMMakePSSA
+@ stub ATMMakePSSW
+@ stdcall ATMProperlyLoaded()
+@ stub ATMRemoveFont
+@ stub ATMRemoveFontA
+@ stub ATMRemoveFontW
+@ stub ATMRemoveSubstFontA
+@ stub ATMRemoveSubstFontW
+@ stub ATMSelectEncoding
+@ stub ATMSelectObject
+@ stub ATMSetFlags
+@ stub ATMXYShowText
+@ stub ATMXYShowTextA
+@ stub ATMXYShowTextW
diff --git a/dlls/atmlib/main.c b/dlls/atmlib/main.c
new file mode 100644
index 0000000000..0baca0001e
--- /dev/null
+++ b/dlls/atmlib/main.c
@@ -0,0 +1,47 @@
+/*
+ * Copyright 2018 Louis Lenders
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#include "config.h"
+#include <stdarg.h>
+
+#include "windef.h"
+#include "winbase.h"
+#include "wine/debug.h"
+
+WINE_DEFAULT_DEBUG_CHANNEL(atmlib);
+
+BOOL WINAPI DllMain(HINSTANCE hInstDLL, DWORD reason, LPVOID lpv)
+{
+ TRACE("(%p, %d, %p)\n", hInstDLL, reason, lpv);
+
+ switch (reason)
+ {
+ case DLL_WINE_PREATTACH:
+ return FALSE; /* prefer native version */
+ case DLL_PROCESS_ATTACH:
+ DisableThreadLibraryCalls(hInstDLL);
+ break;
+ }
+ return TRUE;
+}
+
+BOOL WINAPI ATMProperlyLoaded(void)
+{
+ FIXME("stub\n");
+ return FALSE;
+}
--
2.17.0
1
0
08 May '18
Hi Hua,
On 05/08/18 13:11, Hua Meng wrote:
> --- a/dlls/msvcp120_app/msvcp120_app.spec
> +++ b/dlls/msvcp120_app/msvcp120_app.spec
> +@ cdecl -arch=win64 ?_Internal_assign(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IEAAXAEBV123(a)_KP6AXPEAX1@ZP6AX2PEBX1(a)Z5@Z(ptr ptr long ptr ptr ptr) msvcp120.
> +@ cdecl -arch=arm ?_Internal_capacity(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IBAIXZ(ptr) msvcp120.?_Internal_assign(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IEAAXAEBV123(a)_KP6AXPEAX1@ZP6AX2PEBX1(a)Z5@Z
The _Internal_assign and _Internal_capacity spec file entries got mixed.
You can use wine_src/tools/make_specfiles script to generate this file.
> +typedef struct
> +{
> + void *storage[3];
> + MSVCP_size_t first_block;
> + MSVCP_size_t early_size;
> + void **segment;
> +} _Concurrent_vector_base_v4;
This structure needs to have the allocator function pointer as first
argument. The structure should look like this:
typedef struct
{
void* (__cdecl *allocator)(_Concurrent_vector_base_v4*, MSVCP_size_t);
void *storage[3];
MSVCP_size_t first_block;
MSVCP_size_t early_size;
void** segment;
} _Concurrent_vector_base_v4;
> +void __thiscall _Concurrent_vector_base_v4__Internal_resize(
> + _Concurrent_vector_base_v4 *this, MSVCP_size_t len1, MSVCP_size_t len2,
> + MSVCP_size_t len3, void (__cdecl *clear)(void *, MSVCP_size_t),
> + void (__cdecl *copy)(void *, void const *, MSVCP_size_t), void const *v)
> +{
> + FIXME("%p %ld %ld %ld %p %p %p", this, len1, len2, len3, clear, copy, v);
> +}
Could you please change the fixme message to be consistent (add
parenthesis and stub)?
Thanks,
Piotr
1
0
[PATCH] schedsvc: Reimplement FILE_ACTION_MODIFIED by remove_job()/add_job() sequence as MSDN suggests.
by Dmitry Timoshkov 08 May '18
by Dmitry Timoshkov 08 May '18
08 May '18
Signed-off-by: Dmitry Timoshkov <dmitry(a)baikal.ru>
---
dlls/schedsvc/atsvc.c | 21 ---------------------
dlls/schedsvc/schedsvc_private.h | 1 -
dlls/schedsvc/svc_main.c | 3 ++-
3 files changed, 2 insertions(+), 23 deletions(-)
diff --git a/dlls/schedsvc/atsvc.c b/dlls/schedsvc/atsvc.c
index 53a18fd682..cb9bc1fe98 100644
--- a/dlls/schedsvc/atsvc.c
+++ b/dlls/schedsvc/atsvc.c
@@ -546,27 +546,6 @@ void remove_job(const WCHAR *name)
LeaveCriticalSection(&at_job_list_section);
}
-void modify_job(const WCHAR *name)
-{
- AT_ENUM info;
-
- if (load_job(name, &info))
- {
- struct job_t *job;
-
- EnterCriticalSection(&at_job_list_section);
- job = find_job(0, name);
- if (job)
- {
- free_job_info(&job->info);
- job->info = info;
- }
- else
- free_job_info(&info);
- LeaveCriticalSection(&at_job_list_section);
- }
-}
-
DWORD __cdecl NetrJobAdd(ATSVC_HANDLE server_name, AT_INFO *info, DWORD *jobid)
{
WCHAR windir[MAX_PATH];
diff --git a/dlls/schedsvc/schedsvc_private.h b/dlls/schedsvc/schedsvc_private.h
index c0aa188fda..215bba003e 100644
--- a/dlls/schedsvc/schedsvc_private.h
+++ b/dlls/schedsvc/schedsvc_private.h
@@ -25,7 +25,6 @@
void schedsvc_auto_start(void) DECLSPEC_HIDDEN;
void add_job(const WCHAR *name) DECLSPEC_HIDDEN;
void remove_job(const WCHAR *name) DECLSPEC_HIDDEN;
-void modify_job(const WCHAR *name) DECLSPEC_HIDDEN;
static inline WCHAR *heap_strdupW(const WCHAR *src)
{
diff --git a/dlls/schedsvc/svc_main.c b/dlls/schedsvc/svc_main.c
index 937d1c2b7e..848e4fc105 100644
--- a/dlls/schedsvc/svc_main.c
+++ b/dlls/schedsvc/svc_main.c
@@ -118,7 +118,8 @@ static DWORD WINAPI tasks_monitor_thread(void *arg)
GetWindowsDirectoryW(path, MAX_PATH);
lstrcatW(path, tasksW);
lstrcatW(path, info.data.FileName);
- modify_job(path);
+ remove_job(info.data.FileName);
+ add_job(info.data.FileName);
break;
default:
--
2.16.3
1
0
Signed-off-by: Hua Meng <161220092(a)smail.nju.edu.cn>
---
dlls/concrt140/concrt140.spec | 48 ++++++-------
dlls/msvcp100/msvcp100.spec | 48 ++++++-------
dlls/msvcp110/msvcp110.spec | 72 +++++++++----------
dlls/msvcp120/msvcp120.spec | 72 +++++++++----------
dlls/msvcp120_app/msvcp120_app.spec | 72 +++++++++----------
dlls/msvcp90/misc.c | 135 ++++++++++++++++++++++++++++++++++++
6 files changed, 291 insertions(+), 156 deletions(-)
diff --git a/dlls/concrt140/concrt140.spec b/dlls/concrt140/concrt140.spec
index f0a2cd1..346fc57 100644
--- a/dlls/concrt140/concrt140.spec
+++ b/dlls/concrt140/concrt140.spec
@@ -164,8 +164,8 @@
@ cdecl -arch=win64 ??1_Concurrent_queue_base_v4(a)details@Concurrency@@MEAA(a)XZ(ptr) msvcp120.??1_Concurrent_queue_base_v4(a)details@Concurrency@@MEAA(a)XZ
@ stub -arch=i386 ??1_Concurrent_queue_iterator_base_v4(a)details@Concurrency@@IAE(a)XZ
@ stub -arch=win64 ??1_Concurrent_queue_iterator_base_v4(a)details@Concurrency@@IEAA(a)XZ
-@ stub -arch=i386 ??1_Concurrent_vector_base_v4(a)details@Concurrency@@IAE(a)XZ
-@ stub -arch=win64 ??1_Concurrent_vector_base_v4(a)details@Concurrency@@IEAA(a)XZ
+@ thiscall -arch=i386 ??1_Concurrent_vector_base_v4(a)details@Concurrency@@IAE(a)XZ(ptr) msvcp120.??1_Concurrent_vector_base_v4(a)details@Concurrency@@IAE(a)XZ
+@ cdecl -arch=win64 ??1_Concurrent_vector_base_v4(a)details@Concurrency@@IEAA(a)XZ(ptr) msvcp120.??1_Concurrent_vector_base_v4(a)details@Concurrency@@IEAA(a)XZ
@ thiscall -arch=i386 ??1_Condition_variable(a)details@Concurrency@@QAE(a)XZ(ptr) msvcr120.??1_Condition_variable(a)details@Concurrency@@QAE(a)XZ
@ cdecl -arch=win64 ??1_Condition_variable(a)details@Concurrency@@QEAA(a)XZ(ptr) msvcr120.??1_Condition_variable(a)details@Concurrency@@QEAA(a)XZ
@ thiscall -arch=i386 ??1_NonReentrantBlockingLock(a)details@Concurrency@@QAE(a)XZ(ptr) msvcr120.??1_NonReentrantBlockingLock(a)details@Concurrency@@QAE(a)XZ
@@ -347,42 +347,42 @@
@ thiscall -arch=i386 ?_GetScheduler(a)_Scheduler@details(a)Concurrency@@QAEPAVScheduler(a)3@XZ(ptr) msvcr120.?_GetScheduler(a)_Scheduler@details(a)Concurrency@@QAEPAVScheduler(a)3@XZ
@ cdecl -arch=win64 ?_GetScheduler(a)_Scheduler@details(a)Concurrency@@QEAAPEAVScheduler(a)3@XZ(ptr) msvcr120.?_GetScheduler(a)_Scheduler@details(a)Concurrency@@QEAAPEAVScheduler(a)3@XZ
@ cdecl ?_Id(a)_CurrentScheduler@details(a)Concurrency@@SAIXZ() msvcr120.?_Id(a)_CurrentScheduler@details(a)Concurrency@@SAIXZ
-@ stub -arch=i386 ?_Internal_assign(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAEXABV123(a)IP6AXPAXI@ZP6AX1PBXI(a)Z4@Z
-@ stub -arch=win64 ?_Internal_assign(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IEAAXAEBV123(a)_KP6AXPEAX1@ZP6AX2PEBX1(a)Z5@Z
-@ stub -arch=i386 ?_Internal_capacity(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IBEIXZ
-@ stub -arch=win64 ?_Internal_capacity(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IEBA_KXZ
-@ stub -arch=i386 ?_Internal_clear(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAEIP6AXPAXI(a)Z@Z
-@ stub -arch=win64 ?_Internal_clear(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IEAA_KP6AXPEAX_K(a)Z@Z
-@ stub -arch=i386 ?_Internal_compact(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAEPAXIPAXP6AX0I(a)ZP6AX0PBXI@Z(a)Z
-@ stub -arch=win64 ?_Internal_compact(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IEAAPEAX_KPEAXP6AX10(a)ZP6AX1PEBX0@Z(a)Z
-@ stub -arch=i386 ?_Internal_copy(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAEXABV123(a)IP6AXPAXPBXI@Z(a)Z
-@ stub -arch=win64 ?_Internal_copy(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IEAAXAEBV123(a)_KP6AXPEAXPEBX1@Z(a)Z
+@ thiscall -arch=i386 ?_Internal_assign(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAEXABV123(a)IP6AXPAXI@ZP6AX1PBXI(a)Z4@Z(ptr ptr long ptr ptr ptr) msvcp120.?_Internal_assign(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAEXABV123(a)IP6AXPAXI@ZP6AX1PBXI(a)Z4@Z
+@ cdecl -arch=win64 ?_Internal_assign(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IEAAXAEBV123(a)_KP6AXPEAX1@ZP6AX2PEBX1(a)Z5@Z(ptr ptr long ptr ptr ptr) msvcp120.?_Internal_assign(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IEAAXAEBV123(a)_KP6AXPEAX1@ZP6AX2PEBX1(a)Z5@Z
+@ thiscall -arch=i386 ?_Internal_capacity(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IBEIXZ(ptr) msvcp120.?_Internal_capacity(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IBEIXZ
+@ cdecl -arch=win64 ?_Internal_capacity(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IEBA_KXZ(ptr) msvcp120.?_Internal_capacity(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IBEIXZ
+@ thiscall -arch=i386 ?_Internal_clear(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAEIP6AXPAXI(a)Z@Z(ptr ptr) msvcp120.?_Internal_clear(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAEIP6AXPAXI(a)Z@Z
+@ cdecl -arch=win64 ?_Internal_clear(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IEAA_KP6AXPEAX_K(a)Z@Z(ptr ptr) msvcp120.?_Internal_clear(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IEAA_KP6AXPEAX_K(a)Z@Z
+@ thiscall -arch=i386 ?_Internal_compact(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAEPAXIPAXP6AX0I(a)ZP6AX0PBXI@Z(a)Z(ptr long ptr ptr ptr) msvcp120.?_Internal_compact(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAEPAXIPAXP6AX0I(a)ZP6AX0PBXI@Z(a)Z
+@ cdecl -arch=win64 ?_Internal_compact(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IEAAPEAX_KPEAXP6AX10(a)ZP6AX1PEBX0@Z(a)Z(ptr long ptr ptr ptr) msvcp120.?_Internal_compact(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IEAAPEAX_KPEAXP6AX10(a)ZP6AX1PEBX0@Z(a)Z
+@ thiscall -arch=i386 ?_Internal_copy(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAEXABV123(a)IP6AXPAXPBXI@Z(a)Z(ptr ptr long ptr) msvcp120.?_Internal_copy(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAEXABV123(a)IP6AXPAXPBXI@Z(a)Z
+@ cdecl -arch=win64 ?_Internal_copy(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IEAAXAEBV123(a)_KP6AXPEAXPEBX1@Z(a)Z(ptr ptr long ptr) msvcp120.?_Internal_copy(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IEAAXAEBV123(a)_KP6AXPEAXPEBX1@Z(a)Z
@ thiscall -arch=i386 ?_Internal_empty(a)_Concurrent_queue_base_v4@details(a)Concurrency@@IBE_NXZ(ptr) msvcp120.?_Internal_empty(a)_Concurrent_queue_base_v4@details(a)Concurrency@@IBE_NXZ
@ cdecl -arch=win64 ?_Internal_empty(a)_Concurrent_queue_base_v4@details(a)Concurrency@@IEBA_NXZ(ptr) msvcp120.?_Internal_empty(a)_Concurrent_queue_base_v4@details(a)Concurrency@@IEBA_NXZ
@ thiscall -arch=i386 ?_Internal_finish_clear(a)_Concurrent_queue_base_v4@details(a)Concurrency@@IAEXXZ(ptr) msvcp120.?_Internal_finish_clear(a)_Concurrent_queue_base_v4@details(a)Concurrency@@IAEXXZ
@ cdecl -arch=win64 ?_Internal_finish_clear(a)_Concurrent_queue_base_v4@details(a)Concurrency@@IEAAXXZ(ptr) msvcp120.?_Internal_finish_clear(a)_Concurrent_queue_base_v4@details(a)Concurrency@@IEAAXXZ
-@ stub -arch=i386 ?_Internal_grow_by(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAEIIIP6AXPAXPBXI(a)Z1@Z
-@ stub -arch=win64 ?_Internal_grow_by(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IEAA_K_K0P6AXPEAXPEBX0(a)Z2@Z
-@ stub -arch=i386 ?_Internal_grow_to_at_least_with_result(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAEIIIP6AXPAXPBXI(a)Z1@Z
-@ stub -arch=win64 ?_Internal_grow_to_at_least_with_result(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IEAA_K_K0P6AXPEAXPEBX0(a)Z2@Z
+@ thiscall -arch=i386 ?_Internal_grow_by(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAEIIIP6AXPAXPBXI(a)Z1@Z(ptr long long ptr ptr) msvcp120.?_Internal_grow_by(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAEIIIP6AXPAXPBXI(a)Z1@Z
+@ cdecl -arch=win64 ?_Internal_grow_by(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IEAA_K_K0P6AXPEAXPEBX0(a)Z2@Z(ptr long long ptr ptr) msvcp120.?_Internal_grow_by(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IEAA_K_K0P6AXPEAXPEBX0(a)Z2@Z
+@ thiscall -arch=i386 ?_Internal_grow_to_at_least_with_result(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAEIIIP6AXPAXPBXI(a)Z1@Z(ptr long long ptr ptr) msvcp120.?_Internal_grow_to_at_least_with_result(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAEIIIP6AXPAXPBXI(a)Z1@Z
+@ cdecl -arch=win64 ?_Internal_grow_to_at_least_with_result(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IEAA_K_K0P6AXPEAXPEBX0(a)Z2@Z(ptr long long ptr ptr) msvcp120.?_Internal_grow_to_at_least_with_result(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IEAA_K_K0P6AXPEAXPEBX0(a)Z2@Z
@ thiscall -arch=i386 ?_Internal_move_push(a)_Concurrent_queue_base_v4@details(a)Concurrency@@IAEXPAX(a)Z(ptr ptr) msvcp120.?_Internal_move_push(a)_Concurrent_queue_base_v4@details(a)Concurrency@@IAEXPAX(a)Z
@ cdecl -arch=win64 ?_Internal_move_push(a)_Concurrent_queue_base_v4@details(a)Concurrency@@IEAAXPEAX(a)Z(ptr ptr) msvcp120.?_Internal_move_push(a)_Concurrent_queue_base_v4@details(a)Concurrency@@IEAAXPEAX(a)Z
@ thiscall -arch=i386 ?_Internal_pop_if_present(a)_Concurrent_queue_base_v4@details(a)Concurrency@@IAE_NPAX(a)Z(ptr ptr) msvcp120.?_Internal_pop_if_present(a)_Concurrent_queue_base_v4@details(a)Concurrency@@IAE_NPAX(a)Z
@ cdecl -arch=win64 ?_Internal_pop_if_present(a)_Concurrent_queue_base_v4@details(a)Concurrency@@IEAA_NPEAX(a)Z(ptr ptr) msvcp120.?_Internal_pop_if_present(a)_Concurrent_queue_base_v4@details(a)Concurrency@@IEAA_NPEAX(a)Z
@ thiscall -arch=i386 ?_Internal_push(a)_Concurrent_queue_base_v4@details(a)Concurrency@@IAEXPBX(a)Z(ptr ptr) msvcp120.?_Internal_push(a)_Concurrent_queue_base_v4@details(a)Concurrency@@IAEXPBX(a)Z
@ cdecl -arch=win64 ?_Internal_push(a)_Concurrent_queue_base_v4@details(a)Concurrency@@IEAAXPEBX(a)Z(ptr ptr) msvcp120.?_Internal_push(a)_Concurrent_queue_base_v4@details(a)Concurrency@@IEAAXPEBX(a)Z
-@ stub -arch=i386 ?_Internal_push_back(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAEPAXIAAI(a)Z
-@ stub -arch=win64 ?_Internal_push_back(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IEAAPEAX_KAEA_K(a)Z
-@ stub -arch=i386 ?_Internal_reserve(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAEXIII(a)Z
-@ stub -arch=win64 ?_Internal_reserve(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IEAAX_K00(a)Z
-@ stub -arch=i386 ?_Internal_resize(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAEXIIIP6AXPAXI(a)ZP6AX0PBXI@Z2(a)Z
-@ stub -arch=win64 ?_Internal_resize(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IEAAX_K00P6AXPEAX0(a)ZP6AX1PEBX0@Z3(a)Z
+@ thiscall -arch=i386 ?_Internal_push_back(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAEPAXIAAI(a)Z(ptr long long) msvcp120.?_Internal_push_back(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAEPAXIAAI(a)Z
+@ cdecl -arch=win64 ?_Internal_push_back(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IEAAPEAX_KAEA_K(a)Z(ptr long long) msvcp120.?_Internal_push_back(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IEAAPEAX_KAEA_K(a)Z
+@ thiscall -arch=i386 ?_Internal_reserve(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAEXIII(a)Z(ptr long long long) msvcp120.?_Internal_reserve(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAEXIII(a)Z
+@ cdecl -arch=win64 ?_Internal_reserve(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IEAAX_K00(a)Z(ptr long long long) msvcp120.?_Internal_reserve(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IEAAX_K00(a)Z
+@ thiscall -arch=i386 ?_Internal_resize(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAEXIIIP6AXPAXI(a)ZP6AX0PBXI@Z2(a)Z(ptr long long long ptr ptr ptr) msvcp120.?_Internal_resize(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAEXIIIP6AXPAXI(a)ZP6AX0PBXI@Z2(a)Z
+@ cdecl -arch=win64 ?_Internal_resize(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IEAAX_K00P6AXPEAX0(a)ZP6AX1PEBX0@Z3(a)Z(ptr long long long ptr ptr ptr) msvcp120.?_Internal_resize(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IEAAX_K00P6AXPEAX0(a)ZP6AX1PEBX0@Z3(a)Z
@ thiscall -arch=i386 ?_Internal_size(a)_Concurrent_queue_base_v4@details(a)Concurrency@@IBEIXZ(ptr) msvcp120.?_Internal_size(a)_Concurrent_queue_base_v4@details(a)Concurrency@@IBEIXZ
@ cdecl -arch=win64 ?_Internal_size(a)_Concurrent_queue_base_v4@details(a)Concurrency@@IEBA_KXZ(ptr) msvcp120.?_Internal_size(a)_Concurrent_queue_base_v4@details(a)Concurrency@@IEBA_KXZ
@ thiscall -arch=i386 ?_Internal_swap(a)_Concurrent_queue_base_v4@details(a)Concurrency@@IAEXAAV123@@Z(ptr ptr) msvcp120.?_Internal_swap(a)_Concurrent_queue_base_v4@details(a)Concurrency@@IAEXAAV123@@Z
@ cdecl -arch=win64 ?_Internal_swap(a)_Concurrent_queue_base_v4@details(a)Concurrency@@IEAAXAEAV123@@Z(ptr ptr) msvcp120.?_Internal_swap(a)_Concurrent_queue_base_v4@details(a)Concurrency@@IEAAXAEAV123@@Z
-@ stub -arch=i386 ?_Internal_swap(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAEXAAV123@@Z
-@ stub -arch=win64 ?_Internal_swap(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IEAAXAEAV123@@Z
+@ thiscall -arch=i386 ?_Internal_swap(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAEXAAV123@@Z(ptr ptr) msvcp120.?_Internal_swap(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAEXAAV123@@Z
+@ cdecl -arch=win64 ?_Internal_swap(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IEAAXAEAV123@@Z(ptr ptr) msvcp120.?_Internal_swap(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IEAAXAEAV123@@Z
@ thiscall -arch=i386 ?_Internal_throw_exception(a)_Concurrent_queue_base_v4@details(a)Concurrency@@IBEXXZ(ptr) msvcp120.?_Internal_throw_exception(a)_Concurrent_queue_base_v4@details(a)Concurrency@@IBEXXZ
@ cdecl -arch=win64 ?_Internal_throw_exception(a)_Concurrent_queue_base_v4@details(a)Concurrency@@IEBAXXZ(ptr) msvcp120.?_Internal_throw_exception(a)_Concurrent_queue_base_v4@details(a)Concurrency@@IEBAXXZ
@ thiscall -arch=i386 ?_Internal_throw_exception(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IBEXI(a)Z(ptr long) msvcp120.?_Internal_throw_exception(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IBEXI(a)Z
diff --git a/dlls/msvcp100/msvcp100.spec b/dlls/msvcp100/msvcp100.spec
index 0d6e6dc..9da72a4 100644
--- a/dlls/msvcp100/msvcp100.spec
+++ b/dlls/msvcp100/msvcp100.spec
@@ -312,8 +312,8 @@
@ cdecl -arch=win64 ??1_Concurrent_queue_base_v4(a)details@Concurrency@@MEAA(a)XZ(ptr) _Concurrent_queue_base_v4_dtor
@ stub -arch=win32 ??1_Concurrent_queue_iterator_base_v4(a)details@Concurrency@@IAE(a)XZ
@ stub -arch=win64 ??1_Concurrent_queue_iterator_base_v4(a)details@Concurrency@@IEAA(a)XZ
-@ stub -arch=win32 ??1_Concurrent_vector_base_v4(a)details@Concurrency@@IAE(a)XZ
-@ stub -arch=win64 ??1_Concurrent_vector_base_v4(a)details@Concurrency@@IEAA(a)XZ
+@ thiscall -arch=win32 ??1_Concurrent_vector_base_v4(a)details@Concurrency@@IAE(a)XZ(ptr) _Concurrent_vector_base_v4_dtor
+@ cdecl -arch=win64 ??1_Concurrent_vector_base_v4(a)details@Concurrency@@IEAA(a)XZ(ptr) _Concurrent_vector_base_v4_dtor
@ cdecl -arch=arm ??1_Container_base12(a)std@@QAA(a)XZ(ptr) _Container_base12_dtor
@ thiscall -arch=i386 ??1_Container_base12(a)std@@QAE(a)XZ(ptr) _Container_base12_dtor
@ cdecl -arch=win64 ??1_Container_base12(a)std@@QEAA(a)XZ(ptr) _Container_base12_dtor
@@ -1029,38 +1029,38 @@
@ stub -arch=win64 ?_Init_locks_ctor(a)_Init_locks@std@@CAXPEAV12@@Z
@ stub -arch=win32 ?_Init_locks_dtor(a)_Init_locks@std@@CAXPAV12@@Z
@ stub -arch=win64 ?_Init_locks_dtor(a)_Init_locks@std@@CAXPEAV12@@Z
-@ stub -arch=win32 ?_Internal_assign(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAEXABV123(a)IP6AXPAXI@ZP6AX1PBXI(a)Z4@Z
-@ stub -arch=win64 ?_Internal_assign(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IEAAXAEBV123(a)_KP6AXPEAX1@ZP6AX2PEBX1(a)Z5@Z
-@ stub -arch=win32 ?_Internal_capacity(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IBEIXZ
-@ stub -arch=win64 ?_Internal_capacity(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IEBA_KXZ
-@ stub -arch=win32 ?_Internal_clear(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAEIP6AXPAXI(a)Z@Z
-@ stub -arch=win64 ?_Internal_clear(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IEAA_KP6AXPEAX_K(a)Z@Z
-@ stub -arch=win32 ?_Internal_compact(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAEPAXIPAXP6AX0I(a)ZP6AX0PBXI@Z(a)Z
-@ stub -arch=win64 ?_Internal_compact(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IEAAPEAX_KPEAXP6AX10(a)ZP6AX1PEBX0@Z(a)Z
-@ stub -arch=win32 ?_Internal_copy(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAEXABV123(a)IP6AXPAXPBXI@Z(a)Z
-@ stub -arch=win64 ?_Internal_copy(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IEAAXAEBV123(a)_KP6AXPEAXPEBX1@Z(a)Z
+@ cdecl -arch=win32 ?_Internal_assign(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAEXABV123(a)IP6AXPAXI@ZP6AX1PBXI(a)Z4@Z(ptr ptr long ptr ptr ptr) _Concurrent_vector_base_v4__Internal_assign
+@ thiscall -arch=win64 ?_Internal_assign(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IEAAXAEBV123(a)_KP6AXPEAX1@ZP6AX2PEBX1(a)Z5@Z(ptr ptr long ptr ptr ptr) _Concurrent_vector_base_v4__Internal_assign
+@ thiscall -arch=win32 ?_Internal_capacity(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IBEIXZ(ptr) _Concurrent_vector_base_v4__Internal_capacity
+@ cdecl -arch=win64 ?_Internal_capacity(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IEBA_KXZ(ptr) _Concurrent_vector_base_v4__Internal_capacity
+@ thiscall -arch=win32 ?_Internal_clear(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAEIP6AXPAXI(a)Z@Z(ptr ptr) _Concurrent_vector_base_v4__Internal_clear
+@ cdecl -arch=win64 ?_Internal_clear(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IEAA_KP6AXPEAX_K(a)Z@Z(ptr ptr) _Concurrent_vector_base_v4__Internal_clear
+@ thiscall -arch=win32 ?_Internal_compact(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAEPAXIPAXP6AX0I(a)ZP6AX0PBXI@Z(a)Z(ptr long ptr ptr ptr) _Concurrent_vector_base_v4__Internal_compact
+@ cdecl -arch=win64 ?_Internal_compact(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IEAAPEAX_KPEAXP6AX10(a)ZP6AX1PEBX0@Z(a)Z(ptr long ptr ptr ptr) _Concurrent_vector_base_v4__Internal_compact
+@ thiscall -arch=win32 ?_Internal_copy(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAEXABV123(a)IP6AXPAXPBXI@Z(a)Z(ptr ptr long ptr) _Concurrent_vector_base_v4__Internal_copy
+@ cdecl -arch=win64 ?_Internal_copy(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IEAAXAEBV123(a)_KP6AXPEAXPEBX1@Z(a)Z(ptr ptr long ptr) _Concurrent_vector_base_v4__Internal_copy
@ thiscall -arch=win32 ?_Internal_empty(a)_Concurrent_queue_base_v4@details(a)Concurrency@@IBE_NXZ(ptr) _Concurrent_queue_base_v4__Internal_empty
@ cdecl -arch=win64 ?_Internal_empty(a)_Concurrent_queue_base_v4@details(a)Concurrency@@IEBA_NXZ(ptr) _Concurrent_queue_base_v4__Internal_empty
@ thiscall -arch=win32 ?_Internal_finish_clear(a)_Concurrent_queue_base_v4@details(a)Concurrency@@IAEXXZ(ptr) _Concurrent_queue_base_v4__Internal_finish_clear
@ cdecl -arch=win64 ?_Internal_finish_clear(a)_Concurrent_queue_base_v4@details(a)Concurrency@@IEAAXXZ(ptr) _Concurrent_queue_base_v4__Internal_finish_clear
-@ stub -arch=win32 ?_Internal_grow_by(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAEIIIP6AXPAXPBXI(a)Z1@Z
-@ stub -arch=win64 ?_Internal_grow_by(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IEAA_K_K0P6AXPEAXPEBX0(a)Z2@Z
-@ stub -arch=win32 ?_Internal_grow_to_at_least_with_result(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAEIIIP6AXPAXPBXI(a)Z1@Z
-@ stub -arch=win64 ?_Internal_grow_to_at_least_with_result(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IEAA_K_K0P6AXPEAXPEBX0(a)Z2@Z
+@ thiscall -arch=win32 ?_Internal_grow_by(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAEIIIP6AXPAXPBXI(a)Z1@Z(ptr long long ptr ptr) _Concurrent_vector_base_v4__Internal_grow_by
+@ cdecl -arch=win64 ?_Internal_grow_by(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IEAA_K_K0P6AXPEAXPEBX0(a)Z2@Z(ptr long long ptr ptr) _Concurrent_vector_base_v4__Internal_grow_by
+@ thiscall -arch=win32 ?_Internal_grow_to_at_least_with_result(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAEIIIP6AXPAXPBXI(a)Z1@Z(ptr long long ptr ptr) _Concurrent_vector_base_v4__Internal_grow_to_at_least_with_result
+@ cdecl -arch=win64 ?_Internal_grow_to_at_least_with_result(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IEAA_K_K0P6AXPEAXPEBX0(a)Z2@Z(ptr long long ptr ptr) _Concurrent_vector_base_v4__Internal_grow_to_at_least_with_result
@ thiscall -arch=win32 ?_Internal_pop_if_present(a)_Concurrent_queue_base_v4@details(a)Concurrency@@IAE_NPAX(a)Z(ptr ptr) _Concurrent_queue_base_v4__Internal_pop_if_present
@ cdecl -arch=win64 ?_Internal_pop_if_present(a)_Concurrent_queue_base_v4@details(a)Concurrency@@IEAA_NPEAX(a)Z(ptr ptr) _Concurrent_queue_base_v4__Internal_pop_if_present
@ thiscall -arch=win32 ?_Internal_push(a)_Concurrent_queue_base_v4@details(a)Concurrency@@IAEXPBX(a)Z(ptr ptr) _Concurrent_queue_base_v4__Internal_push
@ cdecl -arch=win64 ?_Internal_push(a)_Concurrent_queue_base_v4@details(a)Concurrency@@IEAAXPEBX(a)Z(ptr ptr) _Concurrent_queue_base_v4__Internal_push
-@ stub -arch=win32 ?_Internal_push_back(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAEPAXIAAI(a)Z
-@ stub -arch=win64 ?_Internal_push_back(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IEAAPEAX_KAEA_K(a)Z
-@ stub -arch=win32 ?_Internal_reserve(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAEXIII(a)Z
-@ stub -arch=win64 ?_Internal_reserve(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IEAAX_K00(a)Z
-@ stub -arch=win32 ?_Internal_resize(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAEXIIIP6AXPAXI(a)ZP6AX0PBXI@Z2(a)Z
-@ stub -arch=win64 ?_Internal_resize(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IEAAX_K00P6AXPEAX0(a)ZP6AX1PEBX0@Z3(a)Z
+@ thiscall -arch=win32 ?_Internal_push_back(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAEPAXIAAI(a)Z(ptr long long) _Concurrent_vector_base_v4__Internal_push_back
+@ cdecl -arch=win64 ?_Internal_push_back(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IEAAPEAX_KAEA_K(a)Z(ptr long long) _Concurrent_vector_base_v4__Internal_push_back
+@ thiscall -arch=win32 ?_Internal_reserve(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAEXIII(a)Z(ptr long long long) _Concurrent_vector_base_v4__Internal_reserve
+@ cdecl -arch=win64 ?_Internal_reserve(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IEAAX_K00(a)Z(ptr long long long) _Concurrent_vector_base_v4__Internal_reserve
+@ thiscall -arch=win32 ?_Internal_resize(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAEXIIIP6AXPAXI(a)ZP6AX0PBXI@Z2(a)Z(ptr long long long ptr ptr ptr) _Concurrent_vector_base_v4__Internal_resize
+@ cdecl -arch=win64 ?_Internal_resize(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IEAAX_K00P6AXPEAX0(a)ZP6AX1PEBX0@Z3(a)Z(ptr long long long ptr ptr ptr) _Concurrent_vector_base_v4__Internal_resize
@ thiscall -arch=win32 ?_Internal_size(a)_Concurrent_queue_base_v4@details(a)Concurrency@@IBEIXZ(ptr) _Concurrent_queue_base_v4__Internal_size
@ cdecl -arch=win64 ?_Internal_size(a)_Concurrent_queue_base_v4@details(a)Concurrency@@IEBA_KXZ(ptr) _Concurrent_queue_base_v4__Internal_size
-@ stub -arch=win32 ?_Internal_swap(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAEXAAV123@@Z
-@ stub -arch=win64 ?_Internal_swap(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IEAAXAEAV123@@Z
+@ thiscall -arch=win32 ?_Internal_swap(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAEXAAV123@@Z(ptr ptr) _Concurrent_vector_base_v4__Internal_swap
+@ cdecl -arch=win64 ?_Internal_swap(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IEAAXAEAV123@@Z(ptr ptr) _Concurrent_vector_base_v4__Internal_swap
@ thiscall -arch=win32 ?_Internal_throw_exception(a)_Concurrent_queue_base_v4@details(a)Concurrency@@IBEXXZ(ptr) _Concurrent_queue_base_v4__Internal_throw_exception
@ cdecl -arch=win64 ?_Internal_throw_exception(a)_Concurrent_queue_base_v4@details(a)Concurrency@@IEBAXXZ(ptr) _Concurrent_queue_base_v4__Internal_throw_exception
@ thiscall -arch=win32 ?_Internal_throw_exception(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IBEXI(a)Z(ptr long) _vector_base_v4__Internal_throw_exception
diff --git a/dlls/msvcp110/msvcp110.spec b/dlls/msvcp110/msvcp110.spec
index 08c3a09..c7c8831 100644
--- a/dlls/msvcp110/msvcp110.spec
+++ b/dlls/msvcp110/msvcp110.spec
@@ -475,9 +475,9 @@
@ stub -arch=arm ??1_Concurrent_queue_iterator_base_v4(a)details@Concurrency@@IAA(a)XZ
@ stub -arch=i386 ??1_Concurrent_queue_iterator_base_v4(a)details@Concurrency@@IAE(a)XZ
@ stub -arch=win64 ??1_Concurrent_queue_iterator_base_v4(a)details@Concurrency@@IEAA(a)XZ
-@ stub -arch=arm ??1_Concurrent_vector_base_v4(a)details@Concurrency@@IAA(a)XZ
-@ stub -arch=i386 ??1_Concurrent_vector_base_v4(a)details@Concurrency@@IAE(a)XZ
-@ stub -arch=win64 ??1_Concurrent_vector_base_v4(a)details@Concurrency@@IEAA(a)XZ
+@ cdecl -arch=arm ??1_Concurrent_vector_base_v4(a)details@Concurrency@@IAA(a)XZ(ptr) _Concurrent_vector_base_v4_dtor
+@ thiscall -arch=i386 ??1_Concurrent_vector_base_v4(a)details@Concurrency@@IAE(a)XZ(ptr) _Concurrent_vector_base_v4_dtor
+@ cdecl -arch=win64 ??1_Concurrent_vector_base_v4(a)details@Concurrency@@IEAA(a)XZ(ptr) _Concurrent_vector_base_v4_dtor
@ cdecl -arch=arm ??1_Container_base12(a)std@@QAA(a)XZ(ptr) _Container_base12_dtor
@ thiscall -arch=i386 ??1_Container_base12(a)std@@QAE(a)XZ(ptr) _Container_base12_dtor
@ cdecl -arch=win64 ??1_Container_base12(a)std@@QEAA(a)XZ(ptr) _Container_base12_dtor
@@ -1482,33 +1482,33 @@
@ stub -arch=win64 ?_Init_locks_ctor(a)_Init_locks@std@@CAXPEAV12@@Z
@ stub -arch=win32 ?_Init_locks_dtor(a)_Init_locks@std@@CAXPAV12@@Z
@ stub -arch=win64 ?_Init_locks_dtor(a)_Init_locks@std@@CAXPEAV12@@Z
-@ stub -arch=arm ?_Internal_assign(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAAXABV123(a)IP6AXPAXI@ZP6AX1PBXI(a)Z4@Z
-@ stub -arch=i386 ?_Internal_assign(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAEXABV123(a)IP6AXPAXI@ZP6AX1PBXI(a)Z4@Z
-@ stub -arch=win64 ?_Internal_assign(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IEAAXAEBV123(a)_KP6AXPEAX1@ZP6AX2PEBX1(a)Z5@Z
-@ stub -arch=arm ?_Internal_capacity(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IBAIXZ
-@ stub -arch=i386 ?_Internal_capacity(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IBEIXZ
-@ stub -arch=win64 ?_Internal_capacity(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IEBA_KXZ
-@ stub -arch=arm ?_Internal_clear(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAAIP6AXPAXI(a)Z@Z
-@ stub -arch=i386 ?_Internal_clear(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAEIP6AXPAXI(a)Z@Z
-@ stub -arch=win64 ?_Internal_clear(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IEAA_KP6AXPEAX_K(a)Z@Z
-@ stub -arch=arm ?_Internal_compact(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAAPAXIPAXP6AX0I(a)ZP6AX0PBXI@Z(a)Z
-@ stub -arch=i386 ?_Internal_compact(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAEPAXIPAXP6AX0I(a)ZP6AX0PBXI@Z(a)Z
-@ stub -arch=win64 ?_Internal_compact(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IEAAPEAX_KPEAXP6AX10(a)ZP6AX1PEBX0@Z(a)Z
-@ stub -arch=arm ?_Internal_copy(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAAXABV123(a)IP6AXPAXPBXI@Z(a)Z
-@ stub -arch=i386 ?_Internal_copy(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAEXABV123(a)IP6AXPAXPBXI@Z(a)Z
-@ stub -arch=win64 ?_Internal_copy(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IEAAXAEBV123(a)_KP6AXPEAXPEBX1@Z(a)Z
+@ cdecl -arch=arm ?_Internal_assign(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAAXABV123(a)IP6AXPAXI@ZP6AX1PBXI(a)Z4@Z(ptr ptr long ptr ptr ptr) _Concurrent_vector_base_v4__Internal_assign
+@ thiscall -arch=i386 ?_Internal_assign(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAEXABV123(a)IP6AXPAXI@ZP6AX1PBXI(a)Z4@Z(ptr ptr long ptr ptr ptr) _Concurrent_vector_base_v4__Internal_assign
+@ cdecl -arch=win64 ?_Internal_assign(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IEAAXAEBV123(a)_KP6AXPEAX1@ZP6AX2PEBX1(a)Z5@Z(ptr ptr long ptr ptr ptr) _Concurrent_vector_base_v4__Internal_assign
+@ cdecl -arch=arm ?_Internal_capacity(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IBAIXZ(ptr) _Concurrent_vector_base_v4__Internal_capacity
+@ thiscall -arch=i386 ?_Internal_capacity(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IBEIXZ(ptr) _Concurrent_vector_base_v4__Internal_capacity
+@ cdecl -arch=win64 ?_Internal_capacity(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IEBA_KXZ(ptr) _Concurrent_vector_base_v4__Internal_capacity
+@ cdecl -arch=arm ?_Internal_clear(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAAIP6AXPAXI(a)Z@Z(ptr ptr) _Concurrent_vector_base_v4__Internal_clear
+@ thiscall -arch=i386 ?_Internal_clear(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAEIP6AXPAXI(a)Z@Z(ptr ptr) _Concurrent_vector_base_v4__Internal_clear
+@ cdecl -arch=win64 ?_Internal_clear(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IEAA_KP6AXPEAX_K(a)Z@Z(ptr ptr) _Concurrent_vector_base_v4__Internal_clear
+@ cdecl -arch=arm ?_Internal_compact(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAAPAXIPAXP6AX0I(a)ZP6AX0PBXI@Z(a)Z(ptr long ptr ptr ptr) _Concurrent_vector_base_v4__Internal_compact
+@ thiscall -arch=i386 ?_Internal_compact(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAEPAXIPAXP6AX0I(a)ZP6AX0PBXI@Z(a)Z(ptr long ptr ptr ptr) _Concurrent_vector_base_v4__Internal_compact
+@ cdecl -arch=win64 ?_Internal_compact(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IEAAPEAX_KPEAXP6AX10(a)ZP6AX1PEBX0@Z(a)Z(ptr long ptr ptr ptr) _Concurrent_vector_base_v4__Internal_compact
+@ cdecl -arch=arm ?_Internal_copy(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAAXABV123(a)IP6AXPAXPBXI@Z(a)Z(ptr ptr long ptr) _Concurrent_vector_base_v4__Internal_copy
+@ thiscall -arch=i386 ?_Internal_copy(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAEXABV123(a)IP6AXPAXPBXI@Z(a)Z(ptr ptr long ptr) _Concurrent_vector_base_v4__Internal_copy
+@ cdecl -arch=win64 ?_Internal_copy(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IEAAXAEBV123(a)_KP6AXPEAXPEBX1@Z(a)Z(ptr ptr long ptr) _Concurrent_vector_base_v4__Internal_copy
@ cdecl -arch=arm ?_Internal_empty(a)_Concurrent_queue_base_v4@details(a)Concurrency@@IBA_NXZ(ptr) _Concurrent_queue_base_v4__Internal_empty
@ thiscall -arch=i386 ?_Internal_empty(a)_Concurrent_queue_base_v4@details(a)Concurrency@@IBE_NXZ(ptr) _Concurrent_queue_base_v4__Internal_empty
@ cdecl -arch=win64 ?_Internal_empty(a)_Concurrent_queue_base_v4@details(a)Concurrency@@IEBA_NXZ(ptr) _Concurrent_queue_base_v4__Internal_empty
@ cdecl -arch=arm ?_Internal_finish_clear(a)_Concurrent_queue_base_v4@details(a)Concurrency@@IAAXXZ(ptr) _Concurrent_queue_base_v4__Internal_finish_clear
@ thiscall -arch=i386 ?_Internal_finish_clear(a)_Concurrent_queue_base_v4@details(a)Concurrency@@IAEXXZ(ptr) _Concurrent_queue_base_v4__Internal_finish_clear
@ cdecl -arch=win64 ?_Internal_finish_clear(a)_Concurrent_queue_base_v4@details(a)Concurrency@@IEAAXXZ(ptr) _Concurrent_queue_base_v4__Internal_finish_clear
-@ stub -arch=arm ?_Internal_grow_by(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAAIIIP6AXPAXPBXI(a)Z1@Z
-@ stub -arch=i386 ?_Internal_grow_by(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAEIIIP6AXPAXPBXI(a)Z1@Z
-@ stub -arch=win64 ?_Internal_grow_by(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IEAA_K_K0P6AXPEAXPEBX0(a)Z2@Z
-@ stub -arch=arm ?_Internal_grow_to_at_least_with_result(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAAIIIP6AXPAXPBXI(a)Z1@Z
-@ stub -arch=i386 ?_Internal_grow_to_at_least_with_result(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAEIIIP6AXPAXPBXI(a)Z1@Z
-@ stub -arch=win64 ?_Internal_grow_to_at_least_with_result(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IEAA_K_K0P6AXPEAXPEBX0(a)Z2@Z
+@ cdecl -arch=arm ?_Internal_grow_by(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAAIIIP6AXPAXPBXI(a)Z1@Z(ptr long long ptr ptr) _Concurrent_vector_base_v4__Internal_grow_by
+@ thiscall -arch=i386 ?_Internal_grow_by(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAEIIIP6AXPAXPBXI(a)Z1@Z(ptr long long ptr ptr) _Concurrent_vector_base_v4__Internal_grow_by
+@ cdecl -arch=win64 ?_Internal_grow_by(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IEAA_K_K0P6AXPEAXPEBX0(a)Z2@Z(ptr long long ptr ptr) _Concurrent_vector_base_v4__Internal_grow_by
+@ cdecl -arch=arm ?_Internal_grow_to_at_least_with_result(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAAIIIP6AXPAXPBXI(a)Z1@Z(ptr long long ptr ptr) _Concurrent_vector_base_v4__Internal_grow_to_at_least_with_result
+@ thiscall -arch=i386 ?_Internal_grow_to_at_least_with_result(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAEIIIP6AXPAXPBXI(a)Z1@Z(ptr long long ptr ptr) _Concurrent_vector_base_v4__Internal_grow_to_at_least_with_result
+@ cdecl -arch=win64 ?_Internal_grow_to_at_least_with_result(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IEAA_K_K0P6AXPEAXPEBX0(a)Z2@Z(ptr long long ptr ptr) _Concurrent_vector_base_v4__Internal_grow_to_at_least_with_result
@ cdecl -arch=arm ?_Internal_move_push(a)_Concurrent_queue_base_v4@details(a)Concurrency@@IAAXPAX(a)Z(ptr ptr) _Concurrent_queue_base_v4__Internal_move_push
@ thiscall -arch=i386 ?_Internal_move_push(a)_Concurrent_queue_base_v4@details(a)Concurrency@@IAEXPAX(a)Z(ptr ptr) _Concurrent_queue_base_v4__Internal_move_push
@ cdecl -arch=win64 ?_Internal_move_push(a)_Concurrent_queue_base_v4@details(a)Concurrency@@IEAAXPEAX(a)Z(ptr ptr) _Concurrent_queue_base_v4__Internal_move_push
@@ -1518,24 +1518,24 @@
@ cdecl -arch=arm ?_Internal_push(a)_Concurrent_queue_base_v4@details(a)Concurrency@@IAAXPBX(a)Z(ptr ptr) _Concurrent_queue_base_v4__Internal_push
@ thiscall -arch=i386 ?_Internal_push(a)_Concurrent_queue_base_v4@details(a)Concurrency@@IAEXPBX(a)Z(ptr ptr) _Concurrent_queue_base_v4__Internal_push
@ cdecl -arch=win64 ?_Internal_push(a)_Concurrent_queue_base_v4@details(a)Concurrency@@IEAAXPEBX(a)Z(ptr ptr) _Concurrent_queue_base_v4__Internal_push
-@ stub -arch=arm ?_Internal_push_back(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAAPAXIAAI(a)Z
-@ stub -arch=i386 ?_Internal_push_back(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAEPAXIAAI(a)Z
-@ stub -arch=win64 ?_Internal_push_back(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IEAAPEAX_KAEA_K(a)Z
-@ stub -arch=arm ?_Internal_reserve(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAAXIII(a)Z
-@ stub -arch=i386 ?_Internal_reserve(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAEXIII(a)Z
-@ stub -arch=win64 ?_Internal_reserve(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IEAAX_K00(a)Z
-@ stub -arch=arm ?_Internal_resize(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAAXIIIP6AXPAXI(a)ZP6AX0PBXI@Z2(a)Z
-@ stub -arch=i386 ?_Internal_resize(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAEXIIIP6AXPAXI(a)ZP6AX0PBXI@Z2(a)Z
-@ stub -arch=win64 ?_Internal_resize(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IEAAX_K00P6AXPEAX0(a)ZP6AX1PEBX0@Z3(a)Z
+@ cdecl -arch=arm ?_Internal_push_back(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAAPAXIAAI(a)Z(ptr long long) _Concurrent_vector_base_v4__Internal_push_back
+@ thiscall -arch=i386 ?_Internal_push_back(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAEPAXIAAI(a)Z(ptr long long) _Concurrent_vector_base_v4__Internal_push_back
+@ cdecl -arch=win64 ?_Internal_push_back(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IEAAPEAX_KAEA_K(a)Z(ptr long long) _Concurrent_vector_base_v4__Internal_push_back
+@ cdecl -arch=arm ?_Internal_reserve(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAAXIII(a)Z(ptr long long long) _Concurrent_vector_base_v4__Internal_reserve
+@ thiscall -arch=i386 ?_Internal_reserve(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAEXIII(a)Z(ptr long long long) _Concurrent_vector_base_v4__Internal_reserve
+@ cdecl -arch=win64 ?_Internal_reserve(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IEAAX_K00(a)Z(ptr long long long) _Concurrent_vector_base_v4__Internal_reserve
+@ cdecl -arch=arm ?_Internal_resize(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAAXIIIP6AXPAXI(a)ZP6AX0PBXI@Z2(a)Z(ptr long long long ptr ptr ptr) _Concurrent_vector_base_v4__Internal_resize
+@ thiscall -arch=i386 ?_Internal_resize(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAEXIIIP6AXPAXI(a)ZP6AX0PBXI@Z2(a)Z(ptr long long long ptr ptr ptr) _Concurrent_vector_base_v4__Internal_resize
+@ cdecl -arch=win64 ?_Internal_resize(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IEAAX_K00P6AXPEAX0(a)ZP6AX1PEBX0@Z3(a)Z(ptr long long long ptr ptr ptr) _Concurrent_vector_base_v4__Internal_resize
@ cdecl -arch=arm ?_Internal_size(a)_Concurrent_queue_base_v4@details(a)Concurrency@@IBAIXZ(ptr) _Concurrent_queue_base_v4__Internal_size
@ thiscall -arch=i386 ?_Internal_size(a)_Concurrent_queue_base_v4@details(a)Concurrency@@IBEIXZ(ptr) _Concurrent_queue_base_v4__Internal_size
@ cdecl -arch=win64 ?_Internal_size(a)_Concurrent_queue_base_v4@details(a)Concurrency@@IEBA_KXZ(ptr) _Concurrent_queue_base_v4__Internal_size
@ cdecl -arch=arm ?_Internal_swap(a)_Concurrent_queue_base_v4@details(a)Concurrency@@IAAXAAV123@@Z(ptr ptr) _Concurrent_queue_base_v4__Internal_swap
@ thiscall -arch=i386 ?_Internal_swap(a)_Concurrent_queue_base_v4@details(a)Concurrency@@IAEXAAV123@@Z(ptr ptr) _Concurrent_queue_base_v4__Internal_swap
@ cdecl -arch=win64 ?_Internal_swap(a)_Concurrent_queue_base_v4@details(a)Concurrency@@IEAAXAEAV123@@Z(ptr ptr) _Concurrent_queue_base_v4__Internal_swap
-@ stub -arch=arm ?_Internal_swap(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAAXAAV123@@Z
-@ stub -arch=i386 ?_Internal_swap(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAEXAAV123@@Z
-@ stub -arch=win64 ?_Internal_swap(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IEAAXAEAV123@@Z
+@ cdecl -arch=arm ?_Internal_swap(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAAXAAV123@@Z(ptr ptr) _Concurrent_vector_base_v4__Internal_swap
+@ thiscall -arch=i386 ?_Internal_swap(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAEXAAV123@@Z(ptr ptr) _Concurrent_vector_base_v4__Internal_swap
+@ cdecl -arch=win64 ?_Internal_swap(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IEAAXAEAV123@@Z(ptr ptr) _Concurrent_vector_base_v4__Internal_swap
@ cdecl -arch=arm ?_Internal_throw_exception(a)_Concurrent_queue_base_v4@details(a)Concurrency@@IBAXXZ(ptr) _Concurrent_queue_base_v4__Internal_throw_exception
@ thiscall -arch=i386 ?_Internal_throw_exception(a)_Concurrent_queue_base_v4@details(a)Concurrency@@IBEXXZ(ptr) _Concurrent_queue_base_v4__Internal_throw_exception
@ cdecl -arch=win64 ?_Internal_throw_exception(a)_Concurrent_queue_base_v4@details(a)Concurrency@@IEBAXXZ(ptr) _Concurrent_queue_base_v4__Internal_throw_exception
diff --git a/dlls/msvcp120/msvcp120.spec b/dlls/msvcp120/msvcp120.spec
index aebfa71..104c32b 100644
--- a/dlls/msvcp120/msvcp120.spec
+++ b/dlls/msvcp120/msvcp120.spec
@@ -475,9 +475,9 @@
@ stub -arch=arm ??1_Concurrent_queue_iterator_base_v4(a)details@Concurrency@@IAA(a)XZ
@ stub -arch=i386 ??1_Concurrent_queue_iterator_base_v4(a)details@Concurrency@@IAE(a)XZ
@ stub -arch=win64 ??1_Concurrent_queue_iterator_base_v4(a)details@Concurrency@@IEAA(a)XZ
-@ stub -arch=arm ??1_Concurrent_vector_base_v4(a)details@Concurrency@@IAA(a)XZ
-@ stub -arch=i386 ??1_Concurrent_vector_base_v4(a)details@Concurrency@@IAE(a)XZ
-@ stub -arch=win64 ??1_Concurrent_vector_base_v4(a)details@Concurrency@@IEAA(a)XZ
+@ cdecl -arch=arm ??1_Concurrent_vector_base_v4(a)details@Concurrency@@IAA(a)XZ(ptr) _Concurrent_vector_base_v4_dtor
+@ thiscall -arch=i386 ??1_Concurrent_vector_base_v4(a)details@Concurrency@@IAE(a)XZ(ptr) _Concurrent_vector_base_v4_dtor
+@ cdecl -arch=win64 ??1_Concurrent_vector_base_v4(a)details@Concurrency@@IEAA(a)XZ(ptr) _Concurrent_vector_base_v4_dtor
@ cdecl -arch=arm ??1_Container_base12(a)std@@QAA(a)XZ(ptr) _Container_base12_dtor
@ thiscall -arch=i386 ??1_Container_base12(a)std@@QAE(a)XZ(ptr) _Container_base12_dtor
@ cdecl -arch=win64 ??1_Container_base12(a)std@@QEAA(a)XZ(ptr) _Container_base12_dtor
@@ -1443,33 +1443,33 @@
@ stub -arch=win64 ?_Init_locks_ctor(a)_Init_locks@std@@CAXPEAV12@@Z
@ stub -arch=win32 ?_Init_locks_dtor(a)_Init_locks@std@@CAXPAV12@@Z
@ stub -arch=win64 ?_Init_locks_dtor(a)_Init_locks@std@@CAXPEAV12@@Z
-@ stub -arch=arm ?_Internal_assign(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAAXABV123(a)IP6AXPAXI@ZP6AX1PBXI(a)Z4@Z
-@ stub -arch=i386 ?_Internal_assign(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAEXABV123(a)IP6AXPAXI@ZP6AX1PBXI(a)Z4@Z
-@ stub -arch=win64 ?_Internal_assign(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IEAAXAEBV123(a)_KP6AXPEAX1@ZP6AX2PEBX1(a)Z5@Z
-@ stub -arch=arm ?_Internal_capacity(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IBAIXZ
-@ stub -arch=i386 ?_Internal_capacity(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IBEIXZ
-@ stub -arch=win64 ?_Internal_capacity(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IEBA_KXZ
-@ stub -arch=arm ?_Internal_clear(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAAIP6AXPAXI(a)Z@Z
-@ stub -arch=i386 ?_Internal_clear(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAEIP6AXPAXI(a)Z@Z
-@ stub -arch=win64 ?_Internal_clear(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IEAA_KP6AXPEAX_K(a)Z@Z
-@ stub -arch=arm ?_Internal_compact(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAAPAXIPAXP6AX0I(a)ZP6AX0PBXI@Z(a)Z
-@ stub -arch=i386 ?_Internal_compact(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAEPAXIPAXP6AX0I(a)ZP6AX0PBXI@Z(a)Z
-@ stub -arch=win64 ?_Internal_compact(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IEAAPEAX_KPEAXP6AX10(a)ZP6AX1PEBX0@Z(a)Z
-@ stub -arch=arm ?_Internal_copy(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAAXABV123(a)IP6AXPAXPBXI@Z(a)Z
-@ stub -arch=i386 ?_Internal_copy(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAEXABV123(a)IP6AXPAXPBXI@Z(a)Z
-@ stub -arch=win64 ?_Internal_copy(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IEAAXAEBV123(a)_KP6AXPEAXPEBX1@Z(a)Z
+@ cdecl -arch=arm ?_Internal_assign(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAAXABV123(a)IP6AXPAXI@ZP6AX1PBXI(a)Z4@Z(ptr ptr long ptr ptr ptr) _Concurrent_vector_base_v4__Internal_assign
+@ thiscall -arch=i386 ?_Internal_assign(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAEXABV123(a)IP6AXPAXI@ZP6AX1PBXI(a)Z4@Z(ptr ptr long ptr ptr ptr) _Concurrent_vector_base_v4__Internal_assign
+@ cdecl -arch=win64 ?_Internal_assign(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IEAAXAEBV123(a)_KP6AXPEAX1@ZP6AX2PEBX1(a)Z5@Z(ptr ptr long ptr ptr ptr) _Concurrent_vector_base_v4__Internal_assign
+@ cdecl -arch=arm ?_Internal_capacity(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IBAIXZ(ptr) _Concurrent_vector_base_v4__Internal_capacity
+@ thiscall -arch=i386 ?_Internal_capacity(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IBEIXZ(ptr) _Concurrent_vector_base_v4__Internal_capacity
+@ cdecl -arch=win64 ?_Internal_capacity(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IEBA_KXZ(ptr) _Concurrent_vector_base_v4__Internal_capacity
+@ cdecl -arch=arm ?_Internal_clear(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAAIP6AXPAXI(a)Z@Z(ptr ptr) _Concurrent_vector_base_v4__Internal_clear
+@ thiscall -arch=i386 ?_Internal_clear(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAEIP6AXPAXI(a)Z@Z(ptr ptr) _Concurrent_vector_base_v4__Internal_clear
+@ cdecl -arch=win64 ?_Internal_clear(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IEAA_KP6AXPEAX_K(a)Z@Z(ptr ptr) _Concurrent_vector_base_v4__Internal_clear
+@ cdecl -arch=arm ?_Internal_compact(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAAPAXIPAXP6AX0I(a)ZP6AX0PBXI@Z(a)Z(ptr long ptr ptr ptr) _Concurrent_vector_base_v4__Internal_compact
+@ thiscall -arch=i386 ?_Internal_compact(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAEPAXIPAXP6AX0I(a)ZP6AX0PBXI@Z(a)Z(ptr long ptr ptr ptr) _Concurrent_vector_base_v4__Internal_compact
+@ cdecl -arch=win64 ?_Internal_compact(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IEAAPEAX_KPEAXP6AX10(a)ZP6AX1PEBX0@Z(a)Z(ptr long ptr ptr ptr) _Concurrent_vector_base_v4__Internal_compact
+@ cdecl -arch=arm ?_Internal_copy(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAAXABV123(a)IP6AXPAXPBXI@Z(a)Z(ptr ptr long ptr) _Concurrent_vector_base_v4__Internal_copy
+@ thiscall -arch=i386 ?_Internal_copy(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAEXABV123(a)IP6AXPAXPBXI@Z(a)Z(ptr ptr long ptr) _Concurrent_vector_base_v4__Internal_copy
+@ cdecl -arch=win64 ?_Internal_copy(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IEAAXAEBV123(a)_KP6AXPEAXPEBX1@Z(a)Z(ptr ptr long ptr) _Concurrent_vector_base_v4__Internal_copy
@ cdecl -arch=arm ?_Internal_empty(a)_Concurrent_queue_base_v4@details(a)Concurrency@@IBA_NXZ(ptr) _Concurrent_queue_base_v4__Internal_empty
@ thiscall -arch=i386 ?_Internal_empty(a)_Concurrent_queue_base_v4@details(a)Concurrency@@IBE_NXZ(ptr) _Concurrent_queue_base_v4__Internal_empty
@ cdecl -arch=win64 ?_Internal_empty(a)_Concurrent_queue_base_v4@details(a)Concurrency@@IEBA_NXZ(ptr) _Concurrent_queue_base_v4__Internal_empty
@ cdecl -arch=arm ?_Internal_finish_clear(a)_Concurrent_queue_base_v4@details(a)Concurrency@@IAAXXZ(ptr) _Concurrent_queue_base_v4__Internal_finish_clear
@ thiscall -arch=i386 ?_Internal_finish_clear(a)_Concurrent_queue_base_v4@details(a)Concurrency@@IAEXXZ(ptr) _Concurrent_queue_base_v4__Internal_finish_clear
@ cdecl -arch=win64 ?_Internal_finish_clear(a)_Concurrent_queue_base_v4@details(a)Concurrency@@IEAAXXZ(ptr) _Concurrent_queue_base_v4__Internal_finish_clear
-@ stub -arch=arm ?_Internal_grow_by(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAAIIIP6AXPAXPBXI(a)Z1@Z
-@ stub -arch=i386 ?_Internal_grow_by(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAEIIIP6AXPAXPBXI(a)Z1@Z
-@ stub -arch=win64 ?_Internal_grow_by(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IEAA_K_K0P6AXPEAXPEBX0(a)Z2@Z
-@ stub -arch=arm ?_Internal_grow_to_at_least_with_result(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAAIIIP6AXPAXPBXI(a)Z1@Z
-@ stub -arch=i386 ?_Internal_grow_to_at_least_with_result(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAEIIIP6AXPAXPBXI(a)Z1@Z
-@ stub -arch=win64 ?_Internal_grow_to_at_least_with_result(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IEAA_K_K0P6AXPEAXPEBX0(a)Z2@Z
+@ cdecl -arch=arm ?_Internal_grow_by(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAAIIIP6AXPAXPBXI(a)Z1@Z(ptr long long ptr ptr) _Concurrent_vector_base_v4__Internal_grow_by
+@ thiscall -arch=i386 ?_Internal_grow_by(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAEIIIP6AXPAXPBXI(a)Z1@Z(ptr long long ptr ptr) _Concurrent_vector_base_v4__Internal_grow_by
+@ cdecl -arch=win64 ?_Internal_grow_by(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IEAA_K_K0P6AXPEAXPEBX0(a)Z2@Z(ptr long long ptr ptr) _Concurrent_vector_base_v4__Internal_grow_by
+@ cdecl -arch=arm ?_Internal_grow_to_at_least_with_result(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAAIIIP6AXPAXPBXI(a)Z1@Z(ptr long long ptr ptr) _Concurrent_vector_base_v4__Internal_grow_to_at_least_with_result
+@ thiscall -arch=i386 ?_Internal_grow_to_at_least_with_result(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAEIIIP6AXPAXPBXI(a)Z1@Z(ptr long long ptr ptr) _Concurrent_vector_base_v4__Internal_grow_to_at_least_with_result
+@ cdecl -arch=win64 ?_Internal_grow_to_at_least_with_result(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IEAA_K_K0P6AXPEAXPEBX0(a)Z2@Z(ptr long long ptr ptr) _Concurrent_vector_base_v4__Internal_grow_to_at_least_with_result
@ cdecl -arch=arm ?_Internal_move_push(a)_Concurrent_queue_base_v4@details(a)Concurrency@@IAAXPAX(a)Z(ptr ptr) _Concurrent_queue_base_v4__Internal_move_push
@ thiscall -arch=i386 ?_Internal_move_push(a)_Concurrent_queue_base_v4@details(a)Concurrency@@IAEXPAX(a)Z(ptr ptr) _Concurrent_queue_base_v4__Internal_move_push
@ cdecl -arch=win64 ?_Internal_move_push(a)_Concurrent_queue_base_v4@details(a)Concurrency@@IEAAXPEAX(a)Z(ptr ptr) _Concurrent_queue_base_v4__Internal_move_push
@@ -1479,24 +1479,24 @@
@ cdecl -arch=arm ?_Internal_push(a)_Concurrent_queue_base_v4@details(a)Concurrency@@IAAXPBX(a)Z(ptr ptr) _Concurrent_queue_base_v4__Internal_push
@ thiscall -arch=i386 ?_Internal_push(a)_Concurrent_queue_base_v4@details(a)Concurrency@@IAEXPBX(a)Z(ptr ptr) _Concurrent_queue_base_v4__Internal_push
@ cdecl -arch=win64 ?_Internal_push(a)_Concurrent_queue_base_v4@details(a)Concurrency@@IEAAXPEBX(a)Z(ptr ptr) _Concurrent_queue_base_v4__Internal_push
-@ stub -arch=arm ?_Internal_push_back(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAAPAXIAAI(a)Z
-@ stub -arch=i386 ?_Internal_push_back(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAEPAXIAAI(a)Z
-@ stub -arch=win64 ?_Internal_push_back(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IEAAPEAX_KAEA_K(a)Z
-@ stub -arch=arm ?_Internal_reserve(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAAXIII(a)Z
-@ stub -arch=i386 ?_Internal_reserve(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAEXIII(a)Z
-@ stub -arch=win64 ?_Internal_reserve(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IEAAX_K00(a)Z
-@ stub -arch=arm ?_Internal_resize(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAAXIIIP6AXPAXI(a)ZP6AX0PBXI@Z2(a)Z
-@ stub -arch=i386 ?_Internal_resize(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAEXIIIP6AXPAXI(a)ZP6AX0PBXI@Z2(a)Z
-@ stub -arch=win64 ?_Internal_resize(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IEAAX_K00P6AXPEAX0(a)ZP6AX1PEBX0@Z3(a)Z
+@ cdecl -arch=arm ?_Internal_push_back(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAAPAXIAAI(a)Z(ptr long long) _Concurrent_vector_base_v4__Internal_push_back
+@ thiscall -arch=i386 ?_Internal_push_back(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAEPAXIAAI(a)Z(ptr long long) _Concurrent_vector_base_v4__Internal_push_back
+@ cdecl -arch=win64 ?_Internal_push_back(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IEAAPEAX_KAEA_K(a)Z(ptr long long) _Concurrent_vector_base_v4__Internal_push_back
+@ cdecl -arch=arm ?_Internal_reserve(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAAXIII(a)Z(ptr long long long) _Concurrent_vector_base_v4__Internal_reserve
+@ thiscall -arch=i386 ?_Internal_reserve(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAEXIII(a)Z(ptr long long long) _Concurrent_vector_base_v4__Internal_reserve
+@ cdecl -arch=win64 ?_Internal_reserve(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IEAAX_K00(a)Z(ptr long long long) _Concurrent_vector_base_v4__Internal_reserve
+@ cdecl -arch=arm ?_Internal_resize(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAAXIIIP6AXPAXI(a)ZP6AX0PBXI@Z2(a)Z(ptr long long long ptr ptr ptr) _Concurrent_vector_base_v4__Internal_resize
+@ thiscall -arch=i386 ?_Internal_resize(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAEXIIIP6AXPAXI(a)ZP6AX0PBXI@Z2(a)Z(ptr long long long ptr ptr ptr) _Concurrent_vector_base_v4__Internal_resize
+@ cdecl -arch=win64 ?_Internal_resize(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IEAAX_K00P6AXPEAX0(a)ZP6AX1PEBX0@Z3(a)Z(ptr long long long ptr ptr ptr) _Concurrent_vector_base_v4__Internal_resize
@ cdecl -arch=arm ?_Internal_size(a)_Concurrent_queue_base_v4@details(a)Concurrency@@IBAIXZ(ptr) _Concurrent_queue_base_v4__Internal_size
@ thiscall -arch=i386 ?_Internal_size(a)_Concurrent_queue_base_v4@details(a)Concurrency@@IBEIXZ(ptr) _Concurrent_queue_base_v4__Internal_size
@ cdecl -arch=win64 ?_Internal_size(a)_Concurrent_queue_base_v4@details(a)Concurrency@@IEBA_KXZ(ptr) _Concurrent_queue_base_v4__Internal_size
@ cdecl -arch=arm ?_Internal_swap(a)_Concurrent_queue_base_v4@details(a)Concurrency@@IAAXAAV123@@Z(ptr ptr) _Concurrent_queue_base_v4__Internal_swap
@ thiscall -arch=i386 ?_Internal_swap(a)_Concurrent_queue_base_v4@details(a)Concurrency@@IAEXAAV123@@Z(ptr ptr) _Concurrent_queue_base_v4__Internal_swap
@ cdecl -arch=win64 ?_Internal_swap(a)_Concurrent_queue_base_v4@details(a)Concurrency@@IEAAXAEAV123@@Z(ptr ptr) _Concurrent_queue_base_v4__Internal_swap
-@ stub -arch=arm ?_Internal_swap(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAAXAAV123@@Z
-@ stub -arch=i386 ?_Internal_swap(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAEXAAV123@@Z
-@ stub -arch=win64 ?_Internal_swap(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IEAAXAEAV123@@Z
+@ cdecl -arch=arm ?_Internal_swap(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAAXAAV123@@Z(ptr ptr) _Concurrent_vector_base_v4__Internal_swap
+@ thiscall -arch=i386 ?_Internal_swap(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAEXAAV123@@Z(ptr ptr) _Concurrent_vector_base_v4__Internal_swap
+@ cdecl -arch=win64 ?_Internal_swap(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IEAAXAEAV123@@Z(ptr ptr) _Concurrent_vector_base_v4__Internal_swap
@ cdecl -arch=arm ?_Internal_throw_exception(a)_Concurrent_queue_base_v4@details(a)Concurrency@@IBAXXZ(ptr) _Concurrent_queue_base_v4__Internal_throw_exception
@ thiscall -arch=i386 ?_Internal_throw_exception(a)_Concurrent_queue_base_v4@details(a)Concurrency@@IBEXXZ(ptr) _Concurrent_queue_base_v4__Internal_throw_exception
@ cdecl -arch=win64 ?_Internal_throw_exception(a)_Concurrent_queue_base_v4@details(a)Concurrency@@IEBAXXZ(ptr) _Concurrent_queue_base_v4__Internal_throw_exception
diff --git a/dlls/msvcp120_app/msvcp120_app.spec b/dlls/msvcp120_app/msvcp120_app.spec
index 17fa12c..87bd704 100644
--- a/dlls/msvcp120_app/msvcp120_app.spec
+++ b/dlls/msvcp120_app/msvcp120_app.spec
@@ -475,9 +475,9 @@
@ stub -arch=arm ??1_Concurrent_queue_iterator_base_v4(a)details@Concurrency@@IAA(a)XZ
@ stub -arch=i386 ??1_Concurrent_queue_iterator_base_v4(a)details@Concurrency@@IAE(a)XZ
@ stub -arch=win64 ??1_Concurrent_queue_iterator_base_v4(a)details@Concurrency@@IEAA(a)XZ
-@ stub -arch=arm ??1_Concurrent_vector_base_v4(a)details@Concurrency@@IAA(a)XZ
-@ stub -arch=i386 ??1_Concurrent_vector_base_v4(a)details@Concurrency@@IAE(a)XZ
-@ stub -arch=win64 ??1_Concurrent_vector_base_v4(a)details@Concurrency@@IEAA(a)XZ
+@ cdecl -arch=arm ??1_Concurrent_vector_base_v4(a)details@Concurrency@@IAA(a)XZ(ptr) msvcp120.??1_Concurrent_vector_base_v4(a)details@Concurrency@@IAA(a)XZ
+@ thiscall -arch=i386 ??1_Concurrent_vector_base_v4(a)details@Concurrency@@IAE(a)XZ(ptr) msvcp120.??1_Concurrent_vector_base_v4(a)details@Concurrency@@IAE(a)XZ
+@ cdecl -arch=win64 ??1_Concurrent_vector_base_v4(a)details@Concurrency@@IEAA(a)XZ(ptr) msvcp120.??1_Concurrent_vector_base_v4(a)details@Concurrency@@IEAA(a)XZ
@ cdecl -arch=arm ??1_Container_base12(a)std@@QAA(a)XZ(ptr) msvcp120.??1_Container_base12(a)std@@QAA(a)XZ
@ thiscall -arch=i386 ??1_Container_base12(a)std@@QAE(a)XZ(ptr) msvcp120.??1_Container_base12(a)std@@QAE(a)XZ
@ cdecl -arch=win64 ??1_Container_base12(a)std@@QEAA(a)XZ(ptr) msvcp120.??1_Container_base12(a)std@@QEAA(a)XZ
@@ -1443,33 +1443,33 @@
@ stub -arch=win64 ?_Init_locks_ctor(a)_Init_locks@std@@CAXPEAV12@@Z
@ stub -arch=win32 ?_Init_locks_dtor(a)_Init_locks@std@@CAXPAV12@@Z
@ stub -arch=win64 ?_Init_locks_dtor(a)_Init_locks@std@@CAXPEAV12@@Z
-@ stub -arch=arm ?_Internal_assign(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAAXABV123(a)IP6AXPAXI@ZP6AX1PBXI(a)Z4@Z
-@ stub -arch=i386 ?_Internal_assign(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAEXABV123(a)IP6AXPAXI@ZP6AX1PBXI(a)Z4@Z
-@ stub -arch=win64 ?_Internal_assign(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IEAAXAEBV123(a)_KP6AXPEAX1@ZP6AX2PEBX1(a)Z5@Z
-@ stub -arch=arm ?_Internal_capacity(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IBAIXZ
-@ stub -arch=i386 ?_Internal_capacity(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IBEIXZ
-@ stub -arch=win64 ?_Internal_capacity(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IEBA_KXZ
-@ stub -arch=arm ?_Internal_clear(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAAIP6AXPAXI(a)Z@Z
-@ stub -arch=i386 ?_Internal_clear(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAEIP6AXPAXI(a)Z@Z
-@ stub -arch=win64 ?_Internal_clear(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IEAA_KP6AXPEAX_K(a)Z@Z
-@ stub -arch=arm ?_Internal_compact(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAAPAXIPAXP6AX0I(a)ZP6AX0PBXI@Z(a)Z
-@ stub -arch=i386 ?_Internal_compact(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAEPAXIPAXP6AX0I(a)ZP6AX0PBXI@Z(a)Z
-@ stub -arch=win64 ?_Internal_compact(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IEAAPEAX_KPEAXP6AX10(a)ZP6AX1PEBX0@Z(a)Z
-@ stub -arch=arm ?_Internal_copy(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAAXABV123(a)IP6AXPAXPBXI@Z(a)Z
-@ stub -arch=i386 ?_Internal_copy(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAEXABV123(a)IP6AXPAXPBXI@Z(a)Z
-@ stub -arch=win64 ?_Internal_copy(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IEAAXAEBV123(a)_KP6AXPEAXPEBX1@Z(a)Z
+@ cdecl -arch=arm ?_Internal_assign(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAAXABV123(a)IP6AXPAXI@ZP6AX1PBXI(a)Z4@Z(ptr ptr long ptr ptr ptr) msvcp120.?_Internal_assign(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAAXABV123(a)IP6AXPAXI@ZP6AX1PBXI(a)Z4@Z
+@ thiscall -arch=i386 ?_Internal_assign(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAEXABV123(a)IP6AXPAXI@ZP6AX1PBXI(a)Z4@Z(ptr ptr long ptr ptr ptr) msvcp120.?_Internal_assign(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAEXABV123(a)IP6AXPAXI@ZP6AX1PBXI(a)Z4@Z
+@ cdecl -arch=win64 ?_Internal_assign(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IEAAXAEBV123(a)_KP6AXPEAX1@ZP6AX2PEBX1(a)Z5@Z(ptr ptr long ptr ptr ptr) msvcp120.
+@ cdecl -arch=arm ?_Internal_capacity(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IBAIXZ(ptr) msvcp120.?_Internal_assign(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IEAAXAEBV123(a)_KP6AXPEAX1@ZP6AX2PEBX1(a)Z5@Z
+@ thiscall -arch=i386 ?_Internal_capacity(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IBEIXZ(ptr) msvcp120.?_Internal_capacity(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IBEIXZ
+@ cdecl -arch=win64 ?_Internal_capacity(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IEBA_KXZ(ptr) msvcp120.?_Internal_capacity(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IEBA_KXZ
+@ cdecl -arch=arm ?_Internal_clear(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAAIP6AXPAXI(a)Z@Z(ptr ptr) msvcp120.?_Internal_clear(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAAIP6AXPAXI(a)Z@Z
+@ thiscall -arch=i386 ?_Internal_clear(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAEIP6AXPAXI(a)Z@Z(ptr ptr) msvcp120.?_Internal_clear(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAEIP6AXPAXI(a)Z@Z
+@ cdecl -arch=win64 ?_Internal_clear(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IEAA_KP6AXPEAX_K(a)Z@Z(ptr ptr) msvcp120.?_Internal_clear(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IEAA_KP6AXPEAX_K(a)Z@Z
+@ cdecl -arch=arm ?_Internal_compact(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAAPAXIPAXP6AX0I(a)ZP6AX0PBXI@Z(a)Z(ptr long ptr ptr ptr) msvcp120.?_Internal_compact(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAAPAXIPAXP6AX0I(a)ZP6AX0PBXI@Z(a)Z
+@ thiscall -arch=i386 ?_Internal_compact(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAEPAXIPAXP6AX0I(a)ZP6AX0PBXI@Z(a)Z(ptr long ptr ptr ptr) msvcp120.?_Internal_compact(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAEPAXIPAXP6AX0I(a)ZP6AX0PBXI@Z(a)Z
+@ cdecl -arch=win64 ?_Internal_compact(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IEAAPEAX_KPEAXP6AX10(a)ZP6AX1PEBX0@Z(a)Z(ptr long ptr ptr ptr) msvcp120.?_Internal_compact(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IEAAPEAX_KPEAXP6AX10(a)ZP6AX1PEBX0@Z(a)Z
+@ cdecl -arch=arm ?_Internal_copy(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAAXABV123(a)IP6AXPAXPBXI@Z(a)Z(ptr ptr long ptr) msvcp120.?_Internal_copy(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAAXABV123(a)IP6AXPAXPBXI@Z(a)Z
+@ thiscall -arch=i386 ?_Internal_copy(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAEXABV123(a)IP6AXPAXPBXI@Z(a)Z(ptr ptr long ptr) msvcp120.?_Internal_copy(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAEXABV123(a)IP6AXPAXPBXI@Z(a)Z
+@ cdecl -arch=win64 ?_Internal_copy(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IEAAXAEBV123(a)_KP6AXPEAXPEBX1@Z(a)Z(ptr ptr long ptr) msvcp120.?_Internal_copy(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IEAAXAEBV123(a)_KP6AXPEAXPEBX1@Z(a)Z
@ cdecl -arch=arm ?_Internal_empty(a)_Concurrent_queue_base_v4@details(a)Concurrency@@IBA_NXZ(ptr) msvcp120.?_Internal_empty(a)_Concurrent_queue_base_v4@details(a)Concurrency@@IBA_NXZ
@ thiscall -arch=i386 ?_Internal_empty(a)_Concurrent_queue_base_v4@details(a)Concurrency@@IBE_NXZ(ptr) msvcp120.?_Internal_empty(a)_Concurrent_queue_base_v4@details(a)Concurrency@@IBE_NXZ
@ cdecl -arch=win64 ?_Internal_empty(a)_Concurrent_queue_base_v4@details(a)Concurrency@@IEBA_NXZ(ptr) msvcp120.?_Internal_empty(a)_Concurrent_queue_base_v4@details(a)Concurrency@@IEBA_NXZ
@ cdecl -arch=arm ?_Internal_finish_clear(a)_Concurrent_queue_base_v4@details(a)Concurrency@@IAAXXZ(ptr) msvcp120.?_Internal_finish_clear(a)_Concurrent_queue_base_v4@details(a)Concurrency@@IAAXXZ
@ thiscall -arch=i386 ?_Internal_finish_clear(a)_Concurrent_queue_base_v4@details(a)Concurrency@@IAEXXZ(ptr) msvcp120.?_Internal_finish_clear(a)_Concurrent_queue_base_v4@details(a)Concurrency@@IAEXXZ
@ cdecl -arch=win64 ?_Internal_finish_clear(a)_Concurrent_queue_base_v4@details(a)Concurrency@@IEAAXXZ(ptr) msvcp120.?_Internal_finish_clear(a)_Concurrent_queue_base_v4@details(a)Concurrency@@IEAAXXZ
-@ stub -arch=arm ?_Internal_grow_by(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAAIIIP6AXPAXPBXI(a)Z1@Z
-@ stub -arch=i386 ?_Internal_grow_by(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAEIIIP6AXPAXPBXI(a)Z1@Z
-@ stub -arch=win64 ?_Internal_grow_by(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IEAA_K_K0P6AXPEAXPEBX0(a)Z2@Z
-@ stub -arch=arm ?_Internal_grow_to_at_least_with_result(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAAIIIP6AXPAXPBXI(a)Z1@Z
-@ stub -arch=i386 ?_Internal_grow_to_at_least_with_result(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAEIIIP6AXPAXPBXI(a)Z1@Z
-@ stub -arch=win64 ?_Internal_grow_to_at_least_with_result(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IEAA_K_K0P6AXPEAXPEBX0(a)Z2@Z
+@ cdecl -arch=arm ?_Internal_grow_by(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAAIIIP6AXPAXPBXI(a)Z1@Z(ptr long long ptr ptr) msvcp120.?_Internal_grow_by(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAAIIIP6AXPAXPBXI(a)Z1@Z
+@ thiscall -arch=i386 ?_Internal_grow_by(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAEIIIP6AXPAXPBXI(a)Z1@Z(ptr long long ptr ptr) msvcp120.?_Internal_grow_by(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAEIIIP6AXPAXPBXI(a)Z1@Z
+@ cdecl -arch=win64 ?_Internal_grow_by(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IEAA_K_K0P6AXPEAXPEBX0(a)Z2@Z(ptr long long ptr ptr) msvcp120.?_Internal_grow_by(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IEAA_K_K0P6AXPEAXPEBX0(a)Z2@Z
+@ cdecl -arch=arm ?_Internal_grow_to_at_least_with_result(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAAIIIP6AXPAXPBXI(a)Z1@Z(ptr long long ptr ptr) msvcp120.?_Internal_grow_to_at_least_with_result(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAAIIIP6AXPAXPBXI(a)Z1@Z
+@ thiscall -arch=i386 ?_Internal_grow_to_at_least_with_result(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAEIIIP6AXPAXPBXI(a)Z1@Z(ptr long long ptr ptr) msvcp120.?_Internal_grow_to_at_least_with_result(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAEIIIP6AXPAXPBXI(a)Z1@Z
+@ cdecl -arch=win64 ?_Internal_grow_to_at_least_with_result(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IEAA_K_K0P6AXPEAXPEBX0(a)Z2@Z(ptr long long ptr ptr) msvcp120.?_Internal_grow_to_at_least_with_result(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IEAA_K_K0P6AXPEAXPEBX0(a)Z2@Z
@ cdecl -arch=arm ?_Internal_move_push(a)_Concurrent_queue_base_v4@details(a)Concurrency@@IAAXPAX(a)Z(ptr ptr) msvcp120.?_Internal_move_push(a)_Concurrent_queue_base_v4@details(a)Concurrency@@IAAXPAX(a)Z
@ thiscall -arch=i386 ?_Internal_move_push(a)_Concurrent_queue_base_v4@details(a)Concurrency@@IAEXPAX(a)Z(ptr ptr) msvcp120.?_Internal_move_push(a)_Concurrent_queue_base_v4@details(a)Concurrency@@IAEXPAX(a)Z
@ cdecl -arch=win64 ?_Internal_move_push(a)_Concurrent_queue_base_v4@details(a)Concurrency@@IEAAXPEAX(a)Z(ptr ptr) msvcp120.?_Internal_move_push(a)_Concurrent_queue_base_v4@details(a)Concurrency@@IEAAXPEAX(a)Z
@@ -1479,24 +1479,24 @@
@ cdecl -arch=arm ?_Internal_push(a)_Concurrent_queue_base_v4@details(a)Concurrency@@IAAXPBX(a)Z(ptr ptr) msvcp120.?_Internal_push(a)_Concurrent_queue_base_v4@details(a)Concurrency@@IAAXPBX(a)Z
@ thiscall -arch=i386 ?_Internal_push(a)_Concurrent_queue_base_v4@details(a)Concurrency@@IAEXPBX(a)Z(ptr ptr) msvcp120.?_Internal_push(a)_Concurrent_queue_base_v4@details(a)Concurrency@@IAEXPBX(a)Z
@ cdecl -arch=win64 ?_Internal_push(a)_Concurrent_queue_base_v4@details(a)Concurrency@@IEAAXPEBX(a)Z(ptr ptr) msvcp120.?_Internal_push(a)_Concurrent_queue_base_v4@details(a)Concurrency@@IEAAXPEBX(a)Z
-@ stub -arch=arm ?_Internal_push_back(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAAPAXIAAI(a)Z
-@ stub -arch=i386 ?_Internal_push_back(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAEPAXIAAI(a)Z
-@ stub -arch=win64 ?_Internal_push_back(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IEAAPEAX_KAEA_K(a)Z
-@ stub -arch=arm ?_Internal_reserve(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAAXIII(a)Z
-@ stub -arch=i386 ?_Internal_reserve(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAEXIII(a)Z
-@ stub -arch=win64 ?_Internal_reserve(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IEAAX_K00(a)Z
-@ stub -arch=arm ?_Internal_resize(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAAXIIIP6AXPAXI(a)ZP6AX0PBXI@Z2(a)Z
-@ stub -arch=i386 ?_Internal_resize(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAEXIIIP6AXPAXI(a)ZP6AX0PBXI@Z2(a)Z
-@ stub -arch=win64 ?_Internal_resize(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IEAAX_K00P6AXPEAX0(a)ZP6AX1PEBX0@Z3(a)Z
+@ cdecl -arch=arm ?_Internal_push_back(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAAPAXIAAI(a)Z(ptr long long) msvcp120.?_Internal_push_back(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAAPAXIAAI(a)Z
+@ thiscall -arch=i386 ?_Internal_push_back(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAEPAXIAAI(a)Z(ptr long long) msvcp120.?_Internal_push_back(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAEPAXIAAI(a)Z
+@ cdecl -arch=win64 ?_Internal_push_back(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IEAAPEAX_KAEA_K(a)Z(ptr long long) msvcp120.?_Internal_push_back(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IEAAPEAX_KAEA_K(a)Z
+@ cdecl -arch=arm ?_Internal_reserve(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAAXIII(a)Z(ptr long long long) msvcp120.?_Internal_reserve(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAAXIII(a)Z
+@ thiscall -arch=i386 ?_Internal_reserve(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAEXIII(a)Z(ptr long long long) msvcp120.?_Internal_reserve(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAEXIII(a)Z
+@ cdecl -arch=win64 ?_Internal_reserve(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IEAAX_K00(a)Z(ptr long long long) msvcp120.?_Internal_reserve(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IEAAX_K00(a)Z
+@ cdecl -arch=arm ?_Internal_resize(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAAXIIIP6AXPAXI(a)ZP6AX0PBXI@Z2(a)Z(ptr long long long ptr ptr ptr) msvcp120.?_Internal_resize(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAAXIIIP6AXPAXI(a)ZP6AX0PBXI@Z2(a)Z
+@ thiscall -arch=i386 ?_Internal_resize(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAEXIIIP6AXPAXI(a)ZP6AX0PBXI@Z2(a)Z(ptr long long long ptr ptr ptr) msvcp120.?_Internal_resize(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAEXIIIP6AXPAXI(a)ZP6AX0PBXI@Z2(a)Z
+@ cdecl -arch=win64 ?_Internal_resize(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IEAAX_K00P6AXPEAX0(a)ZP6AX1PEBX0@Z3(a)Z(ptr long long long ptr ptr ptr) msvcp120.?_Internal_resize(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IEAAX_K00P6AXPEAX0(a)ZP6AX1PEBX0@Z3(a)Z
@ cdecl -arch=arm ?_Internal_size(a)_Concurrent_queue_base_v4@details(a)Concurrency@@IBAIXZ(ptr) msvcp120.?_Internal_size(a)_Concurrent_queue_base_v4@details(a)Concurrency@@IBAIXZ
@ thiscall -arch=i386 ?_Internal_size(a)_Concurrent_queue_base_v4@details(a)Concurrency@@IBEIXZ(ptr) msvcp120.?_Internal_size(a)_Concurrent_queue_base_v4@details(a)Concurrency@@IBEIXZ
@ cdecl -arch=win64 ?_Internal_size(a)_Concurrent_queue_base_v4@details(a)Concurrency@@IEBA_KXZ(ptr) msvcp120.?_Internal_size(a)_Concurrent_queue_base_v4@details(a)Concurrency@@IEBA_KXZ
@ cdecl -arch=arm ?_Internal_swap(a)_Concurrent_queue_base_v4@details(a)Concurrency@@IAAXAAV123@@Z(ptr ptr) msvcp120.?_Internal_swap(a)_Concurrent_queue_base_v4@details(a)Concurrency@@IAAXAAV123@@Z
@ thiscall -arch=i386 ?_Internal_swap(a)_Concurrent_queue_base_v4@details(a)Concurrency@@IAEXAAV123@@Z(ptr ptr) msvcp120.?_Internal_swap(a)_Concurrent_queue_base_v4@details(a)Concurrency@@IAEXAAV123@@Z
@ cdecl -arch=win64 ?_Internal_swap(a)_Concurrent_queue_base_v4@details(a)Concurrency@@IEAAXAEAV123@@Z(ptr ptr) msvcp120.?_Internal_swap(a)_Concurrent_queue_base_v4@details(a)Concurrency@@IEAAXAEAV123@@Z
-@ stub -arch=arm ?_Internal_swap(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAAXAAV123@@Z
-@ stub -arch=i386 ?_Internal_swap(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAEXAAV123@@Z
-@ stub -arch=win64 ?_Internal_swap(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IEAAXAEAV123@@Z
+@ cdecl -arch=arm ?_Internal_swap(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAAXAAV123@@Z(ptr ptr) msvcp120.?_Internal_swap(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAAXAAV123@@Z
+@ thiscall -arch=i386 ?_Internal_swap(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAEXAAV123@@Z(ptr ptr) msvcp120.?_Internal_swap(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAEXAAV123@@Z
+@ cdecl -arch=win64 ?_Internal_swap(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IEAAXAEAV123@@Z(ptr ptr) msvcp120.?_Internal_swap(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IEAAXAEAV123@@Z
@ cdecl -arch=arm ?_Internal_throw_exception(a)_Concurrent_queue_base_v4@details(a)Concurrency@@IBAXXZ(ptr) msvcp120.?_Internal_throw_exception(a)_Concurrent_queue_base_v4@details(a)Concurrency@@IBAXXZ
@ thiscall -arch=i386 ?_Internal_throw_exception(a)_Concurrent_queue_base_v4@details(a)Concurrency@@IBEXXZ(ptr) msvcp120.?_Internal_throw_exception(a)_Concurrent_queue_base_v4@details(a)Concurrency@@IBEXXZ
@ cdecl -arch=win64 ?_Internal_throw_exception(a)_Concurrent_queue_base_v4@details(a)Concurrency@@IEBAXXZ(ptr) msvcp120.?_Internal_throw_exception(a)_Concurrent_queue_base_v4@details(a)Concurrency@@IEBAXXZ
diff --git a/dlls/msvcp90/misc.c b/dlls/msvcp90/misc.c
index d9e01d4..ad815fd 100644
--- a/dlls/msvcp90/misc.c
+++ b/dlls/msvcp90/misc.c
@@ -1603,6 +1603,141 @@ DEFINE_RTTI_DATA0(_Runtime_object, 0, ".?AV_Runtime_object(a)details@Concurrency@@
#endif
+typedef struct
+{
+ void *storage[3];
+ MSVCP_size_t first_block;
+ MSVCP_size_t early_size;
+ void **segment;
+} _Concurrent_vector_base_v4;
+
+/* ??1_Concurrent_vector_base_v4(a)details@Concurrency@@IAE(a)XZ */
+/* ??1_Concurrent_vector_base_v4(a)details@Concurrency@@IEAA(a)XZ */
+DEFINE_THISCALL_WRAPPER(_Concurrent_vector_base_v4_dtor, 4)
+void __thiscall _Concurrent_vector_base_v4_dtor(
+ _Concurrent_vector_base_v4 *this)
+{
+ FIXME("(%p) stub\n", this);
+}
+
+/* ?_Internal_assign(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAEXABV123(a)IP6AXPAXI@ZP6AX1PBXI(a)Z4@Z */
+/* ?_Internal_assign(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IEAAXAEBV123(a)_KP6AXPEAX1@ZP6AX2PEBX1(a)Z5@Z */
+DEFINE_THISCALL_WRAPPER(_Concurrent_vector_base_v4__Internal_assign, 24)
+void __thiscall _Concurrent_vector_base_v4__Internal_assign(
+ _Concurrent_vector_base_v4 *this,
+ _Concurrent_vector_base_v4 const *v,
+ MSVCP_size_t len,
+ void (__cdecl *func0)(void *, MSVCP_size_t),
+ void (__cdecl *func1)(void *, void const *, MSVCP_size_t),
+ void (__cdecl *func2)(void *, void const *, MSVCP_size_t))
+{
+ FIXME("(%p %p %ld %p %p %p) stub\n", this, v, len, func0, func1, func2);
+}
+
+/* ?_Internal_capacity(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IBEIXZ */
+/* ?_Internal_capacity(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IEBA_KXZ */
+DEFINE_THISCALL_WRAPPER(_Concurrent_vector_base_v4__Internal_capacity, 4)
+MSVCP_size_t __thiscall _Concurrent_vector_base_v4__Internal_capacity(
+ const _Concurrent_vector_base_v4 *this)
+{
+ FIXME("(%p) stub\n", this);
+ return 0;
+}
+
+/* ?_Internal_clear(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAEIP6AXPAXI(a)Z@Z */
+/* ?_Internal_clear(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IEAA_KP6AXPEAX_K(a)Z@Z */
+DEFINE_THISCALL_WRAPPER(_Concurrent_vector_base_v4__Internal_clear, 8)
+MSVCP_size_t __thiscall _Concurrent_vector_base_v4__Internal_clear(
+ _Concurrent_vector_base_v4 *this, void (__cdecl *clear)(void *, MSVCP_size_t))
+{
+ FIXME("(%p %p) stub\n", this, clear);
+ return 0;
+}
+
+/* ?_Internal_compact(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAEPAXIPAXP6AX0I(a)ZP6AX0PBXI@Z(a)Z */
+/* ?_Internal_compact(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IEAAPEAX_KPEAXP6AX10(a)ZP6AX1PEBX0@Z(a)Z */
+DEFINE_THISCALL_WRAPPER(_Concurrent_vector_base_v4__Internal_compact, 20)
+void * __thiscall _Concurrent_vector_base_v4__Internal_compact(
+ _Concurrent_vector_base_v4 *this, MSVCP_size_t len, void *v,
+ void (__cdecl *clear)(void *, MSVCP_size_t),
+ void (__cdecl *copy)(void *, void const *, MSVCP_size_t))
+{
+ FIXME("(%p %ld %p %p %p) stub\n", this, len, v, clear, copy);
+ return NULL;
+}
+
+/* ?_Internal_copy(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAEXABV123(a)IP6AXPAXPBXI@Z(a)Z */
+/* ?_Internal_copy(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IEAAXAEBV123(a)_KP6AXPEAXPEBX1@Z(a)Z */
+DEFINE_THISCALL_WRAPPER(_Concurrent_vector_base_v4__Internal_copy, 16)
+void __thiscall _Concurrent_vector_base_v4__Internal_copy(
+ _Concurrent_vector_base_v4 *this, _Concurrent_vector_base_v4 const *v,
+ MSVCP_size_t len, void (__cdecl *copy)(void *, void const *, MSVCP_size_t))
+{
+ FIXME("(%p %p %ld %p) stub\n", this, v, len, copy);
+}
+
+/* ?_Internal_grow_by(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAEIIIP6AXPAXPBXI(a)Z1@Z */
+/* ?_Internal_grow_by(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IEAA_K_K0P6AXPEAXPEBX0(a)Z2@Z */
+DEFINE_THISCALL_WRAPPER(_Concurrent_vector_base_v4__Internal_grow_by, 20)
+MSVCP_size_t __thiscall _Concurrent_vector_base_v4__Internal_grow_by(
+ _Concurrent_vector_base_v4 *this, MSVCP_size_t count, MSVCP_size_t element_size,
+ void (__cdecl *copy)(void *, void const *, MSVCP_size_t), void const *v)
+{
+ FIXME("(%p %ld %ld %p %p) stub\n", this, count, element_size, copy, v);
+ return 0;
+}
+
+/* ?_Internal_grow_to_at_least_with_result(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAEIIIP6AXPAXPBXI(a)Z1@Z */
+/* ?_Internal_grow_to_at_least_with_result(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IEAA_K_K0P6AXPEAXPEBX0(a)Z2@Z */
+DEFINE_THISCALL_WRAPPER(_Concurrent_vector_base_v4__Internal_grow_to_at_least_with_result, 20)
+MSVCP_size_t __thiscall _Concurrent_vector_base_v4__Internal_grow_to_at_least_with_result(
+ _Concurrent_vector_base_v4 *this, MSVCP_size_t count, MSVCP_size_t element_size,
+ void (__cdecl *copy)(void *, void const *, MSVCP_size_t), void const *v)
+{
+ FIXME("(%p %ld %ld %p %p) stub\n", this, count, element_size, copy, v);
+ return 0;
+}
+
+/* ?_Internal_push_back(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAEPAXIAAI(a)Z */
+/* ?_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)
+{
+ FIXME("(%p %ld %p) stub\n", this, len1, len2);
+ return NULL;
+}
+
+/* ?_Internal_reserve(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAEXIII(a)Z */
+/* ?_Internal_reserve(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IEAAX_K00(a)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 len1,
+ MSVCP_size_t len2, MSVCP_size_t len3)
+{
+ FIXME("(%p %ld %ld %ld) stub\n", this, len1, len2, len3);
+}
+
+/* ?_Internal_resize(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAEXIIIP6AXPAXI(a)ZP6AX0PBXI@Z2(a)Z */
+/* ?_Internal_resize(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IEAAX_K00P6AXPEAX0(a)ZP6AX1PEBX0@Z3(a)Z */
+DEFINE_THISCALL_WRAPPER(_Concurrent_vector_base_v4__Internal_resize, 28)
+void __thiscall _Concurrent_vector_base_v4__Internal_resize(
+ _Concurrent_vector_base_v4 *this, MSVCP_size_t len1, MSVCP_size_t len2,
+ MSVCP_size_t len3, void (__cdecl *clear)(void *, MSVCP_size_t),
+ void (__cdecl *copy)(void *, void const *, MSVCP_size_t), void const *v)
+{
+ FIXME("%p %ld %ld %ld %p %p %p", this, len1, len2, len3, clear, copy, v);
+}
+
+/* ?_Internal_swap(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAEXAAV123@@Z */
+/* ?_Internal_swap(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IEAAXAEAV123@@Z */
+DEFINE_THISCALL_WRAPPER(_Concurrent_vector_base_v4__Internal_swap, 8)
+void __thiscall _Concurrent_vector_base_v4__Internal_swap(
+ _Concurrent_vector_base_v4 *this, _Concurrent_vector_base_v4 const * v)
+{
+ FIXME("(%p %p) stub\n", this, v);
+}
+
#ifndef __GNUC__
void __asm_dummy_vtables(void) {
#endif
--
2.7.4
1
0
08 May '18
Generic WineTestBot modules such as Jobs are supposed to let higher
level layers handle the logging or errors. But since the job scheduler
is part of the Engine it can log errors itself.
Signed-off-by: Francois Gouget <fgouget(a)codeweavers.com>
---
testbot/lib/WineTestBot/Engine/Scheduler.pm | 13 +++++--------
1 file changed, 5 insertions(+), 8 deletions(-)
diff --git a/testbot/lib/WineTestBot/Engine/Scheduler.pm b/testbot/lib/WineTestBot/Engine/Scheduler.pm
index fbe160420..4eef3c95d 100644
--- a/testbot/lib/WineTestBot/Engine/Scheduler.pm
+++ b/testbot/lib/WineTestBot/Engine/Scheduler.pm
@@ -32,6 +32,7 @@ our @EXPORT = qw(ScheduleJobs CheckJobs);
use WineTestBot::Config;
use WineTestBot::Jobs;
+use WineTestBot::Log;
use WineTestBot::RecordGroups;
use WineTestBot::VMs;
@@ -306,8 +307,7 @@ sub _CheckAndClassifyVMs()
}
else
{
- require WineTestBot::Log;
- WineTestBot::Log::LogMsg("Unexpected $VMKey status ". $VM->Status ."\n");
+ LogMsg "Unexpected $VMKey status ". $VM->Status ."\n";
$FoundVMErrors = 1;
# Don't interfere with this VM
$Sched->{busyvms}->{$VMKey} = 1;
@@ -352,8 +352,7 @@ sub _CheckAndClassifyVMs()
}
elsif ($VM->Status ne "off")
{
- require WineTestBot::Log;
- WineTestBot::Log::LogMsg("Unexpected $VMKey status ". $VM->Status ."\n");
+ LogMsg "Unexpected $VMKey status ". $VM->Status ."\n";
$FoundVMErrors = 1;
# Don't interfere with this VM
$Sched->{busyvms}->{$VMKey} = 1;
@@ -738,8 +737,7 @@ sub _DumpHostCounters($$)
my $HostKey = $VM->GetHost();
my $PrettyHost = ($PrettyHostNames ? $PrettyHostNames->{$HostKey} : "") ||
$HostKey;
- require WineTestBot::Log;
- WineTestBot::Log::LogMsg("$PrettyHost:$Counters\n") if ($Counters);
+ LogMsg "$PrettyHost:$Counters\n" if ($Counters);
$Host->{dumpedcounters} = 1;
}
@@ -778,8 +776,7 @@ sub _DumpHostVMs($$$$)
}
my $PrettyHost = ($PrettyHostNames ? $PrettyHostNames->{$HostKey} : "") ||
$HostKey;
- require WineTestBot::Log;
- WineTestBot::Log::LogMsg("$PrettyHost: @VMInfo\n");
+ LogMsg "$PrettyHost: @VMInfo\n";
$Host->{dumpedvms} = 1;
}
--
2.17.0
1
0
[PATCH 1/2] testbot: Move the job scheduler to WineTestBot::Engine::Scheduler.
by Francois Gouget 08 May '18
by Francois Gouget 08 May '18
08 May '18
The job scheduler is specific the the TestBot engine so ScheduleJobs()
should not be in the Jobs package which is meant to be used by any
process that deals with jobs.
The scheduler could even be part of Engine.pl but since it's pretty
self-contained it makes more sense to put it in its own package, hence
WineTestBot::Engine:Scheduler.
Signed-off-by: Francois Gouget <fgouget(a)codeweavers.com>
---
testbot/bin/Engine.pl | 1 +
testbot/lib/WineTestBot/Engine/Scheduler.pm | 978 ++++++++++++++++++++
testbot/lib/WineTestBot/Jobs.pm | 943 +------------------
3 files changed, 980 insertions(+), 942 deletions(-)
create mode 100644 testbot/lib/WineTestBot/Engine/Scheduler.pm
diff --git a/testbot/bin/Engine.pl b/testbot/bin/Engine.pl
index 730fd42e2..fae406702 100755
--- a/testbot/bin/Engine.pl
+++ b/testbot/bin/Engine.pl
@@ -48,6 +48,7 @@ use ObjectModel::BackEnd;
use WineTestBot::Config;
use WineTestBot::Engine::Events;
use WineTestBot::Engine::Notify;
+use WineTestBot::Engine::Scheduler;
use WineTestBot::Jobs;
use WineTestBot::Log;
use WineTestBot::Patches;
diff --git a/testbot/lib/WineTestBot/Engine/Scheduler.pm b/testbot/lib/WineTestBot/Engine/Scheduler.pm
new file mode 100644
index 000000000..fbe160420
--- /dev/null
+++ b/testbot/lib/WineTestBot/Engine/Scheduler.pm
@@ -0,0 +1,978 @@
+# -*- Mode: Perl; perl-indent-level: 2; indent-tabs-mode: nil -*-
+# WineTestBot engine scheduler
+#
+# Copyright 2012-2017 Francois Gouget
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+#
+# This library is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+# Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+
+use strict;
+
+package WineTestBot::Engine::Scheduler;
+
+=head1 NAME
+
+WineTestBot::Engine::Scheduler - Schedules the TestBot tasks
+
+=cut
+
+use Exporter 'import';
+our @EXPORT = qw(ScheduleJobs CheckJobs);
+
+use WineTestBot::Config;
+use WineTestBot::Jobs;
+use WineTestBot::RecordGroups;
+use WineTestBot::VMs;
+
+
+sub CompareJobPriority
+{
+ # Process Jobs with a higher Priority value last (it's a niceness in fact),
+ # and older Jobs first.
+ return $a->Priority <=> $b->Priority || $a->Id <=> $b->Id;
+}
+
+=pod
+=over 12
+
+=item C<CheckJobs()>
+
+Goes through the list of Jobs and updates their status. As a side-effect this
+detects failed builds, dead child processes, etc.
+
+=back
+=cut
+
+sub CheckJobs()
+{
+ my $Jobs = CreateJobs();
+ $Jobs->AddFilter("Status", ["queued", "running"]);
+ map { $_->UpdateStatus(); } @{$Jobs->GetItems()};
+
+ return undef;
+}
+
+sub _GetSchedHost($$)
+{
+ my ($Sched, $VM) = @_;
+
+ my $HostKey = $VM->GetHost();
+ if (!$Sched->{hosts}->{$HostKey})
+ {
+ $Sched->{hosts}->{$HostKey} = {
+ queued => 0, # Tasks
+ active => 0, # VMs...
+ idle => 0,
+ reverting => 0,
+ sleeping => 0,
+ running => 0,
+ dirty => 0,
+ dirtychild => 0,
+ MaxRevertingVMs => $MaxRevertingVMs,
+ MaxRevertsWhileRunningVMs => $MaxRevertsWhileRunningVMs,
+ MaxActiveVMs => $MaxActiveVMs,
+ MaxRunningVMs => $MaxRunningVMs,
+ MaxVMsWhenIdle => $MaxVMsWhenIdle,
+ };
+ }
+ return $Sched->{hosts}->{$HostKey};
+}
+
+sub _GetMaxReverts($)
+{
+ my ($Host) = @_;
+ return ($Host->{running} > 0) ?
+ $Host->{MaxRevertsWhileRunningVMs} :
+ $Host->{MaxRevertingVMs};
+}
+
+=pod
+=over 12
+
+=item C<_CanScheduleOnVM()>
+
+Checks if a task or VM operation can be performed on the specified VM.
+
+We allow multiple VM instances to refer to different snapshots of the same
+hypervisor domain (that is VM objects that have identical VirtURI and
+VirtDomain fields but different values for IdleSnapshot). This is typically
+used to test different configurations of the same base virtual machine.
+
+However a hypervisor domain cannot run two snapshots simultaneously so this
+function is used to ensure the scheduler does not simultaneously assign the
+same hypervisor domain to two VM instances.
+
+=back
+=cut
+
+sub _CanScheduleOnVM($$;$)
+{
+ my ($Sched, $VM, $Steal) = @_;
+
+ my $DomainKey = $VM->VirtURI ." ". $VM->VirtDomain;
+ my $DomainVM = $Sched->{domains}->{$DomainKey};
+
+ if (!$DomainVM or $DomainVM->Status eq "off")
+ {
+ $Sched->{domains}->{$DomainKey} = $VM;
+ return 1;
+ }
+
+ my $VMKey = $VM->GetKey();
+ if ($Sched->{busyvms}->{$VMKey})
+ {
+ # If the VM is busy it cannot be taken over for a new task
+ return 0;
+ }
+
+ my $DomainVMKey = $DomainVM->GetKey();
+ if ($VMKey eq $DomainVMKey)
+ {
+ # Already ours. Use it if it is not busy
+ return !$VM->ChildPid;
+ }
+
+ # We cannot schedule anything on this VM if we cannot take the hypervisor
+ # domain from its current owner. Note that we can always take over dirty VMs
+ # if we did not start an operation on them yet (i.e. if they are in lambvms).
+ if (!$Sched->{lambvms}->{$DomainVMKey} or
+ (!$Steal and ($VM->Status eq "off" or $DomainVM->Status ne "dirty")))
+ {
+ return 0;
+ }
+
+ # $DomainVM is either dirty (with no child process), idle or sleeping.
+ # Just mark it off and let the caller poweroff or revert the
+ # hypervisor domain as needed for the new VM.
+ $DomainVM->KillChild(); # For the sleeping case
+ my $Host = _GetSchedHost($Sched, $DomainVM);
+ $Host->{$DomainVM->Status}--;
+ $Host->{active}--;
+ $DomainVM->Status("off");
+ $DomainVM->Save();
+ # off VMs are neither in busyvms nor lambvms
+ delete $Sched->{lambvms}->{$DomainVMKey};
+ $Sched->{domains}->{$DomainKey} = $VM;
+ return 1;
+}
+
+=pod
+=over 12
+
+=item C<_CheckAndClassifyVMs()>
+
+Checks the VMs state consistency, counts the VMs in each state, classifies
+them, and determines which VM owns each hypervisor domain.
+
+=over
+
+=item *
+
+Checks that each VM's state is consistent and fixes the VM state if not. For
+instance, if Status == running then the VM should have a child process. If
+there is no such process, or if it died, then the VM should be brought back
+to a coherent state, typically by marking it dirty so it is either powered off
+or reverted.
+
+=item *
+
+Counts the VMs in each state so the scheduler can respect the limits put on the
+number of simultaneous active VMs, reverting VMs, and so on.
+
+=item *
+
+Puts the VMs in one of three sets:
+- The set of busyvms.
+ This is the set of VMs that are doing something important, for instance
+ running a Task, and should not be messed with.
+- The set of lambvms.
+ This is the set of VMs that use resources (they are powered on), but are
+ not doing anything important (idle, sleeping and dirty VMs). If the scheduler
+ is hitting the limits but still needs to power on one more VM, it can power
+ off one of these to make room.
+- The set of powered off VMs.
+ These are the VMs which are in neither the busyvms nor the lambvms set. Since
+ they are powered off they are not using resources.
+
+=item *
+
+Determines which VM should have exclusive access to each hypervisor domain.
+This is normally the VM that is currently using it, but if all a given
+hypervisor domain's VMs are off, one of them is picked at random. In any case
+if a VM is not in the busyvms set, the hypervisor domain can be taken away from
+it if necessary.
+
+=item *
+
+Each VM is given a priority describing the likelihood that it will be needed
+by a future job. When no other VM is running this can be used to decide which
+VMs to start in advance.
+
+=back
+
+=back
+=cut
+
+sub _CheckAndClassifyVMs()
+{
+ my $Sched = {
+ VMs => CreateVMs(),
+ hosts => {},
+ busyvms => {},
+ lambvms=> {},
+ nicefuture => {},
+ runnable => 0,
+ queued => 0,
+ blocked => 0,
+ recordgroups => CreateRecordGroups(),
+ };
+ $Sched->{recordgroup} = $Sched->{recordgroups}->Add();
+ $Sched->{records} = $Sched->{recordgroup}->Records;
+ # Save the new RecordGroup now so its Id is lower than those of the groups
+ # created by the scripts called from the scheduler.
+ $Sched->{recordgroups}->Save();
+
+ my $FoundVMErrors;
+ # Count the VMs that are 'active', that is, that use resources on the host,
+ # and those that are reverting. Also build a prioritized list of those that
+ # are ready to run tests: the idle ones.
+ foreach my $VM (@{$Sched->{VMs}->GetItems()})
+ {
+ my $VMKey = $VM->GetKey();
+ if (!$VM->HasEnabledRole())
+ {
+ # Don't schedule anything on this VM and otherwise ignore it
+ $Sched->{busyvms}->{$VMKey} = 1;
+ next;
+ }
+
+ my $Host = _GetSchedHost($Sched, $VM);
+ if ($VM->HasRunningChild())
+ {
+ if ($VM->Status =~ /^(?:dirty|running|reverting)$/)
+ {
+ $Sched->{busyvms}->{$VMKey} = 1;
+ $Host->{$VM->Status}++;
+ $Host->{active}++;
+ $Host->{dirtychild}++ if ($VM->Status eq "dirty");
+ }
+ elsif ($VM->Status eq "sleeping")
+ {
+ # Note that in the case of powered off VM snapshots, a sleeping VM is
+ # in fact booting up thus taking CPU and I/O resources.
+ # So don't count it as idle.
+ $Sched->{lambvms}->{$VMKey} = 1;
+ $Host->{sleeping}++;
+ $Host->{active}++;
+ }
+ elsif ($VM->Status eq "offline")
+ {
+ # The VM cannot be used until it comes back online
+ $Sched->{busyvms}->{$VMKey} = 1;
+ }
+ elsif ($VM->Status eq "maintenance")
+ {
+ # Maintenance VMs should not have a child process!
+ $FoundVMErrors = 1;
+ $VM->KillChild();
+ $VM->Save();
+ $VM->RecordResult($Sched->{records}, "boterror unexpected process");
+ # And the scheduler should not touch them
+ $Sched->{busyvms}->{$VMKey} = 1;
+ }
+ elsif ($VM->Status =~ /^(?:idle|off)$/)
+ {
+ # idle and off VMs should not have a child process!
+ # Mark the VM dirty so a poweroff or revert brings it to a known state.
+ $FoundVMErrors = 1;
+ $VM->KillChild();
+ $VM->Status("dirty");
+ $VM->Save();
+ $VM->RecordResult($Sched->{records}, "boterror unexpected process");
+ $Sched->{lambvms}->{$VMKey} = 1;
+ $Host->{dirty}++;
+ $Host->{active}++;
+ }
+ else
+ {
+ require WineTestBot::Log;
+ WineTestBot::Log::LogMsg("Unexpected $VMKey status ". $VM->Status ."\n");
+ $FoundVMErrors = 1;
+ # Don't interfere with this VM
+ $Sched->{busyvms}->{$VMKey} = 1;
+ }
+ }
+ else
+ {
+ if (defined $VM->ChildPid or
+ $VM->Status =~ /^(?:running|reverting|sleeping)$/)
+ {
+ # The VM is missing its child process or it died unexpectedly. Mark
+ # the VM dirty so a revert or shutdown brings it back to a known state.
+ $FoundVMErrors = 1;
+ $VM->ChildPid(undef);
+ $VM->Status("dirty");
+ $VM->Save();
+ $VM->RecordResult($Sched->{records}, "boterror process died");
+ $Sched->{lambvms}->{$VMKey} = 1;
+ $Host->{dirty}++;
+ $Host->{active}++;
+ }
+ elsif ($VM->Status =~ /^(?:dirty|idle)$/)
+ {
+ $Sched->{lambvms}->{$VMKey} = 1;
+ $Host->{$VM->Status}++;
+ $Host->{active}++;
+ }
+ elsif ($VM->Status eq "offline")
+ {
+ if (_CanScheduleOnVM($Sched, $VM))
+ {
+ my $ErrMessage = $VM->RunMonitor();
+ return ($ErrMessage, undef) if (defined $ErrMessage);
+ }
+ # Ignore the VM for this round since we cannot use it
+ $Sched->{busyvms}->{$VMKey} = 1;
+ }
+ elsif ($VM->Status eq "maintenance")
+ {
+ # Don't touch the VM while the administrator is working on it
+ $Sched->{busyvms}->{$VMKey} = 1;
+ }
+ elsif ($VM->Status ne "off")
+ {
+ require WineTestBot::Log;
+ WineTestBot::Log::LogMsg("Unexpected $VMKey status ". $VM->Status ."\n");
+ $FoundVMErrors = 1;
+ # Don't interfere with this VM
+ $Sched->{busyvms}->{$VMKey} = 1;
+ }
+ # Note that off VMs are neither in busyvms nor lambvms
+ }
+
+ _CanScheduleOnVM($Sched, $VM);
+
+ $Sched->{nicefuture}->{$VMKey} =
+ ($VM->Role eq "base" ? 0 :
+ $VM->Role eq "winetest" ? 10 :
+ 20) + # extra
+ ($VM->Type eq "build" ? 0 :
+ $VM->Type eq "win64" ? 1 :
+ 2); # win32
+ }
+
+ # If a VM was in an inconsistent state, update the jobs status fields before
+ # continuing with the scheduling.
+ CheckJobs() if ($FoundVMErrors);
+
+ return (undef, $Sched);
+}
+
+=pod
+=over 12
+
+=item C<_AddNeededVM()>
+
+Adds the specified VM to the list of VMs needed by queued tasks, together with
+priority information. The priority information is stored in an array which
+contains:
+
+=over
+
+=item [0]
+
+The VM's position in the Jobs list. Newer jobs give precedence to older ones.
+Note that the position within a job ($Step->No and $Task->No) does not matter.
+What counts is getting the job results to the developer.
+
+=item [1]
+
+The VM Status: dirty VMs are given a small priority boost since they are
+likely to already be in the host's memory.
+
+=item [2]
+
+The number of Tasks that need the VM. Give priority to VMs that are needed by
+more Tasks so we don't end up in a situation where all the tasks need the same
+VM, which cannot be parallelized.
+
+=item [3]
+
+If the VM is needed for a 'next step', then this lists its dependencies.
+The dependencies are the VMs that are still needed by a task in the current
+step. If any VM in the dependencies list is not yet being prepared to run
+a task, then it is too early to start preparing this VM for the next step.
+
+=back
+
+=back
+=cut
+
+sub _AddNeededVM($$$;$)
+{
+ my ($NeededVMs, $VM, $Niceness, $Dependencies) = @_;
+
+ my $VMKey = $VM->GetKey();
+ if (!$NeededVMs->{$VMKey})
+ {
+ my $Hot = ($VM->Status ne "off") ? 1 : 0;
+ my $PendingReverts = ($VM->Status !~ /^(?:idle|reverting|sleeping)$/) ? 1 : 0;
+ $NeededVMs->{$VMKey} = [$Niceness, $Hot, $PendingReverts, $Dependencies];
+ return 1;
+ }
+
+ # One more task needs this VM
+ $NeededVMs->{$VMKey}->[2]++;
+
+ # Although we process the jobs in decreasing priority order, the VM may
+ # have been added for a 'next step' task and thus with a much increased
+ # niceness and dependencies compared to the jobs that follow.
+ if ($Niceness < $NeededVMs->{$VMKey}->[0])
+ {
+ $NeededVMs->{$VMKey}->[0] = $Niceness;
+ $NeededVMs->{$VMKey}->[3] = $Dependencies;
+ return 1;
+ }
+
+ return 0;
+}
+
+sub _GetNiceness($$)
+{
+ my ($NeededVMs, $VMKey) = @_;
+ return $NeededVMs->{$VMKey}->[0];
+}
+
+sub _CompareNeededVMs($$$)
+{
+ my ($NeededVMs, $VMKey1, $VMKey2) = @_;
+
+ my $Data1 = $NeededVMs->{$VMKey1};
+ my $Data2 = $NeededVMs->{$VMKey2};
+ return $Data1->[0] <=> $Data2->[0] || # Lower niceness jobs first
+ $Data2->[1] <=> $Data1->[1] || # Hot VMs first
+ $Data2->[2] <=> $Data1->[2]; # Needed by more tasks first
+}
+
+sub _HasMissingDependencies($$$)
+{
+ my ($Sched, $NeededVMs, $VMKey) = @_;
+
+ my $Data = $NeededVMs->{$VMKey};
+ return undef if (!$Data->[3]);
+
+ foreach my $DepVM (@{$Data->[3]})
+ {
+ return 1 if ($DepVM->Status !~ /^(?:reverting|sleeping|running)$/);
+ }
+ return undef;
+}
+
+my $NEXT_BASE = 1000;
+my $FUTURE_BASE = 2000;
+
+=pod
+=over 12
+
+=item C<_ScheduleTasks()>
+
+Runs the tasks on idle VMs, and builds a list of the VMs that will be needed
+next.
+
+=back
+=cut
+
+sub _ScheduleTasks($)
+{
+ my ($Sched) = @_;
+
+ # The set of VMs needed by the runnable, 'next step' and future tasks
+ my $NeededVMs = {};
+
+ # Process the jobs in decreasing priority order
+ my $JobRank;
+ my $Jobs = CreateJobs($Sched->{VMs});
+ $Jobs->AddFilter("Status", ["queued", "running"]);
+ foreach my $Job (sort CompareJobPriority @{$Jobs->GetItems()})
+ {
+ $JobRank++;
+
+ # The per-step lists of VMs that should be getting ready to run
+ # before we prepare the next step
+ my %StepVMs = ("" => []); # no dependency for the first step
+
+ # Process the steps in increasing $Step->No order for the inter-step
+ # dependencies
+ my $Steps = $Job->Steps;
+ $Steps->AddFilter("Status", ["queued", "running"]);
+ foreach my $Step (sort { $a->No <=> $b->No } @{$Steps->GetItems()})
+ {
+ my $StepRank;
+ my $Previous = ""; # Avoid undefined values for hash indices
+ if (!$Step->PreviousNo)
+ {
+ # The first step may need to get files from the staging area
+ $Step->HandleStaging() if ($Step->Status eq "queued");
+ $StepRank = 0;
+ $StepVMs{$Step} = [];
+ }
+ else
+ {
+ $Previous = $Steps->GetItem($Step->PreviousNo);
+ if ($Previous->Status eq "completed")
+ {
+ # The previous step was successful so we can now run this one
+ $StepRank = 0;
+ $StepVMs{$Step} = [];
+ }
+ elsif ($StepVMs{$Previous})
+ {
+ # The previous step is almost done. Prepare this one.
+ $StepRank = 1;
+ }
+ else
+ {
+ # The previous step is nowhere near done
+ $StepRank = 2;
+ }
+ }
+
+ my $Tasks = $Step->Tasks;
+ $Tasks->AddFilter("Status", ["queued"]);
+ foreach my $Task (@{$Tasks->GetItems()})
+ {
+ my $VM = $Task->VM;
+ if (!$VM->HasEnabledRole() or !$VM->HasEnabledStatus())
+ {
+ $Sched->{blocked}++;
+ next;
+ }
+ my $Host = _GetSchedHost($Sched, $VM);
+ $Host->{queued}++;
+ $Sched->{queued}++;
+
+ if ($StepRank >= 2)
+ {
+ # The previous step is nowhere near done so skip this one for now
+ next;
+ }
+ if ($StepRank == 1)
+ {
+ # Passing $StepVMs{$Previous} ensures this VM will be reverted
+ # if and only if all of the previous step's tasks are about to run.
+ # See _HasMissingDependencies().
+ _AddNeededVM($NeededVMs, $VM, $NEXT_BASE + $JobRank,
+ $StepVMs{$Previous});
+ next;
+ }
+ $Sched->{runnable}++; # $StepRank == 0
+
+ if (!_AddNeededVM($NeededVMs, $VM, $JobRank))
+ {
+ # This VM is in $NeededVMs already which means it is already
+ # scheduled to be reverted for a task with a higher priority.
+ # So this task won't be run before a while and thus there is
+ # no point in preparing the next step.
+ $StepVMs{$Step} = undef;
+ next;
+ }
+
+ # It's not worth preparing the next step for tasks that take so long
+ $StepVMs{$Step} = undef if ($Task->Timeout > $BuildTimeout);
+
+ my $VMKey = $VM->GetKey();
+ if ($VM->Status eq "idle")
+ {
+ # Most of the time reverting a VM takes longer than running a task.
+ # So if a VM is ready (i.e. idle) we can start the first task we
+ # find for it, even if we could revert another VM to run a higher
+ # priority job.
+ # Even if we cannot start the task right away this VM is not a
+ # candidate for shutdown since it will be needed next.
+ delete $Sched->{lambvms}->{$VMKey};
+
+ # Dirty VMs are VMs that were running and have still not been
+ # powered off. Sleeping VMs may be VMs that are booting.
+ # So in both cases they may still be using CPU and I/O resources so
+ # count them against the running VM limit.
+ if ($Host->{sleeping} + $Host->{running} + $Host->{dirty} < $Host->{MaxRunningVMs} and
+ ($Host->{reverting} == 0 or
+ $Host->{reverting} <= $Host->{MaxRevertsWhileRunningVMs}) and
+ _CanScheduleOnVM($Sched, $VM))
+ {
+ $Sched->{busyvms}->{$VMKey} = 1;
+ $VM->RecordStatus($Sched->{records}, join(" ", "running", $Job->Id, $Step->No, $Task->No));
+ my $ErrMessage = $Task->Run($Step);
+ return ($ErrMessage, undef) if (defined $ErrMessage);
+
+ $Job->UpdateStatus();
+ $Host->{idle}--;
+ $Host->{running}++;
+ }
+ }
+ elsif ($VM->Status =~ /^(?:reverting|sleeping)$/)
+ {
+ # The VM is not running jobs yet but soon will be so it is not a
+ # candidate for shutdown or sacrifices.
+ delete $Sched->{lambvms}->{$VMKey};
+ }
+ elsif ($VM->Status ne "off" and !$Sched->{lambvms}->{$VMKey})
+ {
+ # We cannot use the VM because it is busy (running another task,
+ # offline, etc.). So it is too early to prepare the next step.
+ $StepVMs{$Step} = undef;
+ }
+ push @{$StepVMs{$Step}}, $VM if ($StepVMs{$Step});
+ }
+ }
+ }
+
+ # Finally add some VMs with a very low priority for future jobs.
+ foreach my $VM (@{$Sched->{VMs}->GetItems()})
+ {
+ next if (!$VM->HasEnabledRole() or !$VM->HasEnabledStatus());
+ my $VMKey = $VM->GetKey();
+ my $Niceness = $FUTURE_BASE + $Sched->{nicefuture}->{$VMKey};
+ _AddNeededVM($NeededVMs, $VM, $Niceness);
+ }
+
+ return (undef, $NeededVMs);
+}
+
+=pod
+=over 12
+
+=item C<_SacrificeVM()>
+
+Looks for and powers off a VM we don't need now in order to free resources
+for one we do need now.
+
+This is a helper for _RevertVMs().
+
+=back
+=cut
+
+sub _SacrificeVM($$$)
+{
+ my ($Sched, $NeededVMs, $VM) =@_;
+ my $VMKey = $VM->GetKey();
+ my $Host = _GetSchedHost($Sched, $VM);
+
+ # Grab the lowest priority lamb and sacrifice it
+ my $ForFutureVM = (_GetNiceness($NeededVMs, $VMKey) >= $FUTURE_BASE);
+ my $NiceFuture = $Sched->{nicefuture};
+ my ($Victim, $VictimKey, $VictimStatusPrio);
+ foreach my $CandidateKey (keys %{$Sched->{lambvms}})
+ {
+ my $Candidate = $Sched->{VMs}->GetItem($CandidateKey);
+
+ # Check that the candidate is on the right host
+ my $CandidateHost = _GetSchedHost($Sched, $Candidate);
+ next if ($CandidateHost != $Host);
+
+ # Don't sacrifice idle / sleeping VMs for future tasks
+ next if ($ForFutureVM and $Candidate->Status =~ /^(?:idle|sleeping)/);
+
+ # Don't sacrifice more important VMs
+ next if (_CompareNeededVMs($NeededVMs, $CandidateKey, $VMKey) <= 0);
+
+ my $CandidateStatusPrio = $Candidate->Status eq "idle" ? 2 :
+ $Candidate->Status eq "sleeping" ? 1 :
+ 0; # Status eq dirty
+ if ($Victim)
+ {
+ my $Cmp = $VictimStatusPrio <=> $CandidateStatusPrio ||
+ $NiceFuture->{$CandidateKey} <=> $NiceFuture->{$VictimKey};
+ next if ($Cmp <= 0);
+ }
+
+ $Victim = $Candidate;
+ $VictimKey = $CandidateKey;
+ $VictimStatusPrio = $CandidateStatusPrio;
+ }
+ return undef if (!$Victim);
+
+ delete $Sched->{lambvms}->{$VictimKey};
+ $Sched->{busyvms}->{$VictimKey} = 1;
+ $Host->{$Victim->Status}--;
+ $Host->{dirty}++;
+ $Victim->RecordStatus($Sched->{records}, $Victim->Status eq "dirty" ? "dirty poweroff" : "dirty sacrifice");
+ $Victim->RunPowerOff();
+ return 1;
+}
+
+sub _DumpHostCounters($$)
+{
+ my ($Sched, $VM) = @_;
+ my $Host = _GetSchedHost($Sched, $VM);
+ return if ($Host->{dumpedcounters});
+
+ my $Counters = "";
+ if ($Host->{active})
+ {
+ $Counters .= " active=$Host->{active}/$Host->{MaxActiveVMs}";
+ }
+ if ($Host->{idle})
+ {
+ $Counters .= " idle=$Host->{idle}". ($Host->{queued} ? "" : "/$Host->{MaxVMsWhenIdle}");
+ }
+ if ($Host->{reverting})
+ {
+ $Counters .= " reverting=$Host->{reverting}/". _GetMaxReverts($Host);
+ }
+ for my $Counter ("sleeping", "running", "dirty", "queued")
+ {
+ $Counters .= " $Counter=$Host->{$Counter}" if ($Host->{$Counter});
+ }
+ my $HostKey = $VM->GetHost();
+ my $PrettyHost = ($PrettyHostNames ? $PrettyHostNames->{$HostKey} : "") ||
+ $HostKey;
+ require WineTestBot::Log;
+ WineTestBot::Log::LogMsg("$PrettyHost:$Counters\n") if ($Counters);
+
+ $Host->{dumpedcounters} = 1;
+}
+
+sub _DumpHostVMs($$$$)
+{
+ my ($Sched, $VM, $SortedNeededVMs, $NeededVMs) = @_;
+ my $Host = _GetSchedHost($Sched, $VM);
+ return if ($Host->{dumpedvms});
+
+ _DumpHostCounters($Sched, $VM);
+
+ my @VMInfo;
+ my $HostKey = $VM->GetHost();
+ foreach my $VMKey (@$SortedNeededVMs)
+ {
+ $VM = $Sched->{VMs}->GetItem($VMKey);
+ next if ($VM->GetHost() ne $HostKey);
+
+ my $NeededVM = $NeededVMs->{$VMKey};
+ my $Dep = "";
+ if ($NeededVM->[3])
+ {
+ foreach my $DepVM (@{$NeededVM->[3]})
+ {
+ if ($DepVM->Status !~ /^(?:reverting|sleeping|running)$/)
+ {
+ $Dep = ":". $DepVM->Name;
+ last;
+ }
+ }
+ $Dep .= "/". scalar(@{$NeededVM->[3]});
+ }
+ push @VMInfo, join(":", "$VMKey(". $VM->Status ."$Dep)",
+ $NeededVM->[0], $NeededVM->[1], $NeededVM->[2]);
+ }
+ my $PrettyHost = ($PrettyHostNames ? $PrettyHostNames->{$HostKey} : "") ||
+ $HostKey;
+ require WineTestBot::Log;
+ WineTestBot::Log::LogMsg("$PrettyHost: @VMInfo\n");
+
+ $Host->{dumpedvms} = 1;
+}
+
+sub _RevertVMs($$)
+{
+ my ($Sched, $NeededVMs) = @_;
+
+ # Sort the VMs that tasks need by decreasing priority order and revert them
+ my @SortedNeededVMs = sort { _CompareNeededVMs($NeededVMs, $a, $b) } keys %{$NeededVMs};
+ foreach my $VMKey (@SortedNeededVMs)
+ {
+ my $VM = $Sched->{VMs}->GetItem($VMKey);
+ my $VMStatus = $VM->Status;
+ next if ($VMStatus eq "idle");
+
+ # Check if the host has reached its reverting VMs limit
+ my $Host = _GetSchedHost($Sched, $VM);
+ next if ($Host->{reverting} >= _GetMaxReverts($Host));
+ _DumpHostCounters($Sched, $VM);
+
+ # Skip this VM if the previous step's tasks are not about to run yet
+ next if (_HasMissingDependencies($Sched, $NeededVMs, $VMKey));
+
+ # Don't steal the hypervisor domain for a VM we will only need later
+ my $Steal = (_GetNiceness($NeededVMs, $VMKey) < $NEXT_BASE);
+ next if (!_CanScheduleOnVM($Sched, $VM, $Steal));
+
+ my $NeedsSacrifice;
+ if (_GetNiceness($NeededVMs, $VMKey) >= $FUTURE_BASE)
+ {
+ # Only start preparing VMs for future jobs on a host which is idle, i.e.
+ # which no longer has queued tasks (ignoring blocked ones).
+ # Note that during regular operation we get dirty VMs before they are
+ # assigned a process to shut them down. This makes it possible to pick
+ # the best future VM while we still know which VM is hot.
+ # In constrast on startup the dirty VMs all have processes checking their
+ # status, hence the dirtychild check to ensure we are not prevented from
+ # preparing the best VM (e.g. build): it delays preparing the future VMs
+ # until either there are no dirty VM or a VM got prepared for a task
+ # which means the host is not idle.
+ if ($Host->{queued} != 0 or $Host->{MaxVMsWhenIdle} == 0 or
+ ($Host->{active} and $Host->{active} == $Host->{dirtychild}))
+ {
+ # The TestBot is busy or does not prepare VMs when idle
+ next;
+ }
+ # To not exceed the limit we must take into account VMs that are not yet
+ # idle but will soon be.
+ my $FutureIdle = $Host->{idle} + $Host->{reverting} + $Host->{sleeping} + ($VMStatus eq "off" ? 1 : 0);
+ $NeedsSacrifice = ($FutureIdle > $Host->{MaxVMsWhenIdle});
+ }
+ else
+ {
+ my $FutureActive = $Host->{active} + ($VMStatus eq "off" ? 1 : 0);
+ $NeedsSacrifice = ($FutureActive > $Host->{MaxActiveVMs});
+ }
+
+ _DumpHostVMs($Sched, $VM, \@SortedNeededVMs, $NeededVMs);
+ if ($NeedsSacrifice)
+ {
+ # Find an active VM to sacrifice so we can revert this VM in the next
+ # scheduler round
+ last if (!_SacrificeVM($Sched, $NeededVMs, $VM));
+ delete $Sched->{lambvms}->{$VMKey};
+ # The $Host counters must account for the coming revert. This means
+ # active is unchanged: -1 for the sacrificed VM and +1 for the revert.
+ $Host->{reverting}++;
+ }
+ else
+ {
+ delete $Sched->{lambvms}->{$VMKey};
+ $Sched->{busyvms}->{$VMKey} = 1;
+ my $ErrMessage = $VM->RunRevert();
+ return $ErrMessage if (defined $ErrMessage);
+ $Host->{active}++ if ($VMStatus eq "off");
+ $Host->{reverting}++;
+ }
+ }
+ return undef;
+}
+
+sub _PowerOffDirtyVMs($)
+{
+ my ($Sched) = @_;
+
+ # Power off any still dirty VM
+ foreach my $VMKey (keys %{$Sched->{lambvms}})
+ {
+ my $VM = $Sched->{VMs}->GetItem($VMKey);
+ next if ($VM->Status ne "dirty");
+ next if (!_CanScheduleOnVM($Sched, $VM));
+
+ $VM->RecordStatus($Sched->{records}, "dirty poweroff");
+ my $ErrMessage = $VM->RunPowerOff();
+ return $ErrMessage if (defined $ErrMessage);
+ }
+ return undef;
+}
+
+my $_LastTaskCounts = "";
+
+=pod
+=over 12
+
+=item C<ScheduleJobs()>
+
+Goes through the pending Jobs to run their queued Tasks. This implies preparing
+the VMs while staying within the VM hosts resource limits. In particular this
+means taking the following constraints into account:
+
+=over
+
+=item *
+
+Jobs should be run in decreasing order of priority.
+
+=item *
+
+A Job's Steps must be run in sequential order.
+
+=item *
+
+A Step's tasks can be run in parallel but only one task can be running in a VM
+at a given time. Also a VM must be prepared before it can run its task, see the
+VM Statuses.
+
+=item *
+
+The number of active VMs on the host must be kept under $MaxActiveVMs. Any
+VM using resources counts as an active VM, including those that are being
+reverted. This limit is meant to ensure the VM host will have enough memory,
+CPU or I/O resources for all the active VMs. Also note that this limit must be
+respected even if there is more than one hypervisor running on the host.
+
+=item *
+
+The number of VMs being reverted on the host at a given time must be kept under
+$MaxRevertingVMs, or $MaxRevertsWhileRunningVMs if some VMs are currently
+running tests. This may be set to 1 in case the hypervisor gets confused when
+reverting too many VMs at once.
+
+=item *
+
+Once there are no jobs to run anymore the scheduler can prepare up to
+$MaxVMsWhenIdle VMs (or $MaxActiveVMs if not set) for future jobs.
+This can be set to 0 to minimize the TestBot resource usage when idle.
+This can also be set to a value greater than $MaxActiveVMs. Then only
+$MaxActiveVMs tasks will be run simultaneously but the extra idle VMs will be
+kept on standby so they are ready when their turn comes.
+
+=back
+
+=back
+=cut
+
+sub ScheduleJobs()
+{
+ my ($ErrMessage, $Sched) = _CheckAndClassifyVMs();
+ return $ErrMessage if ($ErrMessage);
+
+ my $NeededVMs;
+ ($ErrMessage, $NeededVMs) = _ScheduleTasks($Sched);
+ return $ErrMessage if ($ErrMessage);
+
+ $ErrMessage = _RevertVMs($Sched, $NeededVMs);
+ return $ErrMessage if ($ErrMessage);
+
+ $ErrMessage = _PowerOffDirtyVMs($Sched);
+ return $ErrMessage if ($ErrMessage);
+
+ # Note that any VM Status or Role change will trigger ScheduleJobs() so this
+ # records all not yet recorded VM state changes, even those not initiated by
+ # the scheduler.
+ map { $_->RecordStatus($Sched->{records}) } @{$Sched->{VMs}->GetItems()};
+
+ if (@{$Sched->{records}->GetItems()})
+ {
+ my $TaskCounts = "$Sched->{runnable} $Sched->{queued} $Sched->{blocked}";
+ if ($TaskCounts ne $_LastTaskCounts)
+ {
+ $Sched->{records}->AddRecord('tasks', 'counters', $TaskCounts);
+ $_LastTaskCounts = $TaskCounts;
+ }
+ $Sched->{recordgroups}->Save();
+ }
+ else
+ {
+ $Sched->{recordgroups}->DeleteItem($Sched->{recordgroup});
+ }
+
+ return undef;
+}
+
+
+1;
diff --git a/testbot/lib/WineTestBot/Jobs.pm b/testbot/lib/WineTestBot/Jobs.pm
index ea226ad37..1dbee9b37 100644
--- a/testbot/lib/WineTestBot/Jobs.pm
+++ b/testbot/lib/WineTestBot/Jobs.pm
@@ -399,7 +399,7 @@ use WineTestBot::WineTestBotObjects;
BEGIN
{
our @ISA = qw(WineTestBot::WineTestBotCollection);
- our @EXPORT = qw(CreateJobs ScheduleJobs CheckJobs);
+ our @EXPORT = qw(CreateJobs);
}
use ObjectModel::BasicPropertyDescriptor;
@@ -407,12 +407,9 @@ use ObjectModel::EnumPropertyDescriptor;
use ObjectModel::DetailrefPropertyDescriptor;
use ObjectModel::ItemrefPropertyDescriptor;
use WineTestBot::Branches;
-use WineTestBot::Config;
use WineTestBot::Patches;
-use WineTestBot::RecordGroups;
use WineTestBot::Steps;
use WineTestBot::Users;
-use WineTestBot::VMs;
sub CreateItem($)
@@ -454,944 +451,6 @@ sub CreateJobs(;$)
$ScopeObject);
}
-sub CompareJobPriority
-{
- # Process Jobs with a higher Priority value last (it's a niceness in fact),
- # and older Jobs first.
- return $a->Priority <=> $b->Priority || $a->Id <=> $b->Id;
-}
-
-=pod
-=over 12
-
-=item C<CheckJobs()>
-
-Goes through the list of Jobs and updates their status. As a side-effect this
-detects failed builds, dead child processes, etc.
-
-=back
-=cut
-
-sub CheckJobs()
-{
- my $Jobs = CreateJobs();
- $Jobs->AddFilter("Status", ["queued", "running"]);
- map { $_->UpdateStatus(); } @{$Jobs->GetItems()};
-
- return undef;
-}
-
-sub _GetSchedHost($$)
-{
- my ($Sched, $VM) = @_;
-
- my $HostKey = $VM->GetHost();
- if (!$Sched->{hosts}->{$HostKey})
- {
- $Sched->{hosts}->{$HostKey} = {
- queued => 0, # Tasks
- active => 0, # VMs...
- idle => 0,
- reverting => 0,
- sleeping => 0,
- running => 0,
- dirty => 0,
- dirtychild => 0,
- MaxRevertingVMs => $MaxRevertingVMs,
- MaxRevertsWhileRunningVMs => $MaxRevertsWhileRunningVMs,
- MaxActiveVMs => $MaxActiveVMs,
- MaxRunningVMs => $MaxRunningVMs,
- MaxVMsWhenIdle => $MaxVMsWhenIdle,
- };
- }
- return $Sched->{hosts}->{$HostKey};
-}
-
-sub _GetMaxReverts($)
-{
- my ($Host) = @_;
- return ($Host->{running} > 0) ?
- $Host->{MaxRevertsWhileRunningVMs} :
- $Host->{MaxRevertingVMs};
-}
-
-=pod
-=over 12
-
-=item C<_CanScheduleOnVM()>
-
-Checks if a task or VM operation can be performed on the specified VM.
-
-We allow multiple VM instances to refer to different snapshots of the same
-hypervisor domain (that is VM objects that have identical VirtURI and
-VirtDomain fields but different values for IdleSnapshot). This is typically
-used to test different configurations of the same base virtual machine.
-
-However a hypervisor domain cannot run two snapshots simultaneously so this
-function is used to ensure the scheduler does not simultaneously assign the
-same hypervisor domain to two VM instances.
-
-=back
-=cut
-
-sub _CanScheduleOnVM($$;$)
-{
- my ($Sched, $VM, $Steal) = @_;
-
- my $DomainKey = $VM->VirtURI ." ". $VM->VirtDomain;
- my $DomainVM = $Sched->{domains}->{$DomainKey};
-
- if (!$DomainVM or $DomainVM->Status eq "off")
- {
- $Sched->{domains}->{$DomainKey} = $VM;
- return 1;
- }
-
- my $VMKey = $VM->GetKey();
- if ($Sched->{busyvms}->{$VMKey})
- {
- # If the VM is busy it cannot be taken over for a new task
- return 0;
- }
-
- my $DomainVMKey = $DomainVM->GetKey();
- if ($VMKey eq $DomainVMKey)
- {
- # Already ours. Use it if it is not busy
- return !$VM->ChildPid;
- }
-
- # We cannot schedule anything on this VM if we cannot take the hypervisor
- # domain from its current owner. Note that we can always take over dirty VMs
- # if we did not start an operation on them yet (i.e. if they are in lambvms).
- if (!$Sched->{lambvms}->{$DomainVMKey} or
- (!$Steal and ($VM->Status eq "off" or $DomainVM->Status ne "dirty")))
- {
- return 0;
- }
-
- # $DomainVM is either dirty (with no child process), idle or sleeping.
- # Just mark it off and let the caller poweroff or revert the
- # hypervisor domain as needed for the new VM.
- $DomainVM->KillChild(); # For the sleeping case
- my $Host = _GetSchedHost($Sched, $DomainVM);
- $Host->{$DomainVM->Status}--;
- $Host->{active}--;
- $DomainVM->Status("off");
- $DomainVM->Save();
- # off VMs are neither in busyvms nor lambvms
- delete $Sched->{lambvms}->{$DomainVMKey};
- $Sched->{domains}->{$DomainKey} = $VM;
- return 1;
-}
-
-=pod
-=over 12
-
-=item C<_CheckAndClassifyVMs()>
-
-Checks the VMs state consistency, counts the VMs in each state, classifies
-them, and determines which VM owns each hypervisor domain.
-
-=over
-
-=item *
-
-Checks that each VM's state is consistent and fixes the VM state if not. For
-instance, if Status == running then the VM should have a child process. If
-there is no such process, or if it died, then the VM should be brought back
-to a coherent state, typically by marking it dirty so it is either powered off
-or reverted.
-
-=item *
-
-Counts the VMs in each state so the scheduler can respect the limits put on the
-number of simultaneous active VMs, reverting VMs, and so on.
-
-=item *
-
-Puts the VMs in one of three sets:
-- The set of busyvms.
- This is the set of VMs that are doing something important, for instance
- running a Task, and should not be messed with.
-- The set of lambvms.
- This is the set of VMs that use resources (they are powered on), but are
- not doing anything important (idle, sleeping and dirty VMs). If the scheduler
- is hitting the limits but still needs to power on one more VM, it can power
- off one of these to make room.
-- The set of powered off VMs.
- These are the VMs which are in neither the busyvms nor the lambvms set. Since
- they are powered off they are not using resources.
-
-=item *
-
-Determines which VM should have exclusive access to each hypervisor domain.
-This is normally the VM that is currently using it, but if all a given
-hypervisor domain's VMs are off, one of them is picked at random. In any case
-if a VM is not in the busyvms set, the hypervisor domain can be taken away from
-it if necessary.
-
-=item *
-
-Each VM is given a priority describing the likelihood that it will be needed
-by a future job. When no other VM is running this can be used to decide which
-VMs to start in advance.
-
-=back
-
-=back
-=cut
-
-sub _CheckAndClassifyVMs()
-{
- my $Sched = {
- VMs => CreateVMs(),
- hosts => {},
- busyvms => {},
- lambvms=> {},
- nicefuture => {},
- runnable => 0,
- queued => 0,
- blocked => 0,
- recordgroups => CreateRecordGroups(),
- };
- $Sched->{recordgroup} = $Sched->{recordgroups}->Add();
- $Sched->{records} = $Sched->{recordgroup}->Records;
- # Save the new RecordGroup now so its Id is lower than those of the groups
- # created by the scripts called from the scheduler.
- $Sched->{recordgroups}->Save();
-
- my $FoundVMErrors;
- # Count the VMs that are 'active', that is, that use resources on the host,
- # and those that are reverting. Also build a prioritized list of those that
- # are ready to run tests: the idle ones.
- foreach my $VM (@{$Sched->{VMs}->GetItems()})
- {
- my $VMKey = $VM->GetKey();
- if (!$VM->HasEnabledRole())
- {
- # Don't schedule anything on this VM and otherwise ignore it
- $Sched->{busyvms}->{$VMKey} = 1;
- next;
- }
-
- my $Host = _GetSchedHost($Sched, $VM);
- if ($VM->HasRunningChild())
- {
- if ($VM->Status =~ /^(?:dirty|running|reverting)$/)
- {
- $Sched->{busyvms}->{$VMKey} = 1;
- $Host->{$VM->Status}++;
- $Host->{active}++;
- $Host->{dirtychild}++ if ($VM->Status eq "dirty");
- }
- elsif ($VM->Status eq "sleeping")
- {
- # Note that in the case of powered off VM snapshots, a sleeping VM is
- # in fact booting up thus taking CPU and I/O resources.
- # So don't count it as idle.
- $Sched->{lambvms}->{$VMKey} = 1;
- $Host->{sleeping}++;
- $Host->{active}++;
- }
- elsif ($VM->Status eq "offline")
- {
- # The VM cannot be used until it comes back online
- $Sched->{busyvms}->{$VMKey} = 1;
- }
- elsif ($VM->Status eq "maintenance")
- {
- # Maintenance VMs should not have a child process!
- $FoundVMErrors = 1;
- $VM->KillChild();
- $VM->Save();
- $VM->RecordResult($Sched->{records}, "boterror unexpected process");
- # And the scheduler should not touch them
- $Sched->{busyvms}->{$VMKey} = 1;
- }
- elsif ($VM->Status =~ /^(?:idle|off)$/)
- {
- # idle and off VMs should not have a child process!
- # Mark the VM dirty so a poweroff or revert brings it to a known state.
- $FoundVMErrors = 1;
- $VM->KillChild();
- $VM->Status("dirty");
- $VM->Save();
- $VM->RecordResult($Sched->{records}, "boterror unexpected process");
- $Sched->{lambvms}->{$VMKey} = 1;
- $Host->{dirty}++;
- $Host->{active}++;
- }
- else
- {
- require WineTestBot::Log;
- WineTestBot::Log::LogMsg("Unexpected $VMKey status ". $VM->Status ."\n");
- $FoundVMErrors = 1;
- # Don't interfere with this VM
- $Sched->{busyvms}->{$VMKey} = 1;
- }
- }
- else
- {
- if (defined $VM->ChildPid or
- $VM->Status =~ /^(?:running|reverting|sleeping)$/)
- {
- # The VM is missing its child process or it died unexpectedly. Mark
- # the VM dirty so a revert or shutdown brings it back to a known state.
- $FoundVMErrors = 1;
- $VM->ChildPid(undef);
- $VM->Status("dirty");
- $VM->Save();
- $VM->RecordResult($Sched->{records}, "boterror process died");
- $Sched->{lambvms}->{$VMKey} = 1;
- $Host->{dirty}++;
- $Host->{active}++;
- }
- elsif ($VM->Status =~ /^(?:dirty|idle)$/)
- {
- $Sched->{lambvms}->{$VMKey} = 1;
- $Host->{$VM->Status}++;
- $Host->{active}++;
- }
- elsif ($VM->Status eq "offline")
- {
- if (_CanScheduleOnVM($Sched, $VM))
- {
- my $ErrMessage = $VM->RunMonitor();
- return ($ErrMessage, undef) if (defined $ErrMessage);
- }
- # Ignore the VM for this round since we cannot use it
- $Sched->{busyvms}->{$VMKey} = 1;
- }
- elsif ($VM->Status eq "maintenance")
- {
- # Don't touch the VM while the administrator is working on it
- $Sched->{busyvms}->{$VMKey} = 1;
- }
- elsif ($VM->Status ne "off")
- {
- require WineTestBot::Log;
- WineTestBot::Log::LogMsg("Unexpected $VMKey status ". $VM->Status ."\n");
- $FoundVMErrors = 1;
- # Don't interfere with this VM
- $Sched->{busyvms}->{$VMKey} = 1;
- }
- # Note that off VMs are neither in busyvms nor lambvms
- }
-
- _CanScheduleOnVM($Sched, $VM);
-
- $Sched->{nicefuture}->{$VMKey} =
- ($VM->Role eq "base" ? 0 :
- $VM->Role eq "winetest" ? 10 :
- 20) + # extra
- ($VM->Type eq "build" ? 0 :
- $VM->Type eq "win64" ? 1 :
- 2); # win32
- }
-
- # If a VM was in an inconsistent state, update the jobs status fields before
- # continuing with the scheduling.
- CheckJobs() if ($FoundVMErrors);
-
- return (undef, $Sched);
-}
-
-=pod
-=over 12
-
-=item C<_AddNeededVM()>
-
-Adds the specified VM to the list of VMs needed by queued tasks, together with
-priority information. The priority information is stored in an array which
-contains:
-
-=over
-
-=item [0]
-
-The VM's position in the Jobs list. Newer jobs give precedence to older ones.
-Note that the position within a job ($Step->No and $Task->No) does not matter.
-What counts is getting the job results to the developer.
-
-=item [1]
-
-The VM Status: dirty VMs are given a small priority boost since they are
-likely to already be in the host's memory.
-
-=item [2]
-
-The number of Tasks that need the VM. Give priority to VMs that are needed by
-more Tasks so we don't end up in a situation where all the tasks need the same
-VM, which cannot be parallelized.
-
-=item [3]
-
-If the VM is needed for a 'next step', then this lists its dependencies.
-The dependencies are the VMs that are still needed by a task in the current
-step. If any VM in the dependencies list is not yet being prepared to run
-a task, then it is too early to start preparing this VM for the next step.
-
-=back
-
-=back
-=cut
-
-sub _AddNeededVM($$$;$)
-{
- my ($NeededVMs, $VM, $Niceness, $Dependencies) = @_;
-
- my $VMKey = $VM->GetKey();
- if (!$NeededVMs->{$VMKey})
- {
- my $Hot = ($VM->Status ne "off") ? 1 : 0;
- my $PendingReverts = ($VM->Status !~ /^(?:idle|reverting|sleeping)$/) ? 1 : 0;
- $NeededVMs->{$VMKey} = [$Niceness, $Hot, $PendingReverts, $Dependencies];
- return 1;
- }
-
- # One more task needs this VM
- $NeededVMs->{$VMKey}->[2]++;
-
- # Although we process the jobs in decreasing priority order, the VM may
- # have been added for a 'next step' task and thus with a much increased
- # niceness and dependencies compared to the jobs that follow.
- if ($Niceness < $NeededVMs->{$VMKey}->[0])
- {
- $NeededVMs->{$VMKey}->[0] = $Niceness;
- $NeededVMs->{$VMKey}->[3] = $Dependencies;
- return 1;
- }
-
- return 0;
-}
-
-sub _GetNiceness($$)
-{
- my ($NeededVMs, $VMKey) = @_;
- return $NeededVMs->{$VMKey}->[0];
-}
-
-sub _CompareNeededVMs($$$)
-{
- my ($NeededVMs, $VMKey1, $VMKey2) = @_;
-
- my $Data1 = $NeededVMs->{$VMKey1};
- my $Data2 = $NeededVMs->{$VMKey2};
- return $Data1->[0] <=> $Data2->[0] || # Lower niceness jobs first
- $Data2->[1] <=> $Data1->[1] || # Hot VMs first
- $Data2->[2] <=> $Data1->[2]; # Needed by more tasks first
-}
-
-sub _HasMissingDependencies($$$)
-{
- my ($Sched, $NeededVMs, $VMKey) = @_;
-
- my $Data = $NeededVMs->{$VMKey};
- return undef if (!$Data->[3]);
-
- foreach my $DepVM (@{$Data->[3]})
- {
- return 1 if ($DepVM->Status !~ /^(?:reverting|sleeping|running)$/);
- }
- return undef;
-}
-
-my $NEXT_BASE = 1000;
-my $FUTURE_BASE = 2000;
-
-=pod
-=over 12
-
-=item C<_ScheduleTasks()>
-
-Runs the tasks on idle VMs, and builds a list of the VMs that will be needed
-next.
-
-=back
-=cut
-
-sub _ScheduleTasks($)
-{
- my ($Sched) = @_;
-
- # The set of VMs needed by the runnable, 'next step' and future tasks
- my $NeededVMs = {};
-
- # Process the jobs in decreasing priority order
- my $JobRank;
- my $Jobs = CreateJobs($Sched->{VMs});
- $Jobs->AddFilter("Status", ["queued", "running"]);
- foreach my $Job (sort CompareJobPriority @{$Jobs->GetItems()})
- {
- $JobRank++;
-
- # The per-step lists of VMs that should be getting ready to run
- # before we prepare the next step
- my %StepVMs = ("" => []); # no dependency for the first step
-
- # Process the steps in increasing $Step->No order for the inter-step
- # dependencies
- my $Steps = $Job->Steps;
- $Steps->AddFilter("Status", ["queued", "running"]);
- foreach my $Step (sort { $a->No <=> $b->No } @{$Steps->GetItems()})
- {
- my $StepRank;
- my $Previous = ""; # Avoid undefined values for hash indices
- if (!$Step->PreviousNo)
- {
- # The first step may need to get files from the staging area
- $Step->HandleStaging() if ($Step->Status eq "queued");
- $StepRank = 0;
- $StepVMs{$Step} = [];
- }
- else
- {
- $Previous = $Steps->GetItem($Step->PreviousNo);
- if ($Previous->Status eq "completed")
- {
- # The previous step was successful so we can now run this one
- $StepRank = 0;
- $StepVMs{$Step} = [];
- }
- elsif ($StepVMs{$Previous})
- {
- # The previous step is almost done. Prepare this one.
- $StepRank = 1;
- }
- else
- {
- # The previous step is nowhere near done
- $StepRank = 2;
- }
- }
-
- my $Tasks = $Step->Tasks;
- $Tasks->AddFilter("Status", ["queued"]);
- foreach my $Task (@{$Tasks->GetItems()})
- {
- my $VM = $Task->VM;
- if (!$VM->HasEnabledRole() or !$VM->HasEnabledStatus())
- {
- $Sched->{blocked}++;
- next;
- }
- my $Host = _GetSchedHost($Sched, $VM);
- $Host->{queued}++;
- $Sched->{queued}++;
-
- if ($StepRank >= 2)
- {
- # The previous step is nowhere near done so skip this one for now
- next;
- }
- if ($StepRank == 1)
- {
- # Passing $StepVMs{$Previous} ensures this VM will be reverted
- # if and only if all of the previous step's tasks are about to run.
- # See _HasMissingDependencies().
- _AddNeededVM($NeededVMs, $VM, $NEXT_BASE + $JobRank,
- $StepVMs{$Previous});
- next;
- }
- $Sched->{runnable}++; # $StepRank == 0
-
- if (!_AddNeededVM($NeededVMs, $VM, $JobRank))
- {
- # This VM is in $NeededVMs already which means it is already
- # scheduled to be reverted for a task with a higher priority.
- # So this task won't be run before a while and thus there is
- # no point in preparing the next step.
- $StepVMs{$Step} = undef;
- next;
- }
-
- # It's not worth preparing the next step for tasks that take so long
- $StepVMs{$Step} = undef if ($Task->Timeout > $BuildTimeout);
-
- my $VMKey = $VM->GetKey();
- if ($VM->Status eq "idle")
- {
- # Most of the time reverting a VM takes longer than running a task.
- # So if a VM is ready (i.e. idle) we can start the first task we
- # find for it, even if we could revert another VM to run a higher
- # priority job.
- # Even if we cannot start the task right away this VM is not a
- # candidate for shutdown since it will be needed next.
- delete $Sched->{lambvms}->{$VMKey};
-
- # Dirty VMs are VMs that were running and have still not been
- # powered off. Sleeping VMs may be VMs that are booting.
- # So in both cases they may still be using CPU and I/O resources so
- # count them against the running VM limit.
- if ($Host->{sleeping} + $Host->{running} + $Host->{dirty} < $Host->{MaxRunningVMs} and
- ($Host->{reverting} == 0 or
- $Host->{reverting} <= $Host->{MaxRevertsWhileRunningVMs}) and
- _CanScheduleOnVM($Sched, $VM))
- {
- $Sched->{busyvms}->{$VMKey} = 1;
- $VM->RecordStatus($Sched->{records}, join(" ", "running", $Job->Id, $Step->No, $Task->No));
- my $ErrMessage = $Task->Run($Step);
- return ($ErrMessage, undef) if (defined $ErrMessage);
-
- $Job->UpdateStatus();
- $Host->{idle}--;
- $Host->{running}++;
- }
- }
- elsif ($VM->Status =~ /^(?:reverting|sleeping)$/)
- {
- # The VM is not running jobs yet but soon will be so it is not a
- # candidate for shutdown or sacrifices.
- delete $Sched->{lambvms}->{$VMKey};
- }
- elsif ($VM->Status ne "off" and !$Sched->{lambvms}->{$VMKey})
- {
- # We cannot use the VM because it is busy (running another task,
- # offline, etc.). So it is too early to prepare the next step.
- $StepVMs{$Step} = undef;
- }
- push @{$StepVMs{$Step}}, $VM if ($StepVMs{$Step});
- }
- }
- }
-
- # Finally add some VMs with a very low priority for future jobs.
- foreach my $VM (@{$Sched->{VMs}->GetItems()})
- {
- next if (!$VM->HasEnabledRole() or !$VM->HasEnabledStatus());
- my $VMKey = $VM->GetKey();
- my $Niceness = $FUTURE_BASE + $Sched->{nicefuture}->{$VMKey};
- _AddNeededVM($NeededVMs, $VM, $Niceness);
- }
-
- return (undef, $NeededVMs);
-}
-
-=pod
-=over 12
-
-=item C<_SacrificeVM()>
-
-Looks for and powers off a VM we don't need now in order to free resources
-for one we do need now.
-
-This is a helper for _RevertVMs().
-
-=back
-=cut
-
-sub _SacrificeVM($$$)
-{
- my ($Sched, $NeededVMs, $VM) =@_;
- my $VMKey = $VM->GetKey();
- my $Host = _GetSchedHost($Sched, $VM);
-
- # Grab the lowest priority lamb and sacrifice it
- my $ForFutureVM = (_GetNiceness($NeededVMs, $VMKey) >= $FUTURE_BASE);
- my $NiceFuture = $Sched->{nicefuture};
- my ($Victim, $VictimKey, $VictimStatusPrio);
- foreach my $CandidateKey (keys %{$Sched->{lambvms}})
- {
- my $Candidate = $Sched->{VMs}->GetItem($CandidateKey);
-
- # Check that the candidate is on the right host
- my $CandidateHost = _GetSchedHost($Sched, $Candidate);
- next if ($CandidateHost != $Host);
-
- # Don't sacrifice idle / sleeping VMs for future tasks
- next if ($ForFutureVM and $Candidate->Status =~ /^(?:idle|sleeping)/);
-
- # Don't sacrifice more important VMs
- next if (_CompareNeededVMs($NeededVMs, $CandidateKey, $VMKey) <= 0);
-
- my $CandidateStatusPrio = $Candidate->Status eq "idle" ? 2 :
- $Candidate->Status eq "sleeping" ? 1 :
- 0; # Status eq dirty
- if ($Victim)
- {
- my $Cmp = $VictimStatusPrio <=> $CandidateStatusPrio ||
- $NiceFuture->{$CandidateKey} <=> $NiceFuture->{$VictimKey};
- next if ($Cmp <= 0);
- }
-
- $Victim = $Candidate;
- $VictimKey = $CandidateKey;
- $VictimStatusPrio = $CandidateStatusPrio;
- }
- return undef if (!$Victim);
-
- delete $Sched->{lambvms}->{$VictimKey};
- $Sched->{busyvms}->{$VictimKey} = 1;
- $Host->{$Victim->Status}--;
- $Host->{dirty}++;
- $Victim->RecordStatus($Sched->{records}, $Victim->Status eq "dirty" ? "dirty poweroff" : "dirty sacrifice");
- $Victim->RunPowerOff();
- return 1;
-}
-
-sub _DumpHostCounters($$)
-{
- my ($Sched, $VM) = @_;
- my $Host = _GetSchedHost($Sched, $VM);
- return if ($Host->{dumpedcounters});
-
- my $Counters = "";
- if ($Host->{active})
- {
- $Counters .= " active=$Host->{active}/$Host->{MaxActiveVMs}";
- }
- if ($Host->{idle})
- {
- $Counters .= " idle=$Host->{idle}". ($Host->{queued} ? "" : "/$Host->{MaxVMsWhenIdle}");
- }
- if ($Host->{reverting})
- {
- $Counters .= " reverting=$Host->{reverting}/". _GetMaxReverts($Host);
- }
- for my $Counter ("sleeping", "running", "dirty", "queued")
- {
- $Counters .= " $Counter=$Host->{$Counter}" if ($Host->{$Counter});
- }
- my $HostKey = $VM->GetHost();
- my $PrettyHost = ($PrettyHostNames ? $PrettyHostNames->{$HostKey} : "") ||
- $HostKey;
- require WineTestBot::Log;
- WineTestBot::Log::LogMsg("$PrettyHost:$Counters\n") if ($Counters);
-
- $Host->{dumpedcounters} = 1;
-}
-
-sub _DumpHostVMs($$$$)
-{
- my ($Sched, $VM, $SortedNeededVMs, $NeededVMs) = @_;
- my $Host = _GetSchedHost($Sched, $VM);
- return if ($Host->{dumpedvms});
-
- _DumpHostCounters($Sched, $VM);
-
- my @VMInfo;
- my $HostKey = $VM->GetHost();
- foreach my $VMKey (@$SortedNeededVMs)
- {
- $VM = $Sched->{VMs}->GetItem($VMKey);
- next if ($VM->GetHost() ne $HostKey);
-
- my $NeededVM = $NeededVMs->{$VMKey};
- my $Dep = "";
- if ($NeededVM->[3])
- {
- foreach my $DepVM (@{$NeededVM->[3]})
- {
- if ($DepVM->Status !~ /^(?:reverting|sleeping|running)$/)
- {
- $Dep = ":". $DepVM->Name;
- last;
- }
- }
- $Dep .= "/". scalar(@{$NeededVM->[3]});
- }
- push @VMInfo, join(":", "$VMKey(". $VM->Status ."$Dep)",
- $NeededVM->[0], $NeededVM->[1], $NeededVM->[2]);
- }
- my $PrettyHost = ($PrettyHostNames ? $PrettyHostNames->{$HostKey} : "") ||
- $HostKey;
- require WineTestBot::Log;
- WineTestBot::Log::LogMsg("$PrettyHost: @VMInfo\n");
-
- $Host->{dumpedvms} = 1;
-}
-
-sub _RevertVMs($$)
-{
- my ($Sched, $NeededVMs) = @_;
-
- # Sort the VMs that tasks need by decreasing priority order and revert them
- my @SortedNeededVMs = sort { _CompareNeededVMs($NeededVMs, $a, $b) } keys %{$NeededVMs};
- foreach my $VMKey (@SortedNeededVMs)
- {
- my $VM = $Sched->{VMs}->GetItem($VMKey);
- my $VMStatus = $VM->Status;
- next if ($VMStatus eq "idle");
-
- # Check if the host has reached its reverting VMs limit
- my $Host = _GetSchedHost($Sched, $VM);
- next if ($Host->{reverting} >= _GetMaxReverts($Host));
- _DumpHostCounters($Sched, $VM);
-
- # Skip this VM if the previous step's tasks are not about to run yet
- next if (_HasMissingDependencies($Sched, $NeededVMs, $VMKey));
-
- # Don't steal the hypervisor domain for a VM we will only need later
- my $Steal = (_GetNiceness($NeededVMs, $VMKey) < $NEXT_BASE);
- next if (!_CanScheduleOnVM($Sched, $VM, $Steal));
-
- my $NeedsSacrifice;
- if (_GetNiceness($NeededVMs, $VMKey) >= $FUTURE_BASE)
- {
- # Only start preparing VMs for future jobs on a host which is idle, i.e.
- # which no longer has queued tasks (ignoring blocked ones).
- # Note that during regular operation we get dirty VMs before they are
- # assigned a process to shut them down. This makes it possible to pick
- # the best future VM while we still know which VM is hot.
- # In constrast on startup the dirty VMs all have processes checking their
- # status, hence the dirtychild check to ensure we are not prevented from
- # preparing the best VM (e.g. build): it delays preparing the future VMs
- # until either there are no dirty VM or a VM got prepared for a task
- # which means the host is not idle.
- if ($Host->{queued} != 0 or $Host->{MaxVMsWhenIdle} == 0 or
- ($Host->{active} and $Host->{active} == $Host->{dirtychild}))
- {
- # The TestBot is busy or does not prepare VMs when idle
- next;
- }
- # To not exceed the limit we must take into account VMs that are not yet
- # idle but will soon be.
- my $FutureIdle = $Host->{idle} + $Host->{reverting} + $Host->{sleeping} + ($VMStatus eq "off" ? 1 : 0);
- $NeedsSacrifice = ($FutureIdle > $Host->{MaxVMsWhenIdle});
- }
- else
- {
- my $FutureActive = $Host->{active} + ($VMStatus eq "off" ? 1 : 0);
- $NeedsSacrifice = ($FutureActive > $Host->{MaxActiveVMs});
- }
-
- _DumpHostVMs($Sched, $VM, \@SortedNeededVMs, $NeededVMs);
- if ($NeedsSacrifice)
- {
- # Find an active VM to sacrifice so we can revert this VM in the next
- # scheduler round
- last if (!_SacrificeVM($Sched, $NeededVMs, $VM));
- delete $Sched->{lambvms}->{$VMKey};
- # The $Host counters must account for the coming revert. This means
- # active is unchanged: -1 for the sacrificed VM and +1 for the revert.
- $Host->{reverting}++;
- }
- else
- {
- delete $Sched->{lambvms}->{$VMKey};
- $Sched->{busyvms}->{$VMKey} = 1;
- my $ErrMessage = $VM->RunRevert();
- return $ErrMessage if (defined $ErrMessage);
- $Host->{active}++ if ($VMStatus eq "off");
- $Host->{reverting}++;
- }
- }
- return undef;
-}
-
-sub _PowerOffDirtyVMs($)
-{
- my ($Sched) = @_;
-
- # Power off any still dirty VM
- foreach my $VMKey (keys %{$Sched->{lambvms}})
- {
- my $VM = $Sched->{VMs}->GetItem($VMKey);
- next if ($VM->Status ne "dirty");
- next if (!_CanScheduleOnVM($Sched, $VM));
-
- $VM->RecordStatus($Sched->{records}, "dirty poweroff");
- my $ErrMessage = $VM->RunPowerOff();
- return $ErrMessage if (defined $ErrMessage);
- }
- return undef;
-}
-
-my $_LastTaskCounts = "";
-
-=pod
-=over 12
-
-=item C<ScheduleJobs()>
-
-Goes through the pending Jobs to run their queued Tasks. This implies preparing
-the VMs while staying within the VM hosts resource limits. In particular this
-means taking the following constraints into account:
-
-=over
-
-=item *
-
-Jobs should be run in decreasing order of priority.
-
-=item *
-
-A Job's Steps must be run in sequential order.
-
-=item *
-
-A Step's tasks can be run in parallel but only one task can be running in a VM
-at a given time. Also a VM must be prepared before it can run its task, see the
-VM Statuses.
-
-=item *
-
-The number of active VMs on the host must be kept under $MaxActiveVMs. Any
-VM using resources counts as an active VM, including those that are being
-reverted. This limit is meant to ensure the VM host will have enough memory,
-CPU or I/O resources for all the active VMs. Also note that this limit must be
-respected even if there is more than one hypervisor running on the host.
-
-=item *
-
-The number of VMs being reverted on the host at a given time must be kept under
-$MaxRevertingVMs, or $MaxRevertsWhileRunningVMs if some VMs are currently
-running tests. This may be set to 1 in case the hypervisor gets confused when
-reverting too many VMs at once.
-
-=item *
-
-Once there are no jobs to run anymore the scheduler can prepare up to
-$MaxVMsWhenIdle VMs (or $MaxActiveVMs if not set) for future jobs.
-This can be set to 0 to minimize the TestBot resource usage when idle.
-This can also be set to a value greater than $MaxActiveVMs. Then only
-$MaxActiveVMs tasks will be run simultaneously but the extra idle VMs will be
-kept on standby so they are ready when their turn comes.
-
-=back
-
-=back
-=cut
-
-sub ScheduleJobs()
-{
- my ($ErrMessage, $Sched) = _CheckAndClassifyVMs();
- return $ErrMessage if ($ErrMessage);
-
- my $NeededVMs;
- ($ErrMessage, $NeededVMs) = _ScheduleTasks($Sched);
- return $ErrMessage if ($ErrMessage);
-
- $ErrMessage = _RevertVMs($Sched, $NeededVMs);
- return $ErrMessage if ($ErrMessage);
-
- $ErrMessage = _PowerOffDirtyVMs($Sched);
- return $ErrMessage if ($ErrMessage);
-
- # Note that any VM Status or Role change will trigger ScheduleJobs() so this
- # records all not yet recorded VM state changes, even those not initiated by
- # the scheduler.
- map { $_->RecordStatus($Sched->{records}) } @{$Sched->{VMs}->GetItems()};
-
- if (@{$Sched->{records}->GetItems()})
- {
- my $TaskCounts = "$Sched->{runnable} $Sched->{queued} $Sched->{blocked}";
- if ($TaskCounts ne $_LastTaskCounts)
- {
- $Sched->{records}->AddRecord('tasks', 'counters', $TaskCounts);
- $_LastTaskCounts = $TaskCounts;
- }
- $Sched->{recordgroups}->Save();
- }
- else
- {
- $Sched->{recordgroups}->DeleteItem($Sched->{recordgroup});
- }
-
- return undef;
-}
-
sub FilterNotArchived($)
{
my ($self) = @_;
--
2.17.0
1
0
[v3 PATCH] user32/menu: Return locked menu data when looking for menu items.
by Nikolay Sivov 08 May '18
by Nikolay Sivov 08 May '18
08 May '18
Signed-off-by: Nikolay Sivov <nsivov(a)codeweavers.com>
---
v3: changed helper prototype, it's closer to what we currently have. All structure
members are out-only now.
dlls/user32/menu.c | 550 +++++++++++++++++++++++++++------------------
1 file changed, 337 insertions(+), 213 deletions(-)
diff --git a/dlls/user32/menu.c b/dlls/user32/menu.c
index 537c2ebe1a..8a50067063 100644
--- a/dlls/user32/menu.c
+++ b/dlls/user32/menu.c
@@ -584,26 +584,39 @@ static UINT MENU_GetStartOfPrevColumn(
return i;
}
-
+struct menu_item_desc
+{
+ MENUITEM *item;
+ POPUPMENU *menu;
+ UINT pos;
+};
/***********************************************************************
* MENU_FindItem
- *
- * Find a menu item. Return a pointer on the item, and modifies *hmenu
- * in case the item was in a sub-menu.
*/
-static MENUITEM *MENU_FindItem( HMENU *hmenu, UINT *nPos, UINT wFlags )
+static BOOL MENU_FindItem(HMENU hmenu, UINT id, UINT flags, struct menu_item_desc *desc)
{
+ UINT fallback_pos = ~0u, i;
POPUPMENU *menu;
- MENUITEM *fallback = NULL;
- UINT fallback_pos = 0;
- UINT i;
- if ((*hmenu == (HMENU)0xffff) || (!(menu = MENU_GetMenu(*hmenu)))) return NULL;
- if (wFlags & MF_BYPOSITION)
+ memset(desc, 0, sizeof(*desc));
+
+ menu = grab_menu_ptr(hmenu);
+ if (!menu)
+ return FALSE;
+
+ if (flags & MF_BYPOSITION)
{
- if (*nPos >= menu->nItems) return NULL;
- return &menu->items[*nPos];
+ if (id >= menu->nItems)
+ {
+ release_menu_ptr(menu);
+ return FALSE;
+ }
+
+ desc->menu = menu;
+ desc->item = &menu->items[id];
+ desc->pos = id;
+ return TRUE;
}
else
{
@@ -612,32 +625,37 @@ static MENUITEM *MENU_FindItem( HMENU *hmenu, UINT *nPos, UINT wFlags )
{
if (item->fType & MF_POPUP)
{
- HMENU hsubmenu = item->hSubMenu;
- MENUITEM *subitem = MENU_FindItem( &hsubmenu, nPos, wFlags );
- if (subitem)
- {
- *hmenu = hsubmenu;
- return subitem;
- }
- else if (item->wID == *nPos)
+ if (MENU_FindItem(item->hSubMenu, id, flags, desc))
+ {
+ release_menu_ptr(menu);
+ return TRUE;
+ }
+ else if (item->wID == id)
{
/* fallback to this item if nothing else found */
fallback_pos = i;
- fallback = item;
}
}
- else if (item->wID == *nPos)
+ else if (item->wID == id)
{
- *nPos = i;
- return item;
+ desc->menu = menu;
+ desc->item = item;
+ desc->pos = i;
+ return TRUE;
}
}
}
- if (fallback)
- *nPos = fallback_pos;
+ if (fallback_pos != ~0u)
+ {
+ desc->menu = menu;
+ desc->item = &menu->items[fallback_pos];
+ desc->pos = fallback_pos;
+ }
+ else
+ release_menu_ptr(menu);
- return fallback;
+ return fallback_pos != ~0u;
}
/***********************************************************************
@@ -2135,28 +2153,34 @@ static void MENU_MoveSelection( HWND hwndOwner, HMENU hmenu, INT offset )
*
* Insert (allocate) a new item into a menu.
*/
-static MENUITEM *MENU_InsertItem( HMENU hMenu, UINT pos, UINT flags )
+static BOOL MENU_InsertItem(HMENU hMenu, UINT id, UINT flags, struct menu_item_desc *desc)
{
+ UINT pos = id;
MENUITEM *newItems;
POPUPMENU *menu;
- if (!(menu = MENU_GetMenu(hMenu)))
- return NULL;
+ memset(desc, 0, sizeof(*desc));
/* Find where to insert new item */
-
if (flags & MF_BYPOSITION) {
- if (pos > menu->nItems)
+ menu = grab_menu_ptr(hMenu);
+ if (id > menu->nItems)
pos = menu->nItems;
} else {
- if (!MENU_FindItem( &hMenu, &pos, flags ))
+ struct menu_item_desc item_desc;
+
+ if (!MENU_FindItem(hMenu, id, flags, &item_desc))
+ {
+ menu = grab_menu_ptr(hMenu);
pos = menu->nItems;
- else {
- if (!(menu = MENU_GetMenu( hMenu )))
- return NULL;
}
+ else
+ menu = item_desc.menu;
}
+ if (!menu)
+ return FALSE;
+
/* Make sure that MDI system buttons stay on the right side.
* Note: XP treats only bitmap handles 1 - 6 as "magic" ones
* regardless of their id.
@@ -2172,8 +2196,9 @@ static MENUITEM *MENU_InsertItem( HMENU hMenu, UINT pos, UINT flags )
newItems = HeapAlloc( GetProcessHeap(), 0, sizeof(MENUITEM) * (menu->nItems+1) );
if (!newItems)
{
+ release_menu_ptr(menu);
WARN("allocation failed\n" );
- return NULL;
+ return FALSE;
}
if (menu->nItems > 0)
{
@@ -2187,7 +2212,12 @@ static MENUITEM *MENU_InsertItem( HMENU hMenu, UINT pos, UINT flags )
menu->nItems++;
memset( &newItems[pos], 0, sizeof(*newItems) );
menu->Height = 0; /* force size recalculate */
- return &newItems[pos];
+
+ desc->menu = menu;
+ desc->pos = pos;
+ desc->item = &newItems[pos];
+
+ return TRUE;
}
@@ -3706,13 +3736,14 @@ BOOL WINAPI ChangeMenuW( HMENU hMenu, UINT pos, LPCWSTR data,
*/
DWORD WINAPI CheckMenuItem( HMENU hMenu, UINT id, UINT flags )
{
- MENUITEM *item;
+ struct menu_item_desc item_desc;
DWORD ret;
- if (!(item = MENU_FindItem( &hMenu, &id, flags ))) return -1;
- ret = item->fState & MF_CHECKED;
- if (flags & MF_CHECKED) item->fState |= MF_CHECKED;
- else item->fState &= ~MF_CHECKED;
+ if (!MENU_FindItem(hMenu, id, flags, &item_desc)) return -1;
+ ret = item_desc.item->fState & MF_CHECKED;
+ if (flags & MF_CHECKED) item_desc.item->fState |= MF_CHECKED;
+ else item_desc.item->fState &= ~MF_CHECKED;
+ release_menu_ptr(item_desc.menu);
return ret;
}
@@ -3720,42 +3751,46 @@ DWORD WINAPI CheckMenuItem( HMENU hMenu, UINT id, UINT flags )
/**********************************************************************
* EnableMenuItem (USER32.@)
*/
-BOOL WINAPI EnableMenuItem( HMENU hMenu, UINT wItemID, UINT wFlags )
+BOOL WINAPI EnableMenuItem( HMENU hMenu, UINT id, UINT wFlags )
{
+ struct menu_item_desc item_desc;
UINT oldflags;
- MENUITEM *item;
- POPUPMENU *menu;
- TRACE("(%p, %04x, %04x) !\n", hMenu, wItemID, wFlags);
+ TRACE("(%p, %04x, %04x)\n", hMenu, id, wFlags);
/* Get the Popupmenu to access the owner menu */
- if (!(menu = MENU_GetMenu(hMenu)))
- return (UINT)-1;
-
- if (!(item = MENU_FindItem( &hMenu, &wItemID, wFlags )))
+ if (!MENU_FindItem(hMenu, id, wFlags, &item_desc))
return (UINT)-1;
- oldflags = item->fState & (MF_GRAYED | MF_DISABLED);
- item->fState ^= (oldflags ^ wFlags) & (MF_GRAYED | MF_DISABLED);
+ oldflags = item_desc.item->fState & (MF_GRAYED | MF_DISABLED);
+ item_desc.item->fState ^= (oldflags ^ wFlags) & (MF_GRAYED | MF_DISABLED);
/* If the close item in the system menu change update the close button */
- if((item->wID == SC_CLOSE) && (oldflags != wFlags))
+ if ((item_desc.item->wID == SC_CLOSE) && (oldflags != wFlags))
{
- if (menu->hSysMenuOwner != 0)
+ if (item_desc.menu->hSysMenuOwner)
{
RECT rc;
POPUPMENU* parentMenu;
+ HWND hwnd;
/* Get the parent menu to access*/
- if (!(parentMenu = MENU_GetMenu(menu->hSysMenuOwner)))
- return (UINT)-1;
+ parentMenu = grab_menu_ptr(item_desc.menu->hSysMenuOwner);
+ release_menu_ptr(item_desc.menu);
+ if (!parentMenu)
+ return (UINT)-1;
+
+ hwnd = parentMenu->hWnd;
+ release_menu_ptr(parentMenu);
/* Refresh the frame to reflect the change */
- WIN_GetRectangles( parentMenu->hWnd, COORDS_CLIENT, &rc, NULL );
+ WIN_GetRectangles( hwnd, COORDS_CLIENT, &rc, NULL );
rc.bottom = 0;
- RedrawWindow(parentMenu->hWnd, &rc, 0, RDW_FRAME | RDW_INVALIDATE | RDW_NOCHILDREN);
+ RedrawWindow(hwnd, &rc, 0, RDW_FRAME | RDW_INVALIDATE | RDW_NOCHILDREN);
}
}
+ else
+ release_menu_ptr(item_desc.menu);
return oldflags;
}
@@ -3770,21 +3805,33 @@ INT WINAPI GetMenuStringA(
LPSTR str, /* [out] outbuffer. If NULL, func returns entry length*/
INT nMaxSiz, /* [in] length of buffer. if 0, func returns entry len*/
UINT wFlags /* [in] MF_ flags */
-) {
- MENUITEM *item;
+)
+{
+ struct menu_item_desc item_desc;
+ INT ret;
TRACE("menu=%p item=%04x ptr=%p len=%d flags=%04x\n", hMenu, wItemID, str, nMaxSiz, wFlags );
if (str && nMaxSiz) str[0] = '\0';
- if (!(item = MENU_FindItem( &hMenu, &wItemID, wFlags ))) {
+
+ if (!MENU_FindItem(hMenu, wItemID, wFlags, &item_desc)) {
SetLastError( ERROR_MENU_ITEM_NOT_FOUND);
return 0;
}
- if (!item->text) return 0;
- if (!str || !nMaxSiz) return WideCharToMultiByte( CP_ACP, 0, item->text, -1, NULL, 0, NULL, NULL );
- if (!WideCharToMultiByte( CP_ACP, 0, item->text, -1, str, nMaxSiz, NULL, NULL ))
- str[nMaxSiz-1] = 0;
+
+ if (!item_desc.item->text)
+ ret = 0;
+ else if (!str || !nMaxSiz)
+ ret = WideCharToMultiByte( CP_ACP, 0, item_desc.item->text, -1, NULL, 0, NULL, NULL );
+ else
+ {
+ if (!WideCharToMultiByte( CP_ACP, 0, item_desc.item->text, -1, str, nMaxSiz, NULL, NULL ))
+ str[nMaxSiz-1] = 0;
+ ret = strlen(str);
+ }
+ release_menu_ptr(item_desc.menu);
+
TRACE("returning %s\n", debugstr_a(str));
- return strlen(str);
+ return ret;
}
@@ -3794,22 +3841,32 @@ INT WINAPI GetMenuStringA(
INT WINAPI GetMenuStringW( HMENU hMenu, UINT wItemID,
LPWSTR str, INT nMaxSiz, UINT wFlags )
{
- MENUITEM *item;
+ struct menu_item_desc item_desc;
+ INT ret;
TRACE("menu=%p item=%04x ptr=%p len=%d flags=%04x\n", hMenu, wItemID, str, nMaxSiz, wFlags );
if (str && nMaxSiz) str[0] = '\0';
- if (!(item = MENU_FindItem( &hMenu, &wItemID, wFlags ))) {
+
+ if (!MENU_FindItem(hMenu, wItemID, wFlags, &item_desc)) {
SetLastError( ERROR_MENU_ITEM_NOT_FOUND);
return 0;
}
- if (!str || !nMaxSiz) return item->text ? strlenW(item->text) : 0;
- if( !(item->text)) {
+ if (!str || !nMaxSiz)
+ ret = item_desc.item->text ? strlenW(item_desc.item->text) : 0;
+ else if (!item_desc.item->text)
+ {
str[0] = 0;
- return 0;
+ ret = 0;
}
- lstrcpynW( str, item->text, nMaxSiz );
+ else
+ {
+ lstrcpynW( str, item_desc.item->text, nMaxSiz );
+ ret = strlenW(str);
+ }
+ release_menu_ptr(item_desc.menu);
+
TRACE("returning %s\n", debugstr_w(str));
- return strlenW(str);
+ return ret;
}
@@ -3819,13 +3876,18 @@ INT WINAPI GetMenuStringW( HMENU hMenu, UINT wItemID,
BOOL WINAPI HiliteMenuItem( HWND hWnd, HMENU hMenu, UINT wItemID,
UINT wHilite )
{
- LPPOPUPMENU menu;
+ struct menu_item_desc item_desc;
+
TRACE("(%p, %p, %04x, %04x);\n", hWnd, hMenu, wItemID, wHilite);
- if (!MENU_FindItem( &hMenu, &wItemID, wHilite )) return FALSE;
- if (!(menu = MENU_GetMenu(hMenu))) return FALSE;
- if (menu->FocusedItem == wItemID) return TRUE;
- MENU_HideSubPopups( hWnd, hMenu, FALSE, 0 );
- MENU_SelectItem( hWnd, hMenu, wItemID, TRUE, 0 );
+
+ if (!MENU_FindItem(hMenu, wItemID, wHilite, &item_desc)) return FALSE;
+
+ if (item_desc.menu->FocusedItem != item_desc.pos)
+ {
+ MENU_HideSubPopups( hWnd, item_desc.menu->obj.handle, FALSE, 0 );
+ MENU_SelectItem( hWnd, item_desc.menu->obj.handle, item_desc.pos, TRUE, 0 );
+ }
+ release_menu_ptr(item_desc.menu);
return TRUE;
}
@@ -3835,23 +3897,31 @@ BOOL WINAPI HiliteMenuItem( HWND hWnd, HMENU hMenu, UINT wItemID,
*/
UINT WINAPI GetMenuState( HMENU hMenu, UINT wItemID, UINT wFlags )
{
- MENUITEM *item;
+ struct menu_item_desc item_desc;
+ UINT state;
+
TRACE("(menu=%p, id=%04x, flags=%04x);\n", hMenu, wItemID, wFlags);
- if (!(item = MENU_FindItem( &hMenu, &wItemID, wFlags ))) return -1;
- debug_print_menuitem (" item: ", item, "");
- if (item->fType & MF_POPUP)
+
+ if (!MENU_FindItem(hMenu, wItemID, wFlags, &item_desc)) return -1;
+ debug_print_menuitem (" item: ", item_desc.item, "");
+ if (item_desc.item->fType & MF_POPUP)
{
- POPUPMENU *menu = MENU_GetMenu( item->hSubMenu );
- if (!menu) return -1;
- else return (menu->nItems << 8) | ((item->fState|item->fType) & 0xff);
+ POPUPMENU *submenu = grab_menu_ptr(item_desc.item->hSubMenu);
+ if (submenu)
+ state = (submenu->nItems << 8) | ((item_desc.item->fState | item_desc.item->fType) & 0xff);
+ else
+ state = -1;
+ release_menu_ptr(submenu);
}
else
{
/* We used to (from way back then) mask the result to 0xff. */
/* I don't know why and it seems wrong as the documented */
/* return flag MF_SEPARATOR is outside that mask. */
- return (item->fType | item->fState);
+ state = (item_desc.item->fType | item_desc.item->fState);
}
+ release_menu_ptr(item_desc.menu);
+ return state;
}
@@ -3877,12 +3947,14 @@ INT WINAPI GetMenuItemCount( HMENU hMenu )
*/
UINT WINAPI GetMenuItemID( HMENU hMenu, INT nPos )
{
- MENUITEM * lpmi;
+ struct menu_item_desc item_desc;
+ UINT id;
- if (!(lpmi = MENU_FindItem(&hMenu,(UINT*)&nPos,MF_BYPOSITION))) return -1;
- if (lpmi->fType & MF_POPUP) return -1;
- return lpmi->wID;
+ if (!MENU_FindItem(hMenu, nPos, MF_BYPOSITION, &item_desc)) return -1;
+ id = item_desc.item->fType & MF_POPUP ? -1 : item_desc.item->wID;
+ release_menu_ptr(item_desc.menu);
+ return id;
}
@@ -3935,8 +4007,9 @@ static void MENU_mnu2mnuii( UINT flags, UINT_PTR id, LPCWSTR str,
BOOL WINAPI InsertMenuW( HMENU hMenu, UINT pos, UINT flags,
UINT_PTR id, LPCWSTR str )
{
- MENUITEM *item;
+ struct menu_item_desc item_desc;
MENUITEMINFOW mii;
+ BOOL ret;
if (IS_STRING_ITEM(flags) && str)
TRACE("hMenu %p, pos %d, flags %08x, id %04lx, str %s\n",
@@ -3944,16 +4017,17 @@ BOOL WINAPI InsertMenuW( HMENU hMenu, UINT pos, UINT flags,
else TRACE("hMenu %p, pos %d, flags %08x, id %04lx, str %p (not a string)\n",
hMenu, pos, flags, id, str );
- if (!(item = MENU_InsertItem( hMenu, pos, flags ))) return FALSE;
+ if (!MENU_InsertItem(hMenu, pos, flags, &item_desc)) return FALSE;
MENU_mnu2mnuii( flags, id, str, &mii);
- if (!(SetMenuItemInfo_common( item, &mii, TRUE)))
- {
+
+ ret = SetMenuItemInfo_common( item_desc.item, &mii, TRUE);
+ if (ret)
+ item_desc.item->hCheckBit = item_desc.item->hUnCheckBit = 0;
+ else
RemoveMenu( hMenu, pos, flags );
- return FALSE;
- }
+ release_menu_ptr(item_desc.menu);
- item->hCheckBit = item->hUnCheckBit = 0;
- return TRUE;
+ return ret;
}
@@ -4006,35 +4080,37 @@ BOOL WINAPI AppendMenuW( HMENU hMenu, UINT flags,
*/
BOOL WINAPI RemoveMenu( HMENU hMenu, UINT nPos, UINT wFlags )
{
- LPPOPUPMENU menu;
- MENUITEM *item;
+ struct menu_item_desc item_desc;
TRACE("(menu=%p pos=%04x flags=%04x)\n",hMenu, nPos, wFlags);
- if (!(item = MENU_FindItem( &hMenu, &nPos, wFlags ))) return FALSE;
- if (!(menu = MENU_GetMenu(hMenu))) return FALSE;
- /* Remove item */
+ if (!MENU_FindItem(hMenu, nPos, wFlags, &item_desc))
+ return FALSE;
- MENU_FreeItemData( item );
+ /* Remove item */
+ MENU_FreeItemData( item_desc.item );
- if (--menu->nItems == 0)
+ if (--item_desc.menu->nItems == 0)
{
- HeapFree( GetProcessHeap(), 0, menu->items );
- menu->items = NULL;
+ HeapFree( GetProcessHeap(), 0, item_desc.menu->items );
+ item_desc.menu->items = NULL;
}
else
{
- MENUITEM *new_items;
- while(nPos < menu->nItems)
+ MENUITEM *new_items, *item = item_desc.item;
+
+ while (nPos < item_desc.menu->nItems)
{
*item = *(item+1);
item++;
nPos++;
}
- new_items = HeapReAlloc( GetProcessHeap(), 0, menu->items,
- menu->nItems * sizeof(MENUITEM) );
- if (new_items) menu->items = new_items;
+ new_items = HeapReAlloc( GetProcessHeap(), 0, item_desc.menu->items,
+ item_desc.menu->nItems * sizeof(MENUITEM) );
+ if (new_items) item_desc.menu->items = new_items;
}
+ release_menu_ptr(item_desc.menu);
+
return TRUE;
}
@@ -4044,11 +4120,17 @@ BOOL WINAPI RemoveMenu( HMENU hMenu, UINT nPos, UINT wFlags )
*/
BOOL WINAPI DeleteMenu( HMENU hMenu, UINT nPos, UINT wFlags )
{
- MENUITEM *item = MENU_FindItem( &hMenu, &nPos, wFlags );
- if (!item) return FALSE;
- if (item->fType & MF_POPUP) DestroyMenu( item->hSubMenu );
- /* nPos is now the position of the item */
- RemoveMenu( hMenu, nPos, wFlags | MF_BYPOSITION );
+ struct menu_item_desc item_desc;
+
+ if (!MENU_FindItem(hMenu, nPos, wFlags, &item_desc))
+ return FALSE;
+
+ if (item_desc.item->fType & MF_POPUP)
+ DestroyMenu(item_desc.item->hSubMenu);
+
+ /* nPos is now the position of the item */
+ RemoveMenu(item_desc.menu->obj.handle, item_desc.pos, wFlags | MF_BYPOSITION);
+ release_menu_ptr(item_desc.menu);
return TRUE;
}
@@ -4059,23 +4141,26 @@ BOOL WINAPI DeleteMenu( HMENU hMenu, UINT nPos, UINT wFlags )
BOOL WINAPI ModifyMenuW( HMENU hMenu, UINT pos, UINT flags,
UINT_PTR id, LPCWSTR str )
{
- MENUITEM *item;
+ struct menu_item_desc item_desc;
MENUITEMINFOW mii;
+ BOOL ret;
if (IS_STRING_ITEM(flags))
TRACE("%p %d %04x %04lx %s\n", hMenu, pos, flags, id, debugstr_w(str) );
else
TRACE("%p %d %04x %04lx %p\n", hMenu, pos, flags, id, str );
- if (!(item = MENU_FindItem( &hMenu, &pos, flags )))
+ if (!MENU_FindItem(hMenu, pos, flags, &item_desc))
{
/* workaround for Word 95: pretend that SC_TASKLIST item exists */
if (pos == SC_TASKLIST && !(flags & MF_BYPOSITION)) return TRUE;
return FALSE;
}
- MENU_GetMenu(hMenu)->Height = 0; /* force size recalculate */
+ item_desc.menu->Height = 0; /* force size recalculate */
MENU_mnu2mnuii( flags, id, str, &mii);
- return SetMenuItemInfo_common( item, &mii, TRUE);
+ ret = SetMenuItemInfo_common(item_desc.item, &mii, TRUE);
+ release_menu_ptr(item_desc.menu);
+ return ret;
}
@@ -4134,20 +4219,22 @@ DWORD WINAPI GetMenuCheckMarkDimensions(void)
BOOL WINAPI SetMenuItemBitmaps( HMENU hMenu, UINT nPos, UINT wFlags,
HBITMAP hNewUnCheck, HBITMAP hNewCheck)
{
- MENUITEM *item;
+ struct menu_item_desc item_desc;
- if (!(item = MENU_FindItem( &hMenu, &nPos, wFlags ))) return FALSE;
+ if (!MENU_FindItem(hMenu, nPos, wFlags, &item_desc)) return FALSE;
if (!hNewCheck && !hNewUnCheck)
{
- item->fState &= ~MF_USECHECKBITMAPS;
+ item_desc.item->fState &= ~MF_USECHECKBITMAPS;
}
else /* Install new bitmaps */
{
- item->hCheckBit = hNewCheck;
- item->hUnCheckBit = hNewUnCheck;
- item->fState |= MF_USECHECKBITMAPS;
+ item_desc.item->hCheckBit = hNewCheck;
+ item_desc.item->hUnCheckBit = hNewUnCheck;
+ item_desc.item->fState |= MF_USECHECKBITMAPS;
}
+ release_menu_ptr(item_desc.menu);
+
return TRUE;
}
@@ -4418,11 +4505,18 @@ BOOL WINAPI SetMenu( HWND hWnd, HMENU hMenu )
*/
HMENU WINAPI GetSubMenu( HMENU hMenu, INT nPos )
{
- MENUITEM * lpmi;
+ struct menu_item_desc item_desc;
+ HMENU submenu;
+
+ if (!MENU_FindItem(hMenu, nPos, MF_BYPOSITION, &item_desc)) return 0;
+
+ if (item_desc.item->fType & MF_POPUP)
+ submenu = item_desc.item->hSubMenu;
+ else
+ submenu = 0;
- if (!(lpmi = MENU_FindItem(&hMenu,(UINT*)&nPos,MF_BYPOSITION))) return 0;
- if (!(lpmi->fType & MF_POPUP)) return 0;
- return lpmi->hSubMenu;
+ release_menu_ptr(item_desc.menu);
+ return submenu;
}
@@ -4634,28 +4728,32 @@ BOOL WINAPI IsMenu(HMENU hmenu)
static BOOL GetMenuItemInfo_common ( HMENU hmenu, UINT item, BOOL bypos,
LPMENUITEMINFOW lpmii, BOOL unicode)
{
- MENUITEM *menu = MENU_FindItem (&hmenu, &item, bypos ? MF_BYPOSITION : 0);
+ struct menu_item_desc item_desc;
- debug_print_menuitem("GetMenuItemInfo_common: ", menu, "");
+ MENU_FindItem(hmenu, item, bypos ? MF_BYPOSITION : 0, &item_desc);
- if (!menu) {
+ debug_print_menuitem("GetMenuItemInfo_common: ", item_desc.item, "");
+
+ if (!item_desc.item)
+ {
SetLastError( ERROR_MENU_ITEM_NOT_FOUND);
return FALSE;
}
if( lpmii->fMask & MIIM_TYPE) {
if( lpmii->fMask & ( MIIM_STRING | MIIM_FTYPE | MIIM_BITMAP)) {
+ release_menu_ptr(item_desc.menu);
WARN("invalid combination of fMask bits used\n");
/* this does not happen on Win9x/ME */
SetLastError( ERROR_INVALID_PARAMETER);
return FALSE;
}
- lpmii->fType = menu->fType & MENUITEMINFO_TYPE_MASK;
- if (menu->hbmpItem && !IS_MAGIC_BITMAP(menu->hbmpItem))
+ lpmii->fType = item_desc.item->fType & MENUITEMINFO_TYPE_MASK;
+ if (item_desc.item->hbmpItem && !IS_MAGIC_BITMAP(item_desc.item->hbmpItem))
lpmii->fType |= MFT_BITMAP;
- lpmii->hbmpItem = menu->hbmpItem; /* not on Win9x/ME */
+ lpmii->hbmpItem = item_desc.item->hbmpItem; /* not on Win9x/ME */
if( lpmii->fType & MFT_BITMAP) {
- lpmii->dwTypeData = (LPWSTR) menu->hbmpItem;
+ lpmii->dwTypeData = (LPWSTR) item_desc.item->hbmpItem;
lpmii->cch = 0;
} else if( lpmii->fType & (MFT_OWNERDRAW | MFT_SEPARATOR)) {
/* this does not happen on Win9x/ME */
@@ -4666,7 +4764,7 @@ static BOOL GetMenuItemInfo_common ( HMENU hmenu, UINT item, BOOL bypos,
/* copy the text string */
if ((lpmii->fMask & (MIIM_TYPE|MIIM_STRING))) {
- if( !menu->text ) {
+ if (!item_desc.item->text) {
if(lpmii->dwTypeData && lpmii->cch) {
if( unicode)
*((WCHAR *)lpmii->dwTypeData) = 0;
@@ -4678,16 +4776,16 @@ static BOOL GetMenuItemInfo_common ( HMENU hmenu, UINT item, BOOL bypos,
int len;
if (unicode)
{
- len = strlenW(menu->text);
+ len = strlenW(item_desc.item->text);
if(lpmii->dwTypeData && lpmii->cch)
- lstrcpynW(lpmii->dwTypeData, menu->text, lpmii->cch);
+ lstrcpynW(lpmii->dwTypeData, item_desc.item->text, lpmii->cch);
}
else
{
- len = WideCharToMultiByte( CP_ACP, 0, menu->text, -1, NULL,
+ len = WideCharToMultiByte( CP_ACP, 0, item_desc.item->text, -1, NULL,
0, NULL, NULL ) - 1;
if(lpmii->dwTypeData && lpmii->cch)
- if (!WideCharToMultiByte( CP_ACP, 0, menu->text, -1,
+ if (!WideCharToMultiByte( CP_ACP, 0, item_desc.item->text, -1,
(LPSTR)lpmii->dwTypeData, lpmii->cch, NULL, NULL ))
((LPSTR)lpmii->dwTypeData)[lpmii->cch - 1] = 0;
}
@@ -4706,19 +4804,19 @@ static BOOL GetMenuItemInfo_common ( HMENU hmenu, UINT item, BOOL bypos,
}
if (lpmii->fMask & MIIM_FTYPE)
- lpmii->fType = menu->fType & MENUITEMINFO_TYPE_MASK;
+ lpmii->fType = item_desc.item->fType & MENUITEMINFO_TYPE_MASK;
if (lpmii->fMask & MIIM_BITMAP)
- lpmii->hbmpItem = menu->hbmpItem;
+ lpmii->hbmpItem = item_desc.item->hbmpItem;
if (lpmii->fMask & MIIM_STATE)
- lpmii->fState = menu->fState & MENUITEMINFO_STATE_MASK;
+ lpmii->fState = item_desc.item->fState & MENUITEMINFO_STATE_MASK;
if (lpmii->fMask & MIIM_ID)
- lpmii->wID = menu->wID;
+ lpmii->wID = item_desc.item->wID;
if (lpmii->fMask & MIIM_SUBMENU)
- lpmii->hSubMenu = menu->hSubMenu;
+ lpmii->hSubMenu = item_desc.item->hSubMenu;
else {
/* hSubMenu is always cleared
* (not on Win9x/ME ) */
@@ -4726,13 +4824,14 @@ static BOOL GetMenuItemInfo_common ( HMENU hmenu, UINT item, BOOL bypos,
}
if (lpmii->fMask & MIIM_CHECKMARKS) {
- lpmii->hbmpChecked = menu->hCheckBit;
- lpmii->hbmpUnchecked = menu->hUnCheckBit;
+ lpmii->hbmpChecked = item_desc.item->hCheckBit;
+ lpmii->hbmpUnchecked = item_desc.item->hUnCheckBit;
}
if (lpmii->fMask & MIIM_DATA)
- lpmii->dwItemData = menu->dwItemData;
+ lpmii->dwItemData = item_desc.item->dwItemData;
- return TRUE;
+ release_menu_ptr(item_desc.menu);
+ return TRUE;
}
/**********************************************************************
@@ -4949,20 +5048,23 @@ static BOOL MENU_NormalizeMenuItemInfoStruct( const MENUITEMINFOW *pmii_in,
BOOL WINAPI SetMenuItemInfoA(HMENU hmenu, UINT item, BOOL bypos,
const MENUITEMINFOA *lpmii)
{
- MENUITEM *menuitem;
+ struct menu_item_desc item_desc;
MENUITEMINFOW mii;
+ BOOL ret;
TRACE("hmenu %p, item %u, by pos %d, info %p\n", hmenu, item, bypos, lpmii);
if (!MENU_NormalizeMenuItemInfoStruct( (const MENUITEMINFOW *)lpmii, &mii )) return FALSE;
- if (!(menuitem = MENU_FindItem( &hmenu, &item, bypos? MF_BYPOSITION : 0 )))
+ if (!MENU_FindItem(hmenu, item, bypos ? MF_BYPOSITION : 0, &item_desc))
{
/* workaround for Word 95: pretend that SC_TASKLIST item exists */
if (item == SC_TASKLIST && !bypos) return TRUE;
return FALSE;
}
- return SetMenuItemInfo_common( menuitem, &mii, FALSE );
+ ret = SetMenuItemInfo_common(item_desc.item, &mii, FALSE);
+ release_menu_ptr(item_desc.menu);
+ return ret;
}
/**********************************************************************
@@ -4971,19 +5073,24 @@ BOOL WINAPI SetMenuItemInfoA(HMENU hmenu, UINT item, BOOL bypos,
BOOL WINAPI SetMenuItemInfoW(HMENU hmenu, UINT item, BOOL bypos,
const MENUITEMINFOW *lpmii)
{
- MENUITEM *menuitem;
+ struct menu_item_desc item_desc;
MENUITEMINFOW mii;
+ BOOL ret;
TRACE("hmenu %p, item %u, by pos %d, info %p\n", hmenu, item, bypos, lpmii);
if (!MENU_NormalizeMenuItemInfoStruct( lpmii, &mii )) return FALSE;
- if (!(menuitem = MENU_FindItem( &hmenu, &item, bypos? MF_BYPOSITION : 0 )))
+
+ if (!MENU_FindItem(hmenu, item, bypos ? MF_BYPOSITION : 0, &item_desc))
{
/* workaround for Word 95: pretend that SC_TASKLIST item exists */
if (item == SC_TASKLIST && !bypos) return TRUE;
return FALSE;
}
- return SetMenuItemInfo_common( menuitem, &mii, TRUE );
+
+ ret = SetMenuItemInfo_common(item_desc.item, &mii, TRUE);
+ release_menu_ptr(item_desc.menu);
+ return ret;
}
static BOOL set_menu_default_item(POPUPMENU *menu, UINT uItem, UINT bypos)
@@ -5090,15 +5197,20 @@ UINT WINAPI GetMenuDefaultItem(HMENU hmenu, UINT bypos, UINT flags)
BOOL WINAPI InsertMenuItemA(HMENU hMenu, UINT uItem, BOOL bypos,
const MENUITEMINFOA *lpmii)
{
- MENUITEM *item;
+ struct menu_item_desc item_desc;
MENUITEMINFOW mii;
+ BOOL ret;
TRACE("hmenu %p, item %04x, by pos %d, info %p\n", hMenu, uItem, bypos, lpmii);
if (!MENU_NormalizeMenuItemInfoStruct( (const MENUITEMINFOW *)lpmii, &mii )) return FALSE;
- item = MENU_InsertItem(hMenu, uItem, bypos ? MF_BYPOSITION : 0 );
- return SetMenuItemInfo_common(item, &mii, FALSE);
+ if (!MENU_InsertItem(hMenu, uItem, bypos ? MF_BYPOSITION : 0, &item_desc))
+ return FALSE;
+
+ ret = SetMenuItemInfo_common(item_desc.item, &mii, FALSE);
+ release_menu_ptr(item_desc.menu);
+ return ret;
}
@@ -5108,64 +5220,71 @@ BOOL WINAPI InsertMenuItemA(HMENU hMenu, UINT uItem, BOOL bypos,
BOOL WINAPI InsertMenuItemW(HMENU hMenu, UINT uItem, BOOL bypos,
const MENUITEMINFOW *lpmii)
{
- MENUITEM *item;
+ struct menu_item_desc item_desc;
MENUITEMINFOW mii;
+ BOOL ret;
TRACE("hmenu %p, item %04x, by pos %d, info %p\n", hMenu, uItem, bypos, lpmii);
if (!MENU_NormalizeMenuItemInfoStruct( lpmii, &mii )) return FALSE;
- item = MENU_InsertItem(hMenu, uItem, bypos ? MF_BYPOSITION : 0 );
- return SetMenuItemInfo_common(item, &mii, TRUE);
+ if (!MENU_InsertItem(hMenu, uItem, bypos ? MF_BYPOSITION : 0, &item_desc))
+ return FALSE;
+
+ ret = SetMenuItemInfo_common(item_desc.item, &mii, TRUE);
+ release_menu_ptr(item_desc.menu);
+ return ret;
}
/**********************************************************************
* CheckMenuRadioItem (USER32.@)
*/
-BOOL WINAPI CheckMenuRadioItem(HMENU hMenu,
- UINT first, UINT last, UINT check,
- UINT bypos)
+BOOL WINAPI CheckMenuRadioItem(HMENU hMenu, UINT first, UINT last,
+ UINT check, UINT flags)
{
+ struct menu_item_desc first_item = { 0 }, check_item = { 0 };
BOOL done = FALSE;
UINT i;
- MENUITEM *mi_first = NULL, *mi_check;
- HMENU m_first, m_check;
for (i = first; i <= last; i++)
{
- UINT pos = i;
-
- if (!mi_first)
+ if (!first_item.menu)
{
- m_first = hMenu;
- mi_first = MENU_FindItem(&m_first, &pos, bypos);
- if (!mi_first) continue;
- mi_check = mi_first;
- m_check = m_first;
+ if (!MENU_FindItem(hMenu, i, flags, &first_item)) continue;
+
+ check_item = first_item;
+ check_item.menu = grab_menu_ptr(first_item.menu->obj.handle);
}
else
{
- m_check = hMenu;
- mi_check = MENU_FindItem(&m_check, &pos, bypos);
- if (!mi_check) continue;
+ if (!MENU_FindItem(hMenu, i, flags, &check_item)) continue;
}
- if (m_first != m_check) continue;
- if (mi_check->fType == MFT_SEPARATOR) continue;
-
- if (i == check)
+ if (first_item.menu != check_item.menu)
{
- mi_check->fType |= MFT_RADIOCHECK;
- mi_check->fState |= MFS_CHECKED;
- done = TRUE;
+ release_menu_ptr(check_item.menu);
+ continue;
}
- else
+
+ if (check_item.item->fType != MFT_SEPARATOR)
{
- /* MSDN is wrong, Windows does not remove MFT_RADIOCHECK */
- mi_check->fState &= ~MFS_CHECKED;
+ if (i == check)
+ {
+ check_item.item->fType |= MFT_RADIOCHECK;
+ check_item.item->fState |= MFS_CHECKED;
+ done = TRUE;
+ }
+ else
+ {
+ /* MSDN is wrong, Windows does not remove MFT_RADIOCHECK */
+ check_item.item->fState &= ~MFS_CHECKED;
+ }
}
+
+ release_menu_ptr(check_item.menu);
}
+ release_menu_ptr(first_item.menu);
return done;
}
@@ -5181,27 +5300,29 @@ BOOL WINAPI CheckMenuRadioItem(HMENU hMenu,
*/
BOOL WINAPI GetMenuItemRect(HWND hwnd, HMENU hMenu, UINT uItem, RECT *rect)
{
- POPUPMENU *menu;
- MENUITEM *item;
-
- TRACE("(%p,%p,%d,%p)\n", hwnd, hMenu, uItem, rect);
+ struct menu_item_desc item_desc;
- item = MENU_FindItem (&hMenu, &uItem, MF_BYPOSITION);
- if ((rect == NULL) || (item == NULL))
- return FALSE;
+ TRACE("(%p,%p,%d,%p)\n", hwnd, hMenu, uItem, rect);
- menu = MENU_GetMenu(hMenu);
- if (!menu) return FALSE;
+ if (!rect)
+ return FALSE;
- if (!hwnd) hwnd = menu->hWnd;
- if (!hwnd) return FALSE;
+ if (!MENU_FindItem(hMenu, uItem, MF_BYPOSITION, &item_desc))
+ return FALSE;
- *rect = item->rect;
+ if (!hwnd) hwnd = item_desc.menu->hWnd;
+ if (!hwnd)
+ {
+ release_menu_ptr(item_desc.menu);
+ return FALSE;
+ }
- OffsetRect(rect, menu->items_rect.left, menu->items_rect.top);
- MapWindowPoints(hwnd, 0, (POINT *)rect, 2);
+ *rect = item_desc.item->rect;
+ OffsetRect(rect, item_desc.menu->items_rect.left, item_desc.menu->items_rect.top);
+ release_menu_ptr(item_desc.menu);
- return TRUE;
+ MapWindowPoints(hwnd, 0, (POINT *)rect, 2);
+ return TRUE;
}
/**********************************************************************
@@ -5415,16 +5536,18 @@ static BOOL translate_accelerator( HWND hWnd, UINT message, WPARAM wParam, LPARA
{
HMENU hMenu, hSubMenu, hSysMenu;
UINT uSysStat = (UINT)-1, uStat = (UINT)-1, nPos;
+ struct menu_item_desc item_desc;
hMenu = (GetWindowLongW( hWnd, GWL_STYLE ) & WS_CHILD) ? 0 : GetMenu(hWnd);
hSysMenu = get_win_sys_menu( hWnd );
/* find menu item and ask application to initialize it */
/* 1. in the system menu */
- hSubMenu = hSysMenu;
- nPos = cmd;
- if(MENU_FindItem(&hSubMenu, &nPos, MF_BYCOMMAND))
+ if (MENU_FindItem(hSysMenu, cmd, MF_BYCOMMAND, &item_desc))
{
+ hSubMenu = item_desc.menu->obj.handle;
+ release_menu_ptr(item_desc.menu);
+
if (GetCapture())
mesg = 2;
if (!IsWindowEnabled(hWnd))
@@ -5443,10 +5566,11 @@ static BOOL translate_accelerator( HWND hWnd, UINT message, WPARAM wParam, LPARA
}
else /* 2. in the window's menu */
{
- hSubMenu = hMenu;
- nPos = cmd;
- if(MENU_FindItem(&hSubMenu, &nPos, MF_BYCOMMAND))
+ if (MENU_FindItem(hMenu, cmd, MF_BYCOMMAND, &item_desc))
{
+ hSubMenu = item_desc.menu->obj.handle;
+ release_menu_ptr(item_desc.menu);
+
if (GetCapture())
mesg = 2;
if (!IsWindowEnabled(hWnd))
--
2.17.0
2
1