[FFmpeg-devel] Made appropriate changes to be able to successfully build C++ files using a Visual C++ build on Windows

Submitted by Aaron Levinson on April 13, 2017, 9:47 a.m.

Details

Message ID 719306ce-2710-fbdf-15db-7a49ecb5037c@aracnet.com
State New
Headers show

Commit Message

Aaron Levinson April 13, 2017, 9:47 a.m.
On 4/13/2017 2:10 AM, Hendrik Leppkes wrote:
> On Thu, Apr 13, 2017 at 11:04 AM, Aaron Levinson <alevinsn@aracnet.com> wrote:
>>  static av_unused int pthread_cond_signal(pthread_cond_t *cond)
>>  {
>> -    win32_cond_t *win32_cond = cond->Ptr;
>> +    win32_cond_t *win32_cond = (win32_cond_t*)cond->Ptr;
>>      int have_waiter;
>>      if (cond_signal) {
>>          cond_signal(cond);
>> @@ -400,17 +400,17 @@ static av_unused void w32thread_init(void)
>>      HANDLE kernel_dll = GetModuleHandle(TEXT("kernel32.dll"));
>>      /* if one is available, then they should all be available */
>>      cond_init      = (void (WINAPI*)(pthread_cond_t *))
>> -        GetProcAddress(kernel_dll, "InitializeConditionVariable");
>> +        GetProcAddress((HMODULE)kernel_dll, "InitializeConditionVariable");
>>      cond_broadcast = (void (WINAPI*)(pthread_cond_t *))
>> -        GetProcAddress(kernel_dll, "WakeAllConditionVariable");
>> +        GetProcAddress((HMODULE)kernel_dll, "WakeAllConditionVariable");
>>      cond_signal    = (void (WINAPI*)(pthread_cond_t *))
>> -        GetProcAddress(kernel_dll, "WakeConditionVariable");
>> +        GetProcAddress((HMODULE)kernel_dll, "WakeConditionVariable");
>>      cond_wait      = (BOOL (WINAPI*)(pthread_cond_t *, pthread_mutex_t *, DWORD))
>> -        GetProcAddress(kernel_dll, "SleepConditionVariableCS");
>> +        GetProcAddress((HMODULE)kernel_dll, "SleepConditionVariableCS");
>>      initonce_begin = (BOOL (WINAPI*)(pthread_once_t *, DWORD, BOOL *, void **))
>> -        GetProcAddress(kernel_dll, "InitOnceBeginInitialize");
>> +        GetProcAddress((HMODULE)kernel_dll, "InitOnceBeginInitialize");
>>      initonce_complete = (BOOL (WINAPI*)(pthread_once_t *, DWORD, void *))
>> -        GetProcAddress(kernel_dll, "InitOnceComplete");
>> +        GetProcAddress((HMODULE)kernel_dll, "InitOnceComplete");
>>  #endif
> 
> One more comment that I missed earlier (sorry), GetModuleHandle
> returns the type HMODULE, can't you just change the type of kernel_dll
> to match that, and avoid the casts here?
> 
> - Hendrik

Yes, it is simpler and cleaner to properly set the return value of GetModuleHandle() to an HMODULE.  Here is what is hopefully the final version of the patch, which is also much cleaner and simplified from the original version.

Thanks,
Aaron

------------------------------------------------------------------

From 56f9a4b6c281a0d9382d2b4ec2e29aff5ab69fbc Mon Sep 17 00:00:00 2001
From: Aaron Levinson <alevinsn@aracnet.com>
Date: Thu, 13 Apr 2017 02:38:02 -0700
Subject: [PATCH] Made appropriate changes to be able to successfully build C++ files using a Visual C++ build on Windows

Purpose: Made appropriate changes to be able to successfully
build C++ files using a Visual C++ build on Windows.  Note that this is a
continuation of the "fixes w32pthreads to support C++" aspect of Kyle
Schwarz's "Remove pthread dependency" patch that is available at
https://patchwork.ffmpeg.org/patch/2654/ .  This patch wasn't accepted, and
as far as I can tell, there was no follow-up after it was rejected.

Notes: Used Visual Studio 2015 (with update 3) for this.  Altered
approach for specifying -Fo$@ in configure based on code review from
Hendrik Leppkes for first version of patch.  Also simplified changes
to w32pthreads.h per Hendrik's review.

Comments:

-- compat/w32pthreads.h: Made appropriate changes to w32pthreads.h to
   get it to build when it is being included in a C++ file and built
   with Visual C++.  This is mostly a copy of Kyle Schwarz's patch as
   described above.

-- configure:
a) Now calling set_ccvars CXX to cause the various CXX_ variables to
   be setup properly.  For example, with MSVC (Microsoft Visual C++),
   this causes CXX_O to be set to -Fo$@ instead of using the default
   value.  The default value does not work with Visual C++.  This
   change will also have the impact of correcting CXX_O (and possibly
   CXX_C) for other compilers, although this is really only relevant
   for the Intel compiler, in addition to MSVC.
b) Now using cl for the C++ compiler for the MSVC toolchain.  This is
   currently only relevant for building the
   Blackmagic/Decklink-related files under avdevice.
---
 compat/w32pthreads.h | 14 +++++++-------
 configure            |  3 +++
 2 files changed, 10 insertions(+), 7 deletions(-)

Comments

wm4 April 13, 2017, 12:36 p.m.
On Thu, 13 Apr 2017 02:47:39 -0700
Aaron Levinson <alevinsn@aracnet.com> wrote:

> On 4/13/2017 2:10 AM, Hendrik Leppkes wrote:
> > On Thu, Apr 13, 2017 at 11:04 AM, Aaron Levinson <alevinsn@aracnet.com> wrote:  
> >>  static av_unused int pthread_cond_signal(pthread_cond_t *cond)
> >>  {
> >> -    win32_cond_t *win32_cond = cond->Ptr;
> >> +    win32_cond_t *win32_cond = (win32_cond_t*)cond->Ptr;
> >>      int have_waiter;
> >>      if (cond_signal) {
> >>          cond_signal(cond);
> >> @@ -400,17 +400,17 @@ static av_unused void w32thread_init(void)
> >>      HANDLE kernel_dll = GetModuleHandle(TEXT("kernel32.dll"));
> >>      /* if one is available, then they should all be available */
> >>      cond_init      = (void (WINAPI*)(pthread_cond_t *))
> >> -        GetProcAddress(kernel_dll, "InitializeConditionVariable");
> >> +        GetProcAddress((HMODULE)kernel_dll, "InitializeConditionVariable");
> >>      cond_broadcast = (void (WINAPI*)(pthread_cond_t *))
> >> -        GetProcAddress(kernel_dll, "WakeAllConditionVariable");
> >> +        GetProcAddress((HMODULE)kernel_dll, "WakeAllConditionVariable");
> >>      cond_signal    = (void (WINAPI*)(pthread_cond_t *))
> >> -        GetProcAddress(kernel_dll, "WakeConditionVariable");
> >> +        GetProcAddress((HMODULE)kernel_dll, "WakeConditionVariable");
> >>      cond_wait      = (BOOL (WINAPI*)(pthread_cond_t *, pthread_mutex_t *, DWORD))
> >> -        GetProcAddress(kernel_dll, "SleepConditionVariableCS");
> >> +        GetProcAddress((HMODULE)kernel_dll, "SleepConditionVariableCS");
> >>      initonce_begin = (BOOL (WINAPI*)(pthread_once_t *, DWORD, BOOL *, void **))
> >> -        GetProcAddress(kernel_dll, "InitOnceBeginInitialize");
> >> +        GetProcAddress((HMODULE)kernel_dll, "InitOnceBeginInitialize");
> >>      initonce_complete = (BOOL (WINAPI*)(pthread_once_t *, DWORD, void *))
> >> -        GetProcAddress(kernel_dll, "InitOnceComplete");
> >> +        GetProcAddress((HMODULE)kernel_dll, "InitOnceComplete");
> >>  #endif  
> > 
> > One more comment that I missed earlier (sorry), GetModuleHandle
> > returns the type HMODULE, can't you just change the type of kernel_dll
> > to match that, and avoid the casts here?
> > 
> > - Hendrik  
> 
> Yes, it is simpler and cleaner to properly set the return value of GetModuleHandle() to an HMODULE.  Here is what is hopefully the final version of the patch, which is also much cleaner and simplified from the original version.
> 
> Thanks,
> Aaron
> 
> ------------------------------------------------------------------
> 
> From 56f9a4b6c281a0d9382d2b4ec2e29aff5ab69fbc Mon Sep 17 00:00:00 2001
> From: Aaron Levinson <alevinsn@aracnet.com>
> Date: Thu, 13 Apr 2017 02:38:02 -0700
> Subject: [PATCH] Made appropriate changes to be able to successfully build C++ files using a Visual C++ build on Windows
> 
> Purpose: Made appropriate changes to be able to successfully
> build C++ files using a Visual C++ build on Windows.  Note that this is a
> continuation of the "fixes w32pthreads to support C++" aspect of Kyle
> Schwarz's "Remove pthread dependency" patch that is available at
> https://patchwork.ffmpeg.org/patch/2654/ .  This patch wasn't accepted, and
> as far as I can tell, there was no follow-up after it was rejected.
> 
> Notes: Used Visual Studio 2015 (with update 3) for this.  Altered
> approach for specifying -Fo$@ in configure based on code review from
> Hendrik Leppkes for first version of patch.  Also simplified changes
> to w32pthreads.h per Hendrik's review.
> 
> Comments:
> 
> -- compat/w32pthreads.h: Made appropriate changes to w32pthreads.h to
>    get it to build when it is being included in a C++ file and built
>    with Visual C++.  This is mostly a copy of Kyle Schwarz's patch as
>    described above.
> 
> -- configure:
> a) Now calling set_ccvars CXX to cause the various CXX_ variables to
>    be setup properly.  For example, with MSVC (Microsoft Visual C++),
>    this causes CXX_O to be set to -Fo$@ instead of using the default
>    value.  The default value does not work with Visual C++.  This
>    change will also have the impact of correcting CXX_O (and possibly
>    CXX_C) for other compilers, although this is really only relevant
>    for the Intel compiler, in addition to MSVC.
> b) Now using cl for the C++ compiler for the MSVC toolchain.  This is
>    currently only relevant for building the
>    Blackmagic/Decklink-related files under avdevice.
> ---
>  compat/w32pthreads.h | 14 +++++++-------
>  configure            |  3 +++
>  2 files changed, 10 insertions(+), 7 deletions(-)
> 
> diff --git a/compat/w32pthreads.h b/compat/w32pthreads.h
> index 0c9a7fa..eeead60 100644
> --- a/compat/w32pthreads.h
> +++ b/compat/w32pthreads.h
> @@ -77,7 +77,7 @@ typedef struct pthread_cond_t {
>  
>  static av_unused unsigned __stdcall attribute_align_arg win32thread_worker(void *arg)
>  {
> -    pthread_t *h = arg;
> +    pthread_t *h = (pthread_t*)arg;
>      h->ret = h->func(h->arg);
>      return 0;
>  }
> @@ -270,7 +270,7 @@ static av_unused int pthread_cond_init(pthread_cond_t *cond, const void *unused_
>      }
>  
>      /* non native condition variables */
> -    win32_cond = av_mallocz(sizeof(win32_cond_t));
> +    win32_cond = (win32_cond_t*)av_mallocz(sizeof(win32_cond_t));
>      if (!win32_cond)
>          return ENOMEM;
>      cond->Ptr = win32_cond;
> @@ -288,7 +288,7 @@ static av_unused int pthread_cond_init(pthread_cond_t *cond, const void *unused_
>  
>  static av_unused int pthread_cond_destroy(pthread_cond_t *cond)
>  {
> -    win32_cond_t *win32_cond = cond->Ptr;
> +    win32_cond_t *win32_cond = (win32_cond_t*)cond->Ptr;
>      /* native condition variables do not destroy */
>      if (cond_init)
>          return 0;
> @@ -305,7 +305,7 @@ static av_unused int pthread_cond_destroy(pthread_cond_t *cond)
>  
>  static av_unused int pthread_cond_broadcast(pthread_cond_t *cond)
>  {
> -    win32_cond_t *win32_cond = cond->Ptr;
> +    win32_cond_t *win32_cond = (win32_cond_t*)cond->Ptr;
>      int have_waiter;
>  
>      if (cond_broadcast) {
> @@ -337,7 +337,7 @@ static av_unused int pthread_cond_broadcast(pthread_cond_t *cond)
>  
>  static av_unused int pthread_cond_wait(pthread_cond_t *cond, pthread_mutex_t *mutex)
>  {
> -    win32_cond_t *win32_cond = cond->Ptr;
> +    win32_cond_t *win32_cond = (win32_cond_t*)cond->Ptr;
>      int last_waiter;
>      if (cond_wait) {
>          cond_wait(cond, mutex, INFINITE);
> @@ -369,7 +369,7 @@ static av_unused int pthread_cond_wait(pthread_cond_t *cond, pthread_mutex_t *mu
>  
>  static av_unused int pthread_cond_signal(pthread_cond_t *cond)
>  {
> -    win32_cond_t *win32_cond = cond->Ptr;
> +    win32_cond_t *win32_cond = (win32_cond_t*)cond->Ptr;
>      int have_waiter;
>      if (cond_signal) {
>          cond_signal(cond);
> @@ -397,7 +397,7 @@ static av_unused int pthread_cond_signal(pthread_cond_t *cond)
>  static av_unused void w32thread_init(void)
>  {
>  #if _WIN32_WINNT < 0x0600
> -    HANDLE kernel_dll = GetModuleHandle(TEXT("kernel32.dll"));
> +    HMODULE kernel_dll = GetModuleHandle(TEXT("kernel32.dll"));
>      /* if one is available, then they should all be available */
>      cond_init      = (void (WINAPI*)(pthread_cond_t *))
>          GetProcAddress(kernel_dll, "InitializeConditionVariable");
> diff --git a/configure b/configure
> index b2fc781..43f0938 100755
> --- a/configure
> +++ b/configure
> @@ -3637,8 +3637,10 @@ case "$toolchain" in
>          cl_major_ver=$(cl 2>&1 | sed -n 's/.*Version \([[:digit:]]\{1,\}\)\..*/\1/p')
>          if [ -z "$cl_major_ver" ] || [ $cl_major_ver -ge 18 ]; then
>              cc_default="cl"
> +            cxx_default="cl"
>          else
>              cc_default="c99wrap cl"
> +            cxx_default="c99wrap cl"
>          fi
>          ld_default="$source_path/compat/windows/mslink"
>          nm_default="dumpbin -symbols"
> @@ -4196,6 +4198,7 @@ cflags_noopt=$_cflags_noopt
>  add_cflags $_flags $_cflags
>  cc_ldflags=$_ldflags
>  set_ccvars CC
> +set_ccvars CXX
>  
>  probe_cc hostcc "$host_cc"
>  host_cflags_filter=$_flags_filter

LGTM, although in my opinion it would be better to move the
implementations to a .c file to avoid accidental breakage of C++ code.
(But of course that's out of scope of the patch.)
Hendrik Leppkes April 13, 2017, 10:22 p.m.
On Thu, Apr 13, 2017 at 2:36 PM, wm4 <nfxjfg@googlemail.com> wrote:
> On Thu, 13 Apr 2017 02:47:39 -0700
> Aaron Levinson <alevinsn@aracnet.com> wrote:
>
>> On 4/13/2017 2:10 AM, Hendrik Leppkes wrote:
>> > On Thu, Apr 13, 2017 at 11:04 AM, Aaron Levinson <alevinsn@aracnet.com> wrote:
>> >>  static av_unused int pthread_cond_signal(pthread_cond_t *cond)
>> >>  {
>> >> -    win32_cond_t *win32_cond = cond->Ptr;
>> >> +    win32_cond_t *win32_cond = (win32_cond_t*)cond->Ptr;
>> >>      int have_waiter;
>> >>      if (cond_signal) {
>> >>          cond_signal(cond);
>> >> @@ -400,17 +400,17 @@ static av_unused void w32thread_init(void)
>> >>      HANDLE kernel_dll = GetModuleHandle(TEXT("kernel32.dll"));
>> >>      /* if one is available, then they should all be available */
>> >>      cond_init      = (void (WINAPI*)(pthread_cond_t *))
>> >> -        GetProcAddress(kernel_dll, "InitializeConditionVariable");
>> >> +        GetProcAddress((HMODULE)kernel_dll, "InitializeConditionVariable");
>> >>      cond_broadcast = (void (WINAPI*)(pthread_cond_t *))
>> >> -        GetProcAddress(kernel_dll, "WakeAllConditionVariable");
>> >> +        GetProcAddress((HMODULE)kernel_dll, "WakeAllConditionVariable");
>> >>      cond_signal    = (void (WINAPI*)(pthread_cond_t *))
>> >> -        GetProcAddress(kernel_dll, "WakeConditionVariable");
>> >> +        GetProcAddress((HMODULE)kernel_dll, "WakeConditionVariable");
>> >>      cond_wait      = (BOOL (WINAPI*)(pthread_cond_t *, pthread_mutex_t *, DWORD))
>> >> -        GetProcAddress(kernel_dll, "SleepConditionVariableCS");
>> >> +        GetProcAddress((HMODULE)kernel_dll, "SleepConditionVariableCS");
>> >>      initonce_begin = (BOOL (WINAPI*)(pthread_once_t *, DWORD, BOOL *, void **))
>> >> -        GetProcAddress(kernel_dll, "InitOnceBeginInitialize");
>> >> +        GetProcAddress((HMODULE)kernel_dll, "InitOnceBeginInitialize");
>> >>      initonce_complete = (BOOL (WINAPI*)(pthread_once_t *, DWORD, void *))
>> >> -        GetProcAddress(kernel_dll, "InitOnceComplete");
>> >> +        GetProcAddress((HMODULE)kernel_dll, "InitOnceComplete");
>> >>  #endif
>> >
>> > One more comment that I missed earlier (sorry), GetModuleHandle
>> > returns the type HMODULE, can't you just change the type of kernel_dll
>> > to match that, and avoid the casts here?
>> >
>> > - Hendrik
>>
>> Yes, it is simpler and cleaner to properly set the return value of GetModuleHandle() to an HMODULE.  Here is what is hopefully the final version of the patch, which is also much cleaner and simplified from the original version.
>>
>> Thanks,
>> Aaron
>>
>> ------------------------------------------------------------------
>>
>> From 56f9a4b6c281a0d9382d2b4ec2e29aff5ab69fbc Mon Sep 17 00:00:00 2001
>> From: Aaron Levinson <alevinsn@aracnet.com>
>> Date: Thu, 13 Apr 2017 02:38:02 -0700
>> Subject: [PATCH] Made appropriate changes to be able to successfully build C++ files using a Visual C++ build on Windows
>>
>> Purpose: Made appropriate changes to be able to successfully
>> build C++ files using a Visual C++ build on Windows.  Note that this is a
>> continuation of the "fixes w32pthreads to support C++" aspect of Kyle
>> Schwarz's "Remove pthread dependency" patch that is available at
>> https://patchwork.ffmpeg.org/patch/2654/ .  This patch wasn't accepted, and
>> as far as I can tell, there was no follow-up after it was rejected.
>>
>> Notes: Used Visual Studio 2015 (with update 3) for this.  Altered
>> approach for specifying -Fo$@ in configure based on code review from
>> Hendrik Leppkes for first version of patch.  Also simplified changes
>> to w32pthreads.h per Hendrik's review.
>>
>> Comments:
>>
>> -- compat/w32pthreads.h: Made appropriate changes to w32pthreads.h to
>>    get it to build when it is being included in a C++ file and built
>>    with Visual C++.  This is mostly a copy of Kyle Schwarz's patch as
>>    described above.
>>
>> -- configure:
>> a) Now calling set_ccvars CXX to cause the various CXX_ variables to
>>    be setup properly.  For example, with MSVC (Microsoft Visual C++),
>>    this causes CXX_O to be set to -Fo$@ instead of using the default
>>    value.  The default value does not work with Visual C++.  This
>>    change will also have the impact of correcting CXX_O (and possibly
>>    CXX_C) for other compilers, although this is really only relevant
>>    for the Intel compiler, in addition to MSVC.
>> b) Now using cl for the C++ compiler for the MSVC toolchain.  This is
>>    currently only relevant for building the
>>    Blackmagic/Decklink-related files under avdevice.
>> ---
>>  compat/w32pthreads.h | 14 +++++++-------
>>  configure            |  3 +++
>>  2 files changed, 10 insertions(+), 7 deletions(-)
>>
>> diff --git a/compat/w32pthreads.h b/compat/w32pthreads.h
>> index 0c9a7fa..eeead60 100644
>> --- a/compat/w32pthreads.h
>> +++ b/compat/w32pthreads.h
>> @@ -77,7 +77,7 @@ typedef struct pthread_cond_t {
>>
>>  static av_unused unsigned __stdcall attribute_align_arg win32thread_worker(void *arg)
>>  {
>> -    pthread_t *h = arg;
>> +    pthread_t *h = (pthread_t*)arg;
>>      h->ret = h->func(h->arg);
>>      return 0;
>>  }
>> @@ -270,7 +270,7 @@ static av_unused int pthread_cond_init(pthread_cond_t *cond, const void *unused_
>>      }
>>
>>      /* non native condition variables */
>> -    win32_cond = av_mallocz(sizeof(win32_cond_t));
>> +    win32_cond = (win32_cond_t*)av_mallocz(sizeof(win32_cond_t));
>>      if (!win32_cond)
>>          return ENOMEM;
>>      cond->Ptr = win32_cond;
>> @@ -288,7 +288,7 @@ static av_unused int pthread_cond_init(pthread_cond_t *cond, const void *unused_
>>
>>  static av_unused int pthread_cond_destroy(pthread_cond_t *cond)
>>  {
>> -    win32_cond_t *win32_cond = cond->Ptr;
>> +    win32_cond_t *win32_cond = (win32_cond_t*)cond->Ptr;
>>      /* native condition variables do not destroy */
>>      if (cond_init)
>>          return 0;
>> @@ -305,7 +305,7 @@ static av_unused int pthread_cond_destroy(pthread_cond_t *cond)
>>
>>  static av_unused int pthread_cond_broadcast(pthread_cond_t *cond)
>>  {
>> -    win32_cond_t *win32_cond = cond->Ptr;
>> +    win32_cond_t *win32_cond = (win32_cond_t*)cond->Ptr;
>>      int have_waiter;
>>
>>      if (cond_broadcast) {
>> @@ -337,7 +337,7 @@ static av_unused int pthread_cond_broadcast(pthread_cond_t *cond)
>>
>>  static av_unused int pthread_cond_wait(pthread_cond_t *cond, pthread_mutex_t *mutex)
>>  {
>> -    win32_cond_t *win32_cond = cond->Ptr;
>> +    win32_cond_t *win32_cond = (win32_cond_t*)cond->Ptr;
>>      int last_waiter;
>>      if (cond_wait) {
>>          cond_wait(cond, mutex, INFINITE);
>> @@ -369,7 +369,7 @@ static av_unused int pthread_cond_wait(pthread_cond_t *cond, pthread_mutex_t *mu
>>
>>  static av_unused int pthread_cond_signal(pthread_cond_t *cond)
>>  {
>> -    win32_cond_t *win32_cond = cond->Ptr;
>> +    win32_cond_t *win32_cond = (win32_cond_t*)cond->Ptr;
>>      int have_waiter;
>>      if (cond_signal) {
>>          cond_signal(cond);
>> @@ -397,7 +397,7 @@ static av_unused int pthread_cond_signal(pthread_cond_t *cond)
>>  static av_unused void w32thread_init(void)
>>  {
>>  #if _WIN32_WINNT < 0x0600
>> -    HANDLE kernel_dll = GetModuleHandle(TEXT("kernel32.dll"));
>> +    HMODULE kernel_dll = GetModuleHandle(TEXT("kernel32.dll"));
>>      /* if one is available, then they should all be available */
>>      cond_init      = (void (WINAPI*)(pthread_cond_t *))
>>          GetProcAddress(kernel_dll, "InitializeConditionVariable");
>> diff --git a/configure b/configure
>> index b2fc781..43f0938 100755
>> --- a/configure
>> +++ b/configure
>> @@ -3637,8 +3637,10 @@ case "$toolchain" in
>>          cl_major_ver=$(cl 2>&1 | sed -n 's/.*Version \([[:digit:]]\{1,\}\)\..*/\1/p')
>>          if [ -z "$cl_major_ver" ] || [ $cl_major_ver -ge 18 ]; then
>>              cc_default="cl"
>> +            cxx_default="cl"
>>          else
>>              cc_default="c99wrap cl"
>> +            cxx_default="c99wrap cl"
>>          fi
>>          ld_default="$source_path/compat/windows/mslink"
>>          nm_default="dumpbin -symbols"
>> @@ -4196,6 +4198,7 @@ cflags_noopt=$_cflags_noopt
>>  add_cflags $_flags $_cflags
>>  cc_ldflags=$_ldflags
>>  set_ccvars CC
>> +set_ccvars CXX
>>
>>  probe_cc hostcc "$host_cc"
>>  host_cflags_filter=$_flags_filter
>
> LGTM, although in my opinion it would be better to move the
> implementations to a .c file to avoid accidental breakage of C++ code.
> (But of course that's out of scope of the patch.)

Pushed with one additional hunk cherry-picked from another patch in
this series (after discussion and testing on IRC), and a slightly
revised commit message.

Thanks!

- Hendrik

Patch hide | download patch | download mbox

diff --git a/compat/w32pthreads.h b/compat/w32pthreads.h
index 0c9a7fa..eeead60 100644
--- a/compat/w32pthreads.h
+++ b/compat/w32pthreads.h
@@ -77,7 +77,7 @@  typedef struct pthread_cond_t {
 
 static av_unused unsigned __stdcall attribute_align_arg win32thread_worker(void *arg)
 {
-    pthread_t *h = arg;
+    pthread_t *h = (pthread_t*)arg;
     h->ret = h->func(h->arg);
     return 0;
 }
@@ -270,7 +270,7 @@  static av_unused int pthread_cond_init(pthread_cond_t *cond, const void *unused_
     }
 
     /* non native condition variables */
-    win32_cond = av_mallocz(sizeof(win32_cond_t));
+    win32_cond = (win32_cond_t*)av_mallocz(sizeof(win32_cond_t));
     if (!win32_cond)
         return ENOMEM;
     cond->Ptr = win32_cond;
@@ -288,7 +288,7 @@  static av_unused int pthread_cond_init(pthread_cond_t *cond, const void *unused_
 
 static av_unused int pthread_cond_destroy(pthread_cond_t *cond)
 {
-    win32_cond_t *win32_cond = cond->Ptr;
+    win32_cond_t *win32_cond = (win32_cond_t*)cond->Ptr;
     /* native condition variables do not destroy */
     if (cond_init)
         return 0;
@@ -305,7 +305,7 @@  static av_unused int pthread_cond_destroy(pthread_cond_t *cond)
 
 static av_unused int pthread_cond_broadcast(pthread_cond_t *cond)
 {
-    win32_cond_t *win32_cond = cond->Ptr;
+    win32_cond_t *win32_cond = (win32_cond_t*)cond->Ptr;
     int have_waiter;
 
     if (cond_broadcast) {
@@ -337,7 +337,7 @@  static av_unused int pthread_cond_broadcast(pthread_cond_t *cond)
 
 static av_unused int pthread_cond_wait(pthread_cond_t *cond, pthread_mutex_t *mutex)
 {
-    win32_cond_t *win32_cond = cond->Ptr;
+    win32_cond_t *win32_cond = (win32_cond_t*)cond->Ptr;
     int last_waiter;
     if (cond_wait) {
         cond_wait(cond, mutex, INFINITE);
@@ -369,7 +369,7 @@  static av_unused int pthread_cond_wait(pthread_cond_t *cond, pthread_mutex_t *mu
 
 static av_unused int pthread_cond_signal(pthread_cond_t *cond)
 {
-    win32_cond_t *win32_cond = cond->Ptr;
+    win32_cond_t *win32_cond = (win32_cond_t*)cond->Ptr;
     int have_waiter;
     if (cond_signal) {
         cond_signal(cond);
@@ -397,7 +397,7 @@  static av_unused int pthread_cond_signal(pthread_cond_t *cond)
 static av_unused void w32thread_init(void)
 {
 #if _WIN32_WINNT < 0x0600
-    HANDLE kernel_dll = GetModuleHandle(TEXT("kernel32.dll"));
+    HMODULE kernel_dll = GetModuleHandle(TEXT("kernel32.dll"));
     /* if one is available, then they should all be available */
     cond_init      = (void (WINAPI*)(pthread_cond_t *))
         GetProcAddress(kernel_dll, "InitializeConditionVariable");
diff --git a/configure b/configure
index b2fc781..43f0938 100755
--- a/configure
+++ b/configure
@@ -3637,8 +3637,10 @@  case "$toolchain" in
         cl_major_ver=$(cl 2>&1 | sed -n 's/.*Version \([[:digit:]]\{1,\}\)\..*/\1/p')
         if [ -z "$cl_major_ver" ] || [ $cl_major_ver -ge 18 ]; then
             cc_default="cl"
+            cxx_default="cl"
         else
             cc_default="c99wrap cl"
+            cxx_default="c99wrap cl"
         fi
         ld_default="$source_path/compat/windows/mslink"
         nm_default="dumpbin -symbols"
@@ -4196,6 +4198,7 @@  cflags_noopt=$_cflags_noopt
 add_cflags $_flags $_cflags
 cc_ldflags=$_ldflags
 set_ccvars CC
+set_ccvars CXX
 
 probe_cc hostcc "$host_cc"
 host_cflags_filter=$_flags_filter