[FFmpeg-devel] libavutil/thread.h: Fixed g++ build error when ASSERT_LEVEL is greater than 1
Aaron Levinson
alevinsn at aracnet.com
Tue Apr 18 04:14:45 EEST 2017
On 4/17/2017 8:28 AM, wm4 wrote:
> On Mon, 17 Apr 2017 12:06:59 -0300
> James Almer <jamrial at gmail.com> wrote:
>
>> On 4/17/2017 5:39 AM, Clément Bœsch wrote:
>>> On Sun, Apr 16, 2017 at 05:20:02PM -0700, Aaron Levinson wrote:
>>>> From 9e6a9e2b8d58f17c661a3f455e03c95587ec7b18 Mon Sep 17 00:00:00 2001
>>>> From: Aaron Levinson <alevinsn at aracnet.com>
>>>> Date: Sun, 16 Apr 2017 17:13:31 -0700
>>>> Subject: [PATCH] libavutil/thread.h: Fixed g++ build error when
>>>> ASSERT_LEVEL is greater than 1
>>>>
>>>> Purpose: libavutil/thread.h: Fixed g++ build error when ASSERT_LEVEL
>>>> is greater than 1. This is only relevant when thread.h is included by
>>>> C++ files. In this case, the relevant code is only defined if
>>>> HAVE_PTHREADS is defined as 1. Use configure --assert-level=2 to do
>>>> so.
>>>>
>>>> Note: Issue discovered as a result of Coverity build failure. Cause
>>>> of build failure pinpointed by Hendrik Leppkes.
>>>>
>>>> Comments:
>>>>
>>>> -- libavutil/thread.h: Altered ASSERT_PTHREAD_NORET definition such
>>>> that it uses av_make_error_string instead of av_err2str().
>>>> av_err2str() uses a "parenthesized type followed by an initializer
>>>> list", which is apparently not valid C++. This issue started
>>>> occurring because thread.h is now included by the DeckLink C++
>>>> files. The alteration does the equivalent of what av_err2str()
>>>> does, but instead declares the character buffer as a local
>>>> variable.
>>>> ---
>>>> libavutil/thread.h | 5 ++++-
>>>> 1 file changed, 4 insertions(+), 1 deletion(-)
>>>>
>>>> diff --git a/libavutil/thread.h b/libavutil/thread.h
>>>> index 6e57447..f108e20 100644
>>>> --- a/libavutil/thread.h
>>>> +++ b/libavutil/thread.h
>>>> @@ -36,8 +36,11 @@
>>>> #define ASSERT_PTHREAD_NORET(func, ...) do { \
>>>> int ret = func(__VA_ARGS__); \
>>>> if (ret) { \
>>>> + char errbuf[AV_ERROR_MAX_STRING_SIZE] = ""; \
>>>> av_log(NULL, AV_LOG_FATAL, AV_STRINGIFY(func) \
>>>> - " failed with error: %s\n", av_err2str(AVERROR(ret))); \
>>>> + " failed with error: %s\n", \
>>>> + av_make_error_string(errbuf, AV_ERROR_MAX_STRING_SIZE, \
>>>> + AVERROR(ret))); \
>>>> abort(); \
>>>> } \
>>>> } while (0)
>>>
>>> I don't like limiting ourselves in the common C code of the project
>>> because C++ is a bad and limited language. Can't you solve this by bumping
>>> the minimal requirement of C++ version?
>>
>> We're already using C++11 when available because of atomics on mediacodec.
>> Also, just tried and it seems to fail even with C++14, so it just doesn't
>> work with C++.
>>
>> We could instead just make these strict assert wrappers work only on C
>> code by for example checking for defined(__cplusplus).
>
> Better solution: move all the code to a .c file.
I've spent some time considering what would be involved in moving the
relevant code into a .c file. thread.h is a header file that needs to
be included to provide implementations of various pthread_ APIs on
Windows and OS/2 without needing to link to pthread on those OS's. If
pthread is available, it just includes pthread.h. So, it sort of acts
like a portability layer. Providing it in the form of a .h file acts as
a convenience. If the implementation were moved into a .c file, that
tends to imply that it will reside in one of the ffmpeg libraries,
likely libavutil. And that also implies that functions with the name
pthread_create, etc, would be exported by libavutil, which is a bad
idea. Instead, the right way to go is to provide a true threading
portability layer with exported functions that start with, say,
av_thread_. But, that's a decent project, and while I'm willing to
undertake it, I would like to see some support for this endeavor first.
However, there also seems to be some resistance to supporting C++ in
ffmpeg. The DeckLink C++ files were contributed to ffmpeg in February
2014, over three years ago. While there is certainly no issue with
using C-specific functionality in .c files, there is certainly an issue
with doing so in header files that are intended to be used by any aspect
of the project, whether in .c or .cpp files. thread.h is an example of
a header file that should be suitable for use in either .c or .cpp
files. The patch that I submitted accomplishes exactly that.
Aaron Levinson
More information about the ffmpeg-devel
mailing list