On Thu, Oct 8, 2015 at 10:22 AM, Rémi Denis-Courmont <[email protected]> wrote:
> Le 2015-10-07 23:48, Luca Barbato a écrit :
>>
>> ---
>>  libavutil/thread.h | 10 ++++++++++
>>  1 file changed, 10 insertions(+)
>>
>> It isn't exactly beautiful with `!control` used to return 0 and
>> suppress the unused warning, but seems to work as intended and it
>> is fully portable, I'd use `({ routine(); !control; })` if we assume
>> the construct is always supported, but I'm afraid it is not.
>>
>> diff --git a/libavutil/thread.h b/libavutil/thread.h
>> index 3556544..d2fb847 100644
>> --- a/libavutil/thread.h
>> +++ b/libavutil/thread.h
>> @@ -39,6 +39,11 @@
>>  #define ff_mutex_unlock  pthread_mutex_unlock
>>  #define ff_mutex_destroy pthread_mutex_destroy
>>
>> +#define AVOnce pthread_once_t
>> +#define AV_ONCE_INIT PTHREAD_ONCE_INIT
>> +
>> +#define ff_thread_once(control, routine) pthread_once(control, routine)
>> +
>>  #else
>>
>>  #define AVMutex char
>> @@ -48,6 +53,11 @@
>>  #define ff_mutex_unlock(mutex) (0)
>>  #define ff_mutex_destroy(mutex) (0)
>>
>> +#define AVOnce char
>> +#define AV_ONCE_INIT 0
>> +
>> +#define ff_thread_once(control, routine) !control; routine();
>
>
> Why don't you use a static inline? I don't think you can make a semantically
> correct and expansion-safe pure C macro here.
>
> This should be semantically correct, but is obviously not safe w.r.t. to
> evaluation of "control":
>
> #define ff_thread_once(control, routine) \
>     (*(control) == 0 ? ((routine)(), *(control) = 1, 0) \
>                      : ((*(control) != 1) * EINVAL))
>
> I'm not convinced this is very useful. The overhead of pthread_once() should
> be negligible when single threaded.
>
> (And pthread-stubs is a much better solution to this "problem", as it can
> (de)select multithreading at run time rather than build time.)
>

He already send a new version that uses a static inline.
_______________________________________________
libav-devel mailing list
[email protected]
https://lists.libav.org/mailman/listinfo/libav-devel

Reply via email to