[vlc-devel] [PATCH v2 2/4] compat: add clock_nanosleep for darwin

Marvin Scholz epirat07 at gmail.com
Sat Mar 21 14:38:01 CET 2020


On 20 Mar 2020, at 19:05, David Fuhrmann wrote:

>> Am 15.03.2020 um 01:49 schrieb Marvin Scholz <epirat07 at gmail.com>:
>>
>> ---
>> compat/clock_nanosleep.c | 109 
>> +++++++++++++++++++++++++++++++++++++++
>> configure.ac             |   4 +-
>> include/vlc_fixups.h     |   7 +++
>> 3 files changed, 119 insertions(+), 1 deletion(-)
>> create mode 100644 compat/clock_nanosleep.c
>>
>> diff --git a/compat/clock_nanosleep.c b/compat/clock_nanosleep.c
>> new file mode 100644
>> index 0000000000..aea702dfa9
>> --- /dev/null
>> +++ b/compat/clock_nanosleep.c
>> @@ -0,0 +1,109 @@
>> +/*****************************************************************************
>> + * clock_nanosleep.c: POSIX clock_nanosleep() replacement
>> + 
>> *****************************************************************************
>> + * Copyright © 2020 VLC authors and VideoLAN
>> + *
>> + * Author: Marvin Scholz <epirat07 at gmail dot com>
>> + *
>> + * This program 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 program 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 program; if not, write to the Free Software 
>> Foundation,
>> + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
>> + 
>> *****************************************************************************/
>> +
>> +#ifdef __APPLE__
>> +
>> +#ifdef HAVE_CONFIG_H
>> +# include <config.h>
>> +#endif
>> +
>> +#include <assert.h>
>> +#include <pthread.h>
>> +#include <sys/errno.h>
>> +#include <sys/types.h>
>> +#include <sys/time.h>
>> +#include <sys/sysctl.h>
>> +#include <mach/clock_types.h>
>> +
>> +#define timespecs_sub(tsa, tsb, tsr)                                
>> \
>> +    do {                                                            
>> \
>> +            (tsr)->tv_sec = (tsa)->tv_sec - (tsb)->tv_sec;          
>> \
>> +            (tsr)->tv_nsec = (tsa)->tv_nsec - (tsb)->tv_nsec;       
>> \
>> +            if ((tsr)->tv_nsec < 0) {                               
>> \
>> +                    (tsr)->tv_sec--;                                
>> \
>> +                    (tsr)->tv_nsec += NSEC_PER_SEC;                 
>> \
>> +            }                                                       
>> \
>> +    } while (0)
>> +
>
> Hi,
>
> Small comment here: I would really propose to avoid such huge defines. 
> I believe this is really kinda an anti pattern, such thinks should be 
> helper functions instead if needed.
>
> In this case its only used once, so not sure why we need the define at 
> all.
>
> BR. David
>

Hi, you are right, removed the macros.

>> +#define timespec_zero(ts) \
>> +    ((ts)->tv_sec == 0 && (ts)->tv_nsec == 0)
>> +
>> +int clock_nanosleep(clockid_t clock_id, int flags,
>> +        const struct timespec *rqtp, struct timespec *rmtp)
>> +{
>> +    // Validate timespec
>> +    if (rqtp == NULL || rqtp->tv_sec < 0 ||
>> +            rqtp->tv_nsec < 0 || (unsigned long)rqtp->tv_nsec >= 
>> NSEC_PER_SEC) {
>> +        errno = EINVAL;
>> +        return -1;
>> +    }
>> +
>> +    // Validate clock
>> +    switch (clock_id) {
>> +        case CLOCK_MONOTONIC:
>> +        case CLOCK_REALTIME:
>> +            break;
>> +        default:
>> +            errno = EINVAL;
>> +            return -1;
>> +    }
>> +
>> +    if (flags == TIMER_ABSTIME) {
>> +        struct timespec ts_rel;
>> +        struct timespec ts_now;
>> +
>> +        do {
>> +            // Get current time with requested clock
>> +            if (clock_gettime(clock_id, &ts_now) != 0)
>> +                return -1;
>> +
>> +            // Calculate relative timespec
>> +            timespecs_sub(rqtp, &ts_now, &ts_rel);
>> +
>> +            // Check if time already elapsed
>> +            if (ts_rel.tv_sec < 0 || timespec_zero(&ts_rel)) {
>> +                pthread_testcancel();
>> +                return 0;
>> +            }
>> +
>> +            // "The absolute clock_nanosleep() function has no 
>> effect on the
>> +            // structure referenced by rmtp", so do not pass rmtp 
>> here
>> +        } while (nanosleep(&ts_rel, NULL) == 0);
>> +
>> +        // If nanosleep failed or was interrupted by a signal,
>> +        // return so the caller can handle it appropriately
>> +        return -1;
>> +    } else if (flags == 0) {
>> +        return nanosleep(rqtp, rmtp);
>> +    } else {
>> +        // Invalid flags
>> +        errno = EINVAL;
>> +        return -1;
>> +    }
>> +
>> +    assert(0);
>> +    return -1;
>> +}
>> +
>> +#else
>> +# error clock_nanosleep not implemented on your platform!
>> +#endif
>> diff --git a/configure.ac b/configure.ac
>> index 134cae50a6..c20ab3c75c 100644
>> --- a/configure.ac
>> +++ b/configure.ac
>> @@ -181,7 +181,9 @@ case "${host_os}" in
>>
>>     dnl macOS 10.11 lacks clock_gettime, introduced with 10.12
>>     AC_LIBOBJ([clock_gettime])
>> -    AC_CHECK_FUNCS([clock_gettime])
>> +    dnl macOS lacks clock_nanosleep
>> +    AC_LIBOBJ([clock_nanosleep])
>> +    AC_CHECK_FUNCS([clock_gettime clock_nanosleep])
>>
>>     AC_EGREP_CPP(yes,
>>             [#import <TargetConditionals.h>
>> diff --git a/include/vlc_fixups.h b/include/vlc_fixups.h
>> index 055bcf84d6..a296db0c32 100644
>> --- a/include/vlc_fixups.h
>> +++ b/include/vlc_fixups.h
>> @@ -660,6 +660,9 @@ FILE *vlc_win32_tmpfile(void);
>> # define fdatasync fsync
>>
>> # include <time.h>
>> +# ifndef TIMER_ABSTIME
>> +#  define TIMER_ABSTIME 0x01
>> +# endif
>> # ifndef CLOCK_REALTIME
>> #  define CLOCK_REALTIME 0
>> # endif
>> @@ -669,6 +672,10 @@ FILE *vlc_win32_tmpfile(void);
>> # ifndef HAVE_CLOCK_GETTIME
>> int clock_gettime(clockid_t clock_id, struct timespec *tp);
>> # endif
>> +# ifndef HAVE_CLOCK_NANOSLEEP
>> +int clock_nanosleep(clockid_t clock_id, int flags,
>> +        const struct timespec *rqtp, struct timespec *rmtp);
>> +# endif
>> #endif
>>
>> #ifdef __cplusplus
>> -- 
>> 2.21.1 (Apple Git-122.3)
>>
>> _______________________________________________
>> vlc-devel mailing list
>> To unsubscribe or modify your subscription options:
>> https://mailman.videolan.org/listinfo/vlc-devel
>
> _______________________________________________
> vlc-devel mailing list
> To unsubscribe or modify your subscription options:
> https://mailman.videolan.org/listinfo/vlc-devel


More information about the vlc-devel mailing list