Previous 199869 Revisions Next

r34236 Wednesday 7th January, 2015 at 15:42:16 UTC by Oliver Stöneberg
osd_work: use the non-yield implementation of spin_while() for all platforms (nw)

futher tests have shown there is no actual speed difference - and it
reduces the CPU load even more
[src/osd/modules/sync]work_osd.c

trunk/src/osd/modules/sync/work_osd.c
r242747r242748
7676#define end_timing(v)           do { } while (0)
7777#endif
7878
79// TODO: move this in a common place
80#if defined(OSD_WINDOWS)
81#if __GNUC__ && defined(__i386__) && !defined(__x86_64)
82#undef YieldProcessor
83#endif
84
85#ifndef YieldProcessor
86#ifdef __GNUC__
87INLINE void osd_yield_processor(void)
88{
89   __asm__ __volatile__ ( "rep; nop" );
90}
91#else
92INLINE void osd_yield_processor(void)
93{
94   __asm { rep nop }
95}
96#endif
97#else
98#define osd_yield_processor YieldProcessor
99#endif
100#endif
101
10279template<typename _PtrType>
10380static void spin_while(const volatile _PtrType * volatile ptr, const _PtrType val, const osd_ticks_t timeout, const int invert = 0)
10481{
10582    osd_ticks_t stopspin = osd_ticks() + timeout;
10683
107#if defined(OSD_WINDOWS)
108    while (((*ptr == val) ^ invert) && osd_ticks() < stopspin)
109        osd_yield_processor();
110#else
11184    do {
11285        int spin = 10000;
11386        while (--spin)
11487        {
115            //osd_yield_processor();
11688            if ((*ptr == val) ^ invert)
11789                return;
11890        }
11991    } while (((*ptr == val) ^ invert) && osd_ticks() < stopspin);
120#endif
12192}
12293
12394template<typename _PtrType>


Previous 199869 Revisions Next


© 1997-2024 The MAME Team