少年修仙传客户端基础资源
hch
2024-04-01 d01413b00ef631ac20347716b23818b0b811f65f
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
#pragma once
 
#include "NonCopyable.h"
#include "../os/Atomic.h"
#include "../os/Mutex.h"
 
namespace il2cpp
{
namespace utils
{
    typedef void (*CallOnceFunc) (void* arg);
 
    struct OnceFlag : NonCopyable
    {
        OnceFlag() : m_Flag(NULL)
        {
        }
 
        friend void CallOnce(OnceFlag& flag, CallOnceFunc func, void* arg);
 
        bool IsSet()
        {
            return il2cpp::os::Atomic::ReadPointer(&m_Flag) ? true : false;
        }
 
    private:
        void* m_Flag;
        il2cpp::os::FastMutex m_Mutex;
    };
 
    inline void CallOnce(OnceFlag& flag, CallOnceFunc func, void* arg)
    {
        if (!il2cpp::os::Atomic::ReadPointer(&flag.m_Flag))
        {
            os::FastAutoLock lock(&flag.m_Mutex);
            if (!il2cpp::os::Atomic::ReadPointer(&flag.m_Flag))
            {
                func(arg);
                il2cpp::os::Atomic::ExchangePointer(&flag.m_Flag, (void*)1);
            }
        }
    }
}
}