Show
Ignore:
Timestamp:
04/16/09 03:41:58 (4 years ago)
Author:
saturday06
Message:

いたすと

Files:
1 modified

Legend:

Unmodified
Added
Removed
  • lang/objective-cplusplus/i3/trunk/src/mil/include/mil/gui-windows/GuiModule.h

    r32290 r32468  
    4040    PVOID breakLoopRequest; 
    4141    //DWORD_PTR destroyed; 
    42     PVOID destroyed; 
     42    atomic<PVOID> destroyed; 
    4343 
    4444    bool repost; 
     
    5050 
    5151public: 
    52     pool::Producer producer; 
    53     pool::Consumer consumer; 
     52    Tls tls; 
    5453 
    5554    GuiModule() :  
     
    6665 
    6766    ~GuiModule() { 
    68         if (!IsWindow(getWindow())) { 
     67        HWND w = getWindow(); 
     68        if (!IsWindow(w)) 
     69        { 
    6970            return; 
    7071        } 
    7172        wndproc.inactivate(); 
     73        if (DestroyWindow(w) == 0) 
     74        { 
     75            // error 
     76            DebugBreak(); 
     77        } 
    7278    } 
    7379 
     
    105111            } 
    106112 
    107             pool::MemoryList* m = target.consumer.work(&event); 
     113            pool::MemoryList* m = target.tls.consumer.work(&event); 
    108114            if (!m) { 
    109115                return; 
     
    116122                return; 
    117123            } 
    118             (reinterpret_cast<GuiModule<Child> * >(t))->post(e, target.producer); 
     124            (reinterpret_cast<GuiModule<Child> * >(t))->post(e, target.tls); 
    119125        } 
    120126    }; 
     
    141147    { 
    142148        //PostQuitMessage(0); 
    143         InterlockedExchangePointer(&breakLoopRequest, (PVOID)1); 
    144         if (InterlockedExchangePointer(&destroyed, (PVOID)1) != 0) 
    145         { 
    146             return; 
    147         } 
    148         HWND w = getWindow(); 
    149         if (!IsWindow(w)) 
    150         { 
    151             return; 
    152         } 
    153         if (DestroyWindow(w) == 0) 
    154         { 
    155             // error 
    156             DebugBreak(); 
    157         } 
     149        breakLoopRequest = (PVOID)1; 
     150        destroyed.store((PVOID)1); 
    158151    } 
    159152 
    160153    void loop() 
    161154    { 
    162         if (InterlockedCompareExchangePointer((PVOID*)&breakLoopRequest, NULL, NULL)) 
    163         { 
    164             //PostQuitMessage(0); 
    165             return; 
    166         } 
    167  
    168         if (!IsWindow(this->hLocalWnd)) { 
     155        if (breakLoopRequest || destroyed.load() || !IsWindow(this->hLocalWnd)) { 
    169156            return; 
    170157        } 
    171158 
    172159        MSG msg = {}; 
    173         for (;;) 
     160        while (__builtin_expect(!breakLoopRequest, true)) 
    174161        { 
    175162            BOOL result = GetMessage(&msg, NULL, 0, 0); 
     
    190177 
    191178    template <typename T> 
    192     void post(const T& event, mil::pool::Producer& sender_producer) 
    193     { 
    194         HWND hWnd = getWindow(); 
    195         if (!hWnd) 
    196         { 
    197             // error 
    198             return; 
    199         } 
     179    void post(const T& event, mil::Tls& sender_tls) 
     180    { 
     181        HWND hWnd = sender_tls.thread[thread_id].hWnd; 
     182        if (__builtin_expect(!hWnd, false)) { 
     183            hWnd = getWindow(); 
     184            if (!IsWindow(hWnd)) { 
     185                return; 
     186            } 
     187            sender_tls.thread[thread_id].hWnd = hWnd; 
     188        } 
     189 
    200190        if (sizeof(T) <= sizeof(LPARAM)) 
    201191        { 
     
    207197            return; 
    208198        } 
    209         void* p = sender_producer.malloc<sizeof(Event<T>)>(); 
     199 
     200        void* p = sender_tls.producer.malloc<sizeof(Event<T>)>(); 
    210201        if (p == NULL) 
    211202        { 
     
    213204            return; 
    214205        } 
     206 
    215207        Event<T>* e = new(p) Event<T>; 
    216208        e->data = event; 
     
    248240            return 0; 
    249241        } else if (msg == WM_DESTROY || msg == WM_QUIT) { 
    250             InterlockedExchangePointer(&destroyed, (PVOID)1); 
     242            destroy(); 
    251243        } 
    252244