Your suggestion to not warn for emscripten_sleep_with_yield while still 
keeping the warning for emscripten_sleep sounds good to me :) I agree with 
you primarily that this problem applies to a multi-threaded environment on 
the desktop as well. 

In your example below, the value of x could have been changed by another 
thread anyway and compilers typically do not insert a warning for such 
scenarios. The onus is on the developer to manage his global variables 
carefully in a multi-threaded environment. However, considering the lack of 
locks in the Javascript world, it might be clearer to draw a distinction 
between sleep and a sleep with yield.

Just my two cents :)

On Saturday, June 6, 2015 at 1:10:30 AM UTC+8, Alon Zakai wrote:
>
> The reason for the yield list is more conceptual than solving a practical 
> problem. Consider this code
>
> int x = 10;
>
> int func() {
>   printf("%d\n", x);
>   emscripten_sleep(5);
>   printf("%d\n", x);
> }
>
> Normally, we would expect the same value to be printed twice :) But if 
> code runs during the sleep, it is breaking how C and C++ code normally 
> runs, someone could modify that global variable. It isn't "normal" for an 
> event to run in the middle there, and it might not even be valid if the 
> function on the stack has taken a lock, for example. The yieldlist is meant 
> to warn about this type of situation. But yes, as you said, the emterpreter 
> is able to make things work, from its perspective, it is just that the 
> program might have not expected this and have bugs.
>
> Perhaps this is too paranoid, though. This isn't a new problem compared to 
> having multiple threads.
>
> One option is for us to make emscripten_sleep_with_yield automatically 
> allow all code to run during the sleep, without needing a yield list, while 
> emscripten_sleep (and other sync operations) would still warn. Thoughts?
>
> - Alon
>
>
>
> On Fri, Jun 5, 2015 at 10:00 AM, awt <[email protected] <javascript:>> 
> wrote:
>
>> Unfortunately, just a simple mouse over the SDL2 window would require the 
>> following functions to be added to the yield list at least:
>>
>> -s NO_EXIT_RUNTIME=1 -s EMTERPRETIFY=1 -s EMTERPRETIFY_ASYNC=1 *-s 
>> EMTERPRETIFY_YIELDLIST=\"['_Emscripten_HandleMouseMove', 
>> '_Emscripten_HandleMouseFocus', '_SDL_SendMouseMotion', 
>> '_SDL_UpdateMouseFocus', '_SDL_PrivateSendMouseMotion', 
>> '_SDL_GetWindowSize', '_SDL_EventState', '_Emscripten_HandleFocus', 
>> '_SDL_PushEvent', '_SDL_GetTicks', '_SDL_RendererEventWatch', 
>> '_SDL_PeepEvents']\"* -s ASSERTIONS=1 --preload-file image.png -O3 
>> --profiling 
>>
>> That will be 12 functions minimally and I gave up halfway thru. When you 
>> suggest that we queue the events for after the yield, are you saying that 
>> we can run each event handler after the code resumes from the sleep?
>>
>> Perhaps I don't really understand the yield assertions, why do we need 
>> them when all the SDL2 functions are already interpreted? Wouldn't the 
>> interpreter be able to push and pop the interpreted functions off the stack 
>> without the need to check if the functions are inside a yield list?
>>
>> On Saturday, June 6, 2015 at 12:30:44 AM UTC+8, Alon Zakai wrote:
>>>
>>> I think it would be just the mouse handler function, and a key handling 
>>> function, basically one for each event you need? Hopefully no other methods 
>>> would need to be added. Unless the handlers immediately call other code 
>>> instead of queuing.
>>>
>>> The only other approach is to not run compiled code while yielding, for 
>>> example to handle the events in JS and queue them for after the yield. 
>>> Perhaps we could add an option for that, but I worry it could be confusing.
>>>
>>> Maybe another option is to let people disable the yield assertions. 
>>> Again, though I worry this could be confusing.
>>>
>>> - Alon
>>>
>>>
>>> On Fri, Jun 5, 2015 at 2:19 AM, awt <[email protected]> wrote:
>>>
>>>> Thanks for your reply Alon. You are right, I am using 
>>>> emscripten_sleep_with_yield in the following manner:
>>>>
>>>> for (;;)
>>>> {
>>>>     SDL_Event event;
>>>>     while (SDL_PollEvent(&event)) {
>>>> EventHandler(0, &event);
>>>>     }
>>>>     emscripten_sleep_with_yield(100);
>>>> }
>>>>
>>>> The aim is to simulate a message loop in my application while still 
>>>> consuming mouse and keyboard events from the user. Going by the YIELDLIST 
>>>> method, I will end up with a large number of internal SDL functions in my 
>>>> list which is hard to maintain. There will also be other proprietary 
>>>> functions that I will need to add as well. 
>>>>
>>>> In SDL1, we had emscripten_SDL_SetEventHandler that could abstract 
>>>> away the SDL internal functions but that function seems to be missing from 
>>>> the Emscripten SDL2 port. 
>>>>
>>>> Do you have any suggestions on how we can reduce the number of 
>>>> functions in the YIELDLIST or another method to get around this?
>>>>
>>>> On Friday, June 5, 2015 at 12:55:59 AM UTC+8, Alon Zakai wrote:
>>>>>
>>>>> Based on the stack trace, that method is called from a JavaScript 
>>>>> event handler, I guess during a sleep. To enable that, you need to add 
>>>>> the 
>>>>> method to the YIELDLIST, which is a list of methods that are ok to call 
>>>>> during sleep.
>>>>>
>>>>> The only other option is for emscripten to automatically delay the 
>>>>> event until after the sleep, I'm not sure if we considered doing that or 
>>>>> not, but in general it seems like it would make events show up later than 
>>>>> expected.
>>>>>
>>>>> - Alon
>>>>>
>>>>>
>>>>> On Thu, Jun 4, 2015 at 3:54 AM, awt <[email protected]> wrote:
>>>>>
>>>>>> Hi,
>>>>>>
>>>>>> I created a simple SDL2 application with the following pseudo code:
>>>>>>
>>>>>> 1. SDL_Init with SDL_INIT_VIDEO
>>>>>> 2. SDL_CreateWindow
>>>>>> 3. SDL_CreateRenderer
>>>>>> 4. IMG_LoadTexture
>>>>>> 5. SDL_QueryTexture
>>>>>>
>>>>>> After this, I try to start up my own message loop in the following 
>>>>>> manner:
>>>>>>
>>>>>> for (;;)
>>>>>> {
>>>>>>     while ((1<=SDL_PeepEvents(&e, 1, SDL_GETEVENT, SDL_QUIT, 
>>>>>> SDL_LASTEVENT)))
>>>>>>     {
>>>>>>         //If user closes the window
>>>>>> switch (e.type)
>>>>>> {
>>>>>>     case SDL_QUIT:
>>>>>>     {
>>>>>>         cout << " SDL_QUIT received!!!";
>>>>>> quitApp();
>>>>>> return;
>>>>>>     }
>>>>>>     default:
>>>>>>         break;
>>>>>> }
>>>>>>     }
>>>>>>     emscripten_sleep(10);
>>>>>> }
>>>>>>
>>>>>> But when I click on the window, I get the following assert:
>>>>>>
>>>>>> Uncaught abort(-12) at Error
>>>>>>     at jsStackTrace 
>>>>>> (file:///C:/work/git/SDLPrototypes/EventHandling/src/build/EventHandling.js:1325:13)
>>>>>>     at stackTrace 
>>>>>> (file:///C:/work/git/SDLPrototypes/EventHandling/src/build/EventHandling.js:1342:22)
>>>>>>     at abort 
>>>>>> (file:///C:/work/git/SDLPrototypes/EventHandling/src/build/EventHandling.js:33928:44)
>>>>>>     at Array._Emscripten_HandleMouseFocus 
>>>>>> (file:///C:/work/git/SDLPrototypes/EventHandling/src/build/EventHandling.js:22365:54)
>>>>>>     at dynCall_iiii 
>>>>>> (file:///C:/work/git/SDLPrototypes/EventHandling/src/build/EventHandling.js:31705:40)
>>>>>>     at Object.Runtime.dynCall 
>>>>>> (file:///C:/work/git/SDLPrototypes/EventHandling/src/build/EventHandling.js:426:39)
>>>>>>     at Object.handlerFunc 
>>>>>> (file:///C:/work/git/SDLPrototypes/EventHandling/src/build/EventHandling.js:1943:38)
>>>>>>     at HTMLCanvasElement.jsEventHandler 
>>>>>> (file:///C:/work/git/SDLPrototypes/EventHandling/src/build/EventHandling.js:1846:24)
>>>>>> This error happened during an emterpreter-async save or load of the 
>>>>>> stack. Was there non-emterpreted code on the stack during save (which is 
>>>>>> unallowed)? You may want to adjust EMTERPRETIFY_BLACKLIST, 
>>>>>> EMTERPRETIFY_WHITELIST, or EMTERPRETIFY_YIELDLIST (to consider certain 
>>>>>> functions ok to run during an emscripten_sleep_with_yield).
>>>>>> This is what the stack looked like when we tried to save it: 1,Error
>>>>>>     at jsStackTrace 
>>>>>> (file:///C:/work/git/SDLPrototypes/EventHandling/src/build/EventHandling.js:1325:13)
>>>>>>     at stackTrace 
>>>>>> (file:///C:/work/git/SDLPrototypes/EventHandling/src/build/EventHandling.js:1342:22)
>>>>>>     at Object.EmterpreterAsync.handle 
>>>>>> (file:///C:/work/git/SDLPrototypes/EventHandling/src/build/EventHandling.js:8744:40)
>>>>>>     at _emscripten_sleep 
>>>>>> (file:///C:/work/git/SDLPrototypes/EventHandling/src/build/EventHandling.js:8767:24)
>>>>>>     at emterpret 
>>>>>> (file:///C:/work/git/SDLPrototypes/EventHandling/src/build/EventHandling.js:13021:6)
>>>>>>     at Object.emterpret 
>>>>>> (file:///C:/work/git/SDLPrototypes/EventHandling/src/build/EventHandling.js:12504:4)
>>>>>>     at resume 
>>>>>> (file:///C:/work/git/SDLPrototypes/EventHandling/src/build/EventHandling.js:8737:17)
>>>>>>     at 
>>>>>> file:///C:/work/git/SDLPrototypes/EventHandling/src/build/EventHandling.js:8770:11
>>>>>>
>>>>>> I find this strange because I am compiling with the following linker 
>>>>>> flags:
>>>>>> -s NO_EXIT_RUNTIME=1 -s EMTERPRETIFY=1 -s EMTERPRETIFY_ASYNC=1 -s 
>>>>>> ASSERTIONS=1 --preload-file image.png -O3 -g3
>>>>>>
>>>>>> These are my compiler flags:
>>>>>> -s USE_SDL=2 -s USE_SDL_IMAGE=2 -s ASSERTIONS=1 -O3 -g3 -D_DEBUG_ 
>>>>>> -D_DEBUG
>>>>>>
>>>>>> Since I did not specify any whitelist, I presume that all the code in 
>>>>>> my generated javascript should already be emterpreted. But somehow, 
>>>>>> _Emscripten_HandleMouseFocus isn't able to handle async states properly 
>>>>>> as 
>>>>>> this leads to a -12 abort.
>>>>>>
>>>>>> Does this mean that I have to manually add all "handle mouse" 
>>>>>> functions into the white or yield list? Or is there a better way around 
>>>>>> it? 
>>>>>> I am on emsdk 1.30.0.
>>>>>>
>>>>>>  -- 
>>>>>> You received this message because you are subscribed to the Google 
>>>>>> Groups "emscripten-discuss" group.
>>>>>> To unsubscribe from this group and stop receiving emails from it, 
>>>>>> send an email to [email protected].
>>>>>> For more options, visit https://groups.google.com/d/optout.
>>>>>>
>>>>>
>>>>>  -- 
>>>> You received this message because you are subscribed to the Google 
>>>> Groups "emscripten-discuss" group.
>>>> To unsubscribe from this group and stop receiving emails from it, send 
>>>> an email to [email protected].
>>>> For more options, visit https://groups.google.com/d/optout.
>>>>
>>>
>>>  -- 
>> You received this message because you are subscribed to the Google Groups 
>> "emscripten-discuss" group.
>> To unsubscribe from this group and stop receiving emails from it, send an 
>> email to [email protected] <javascript:>.
>> For more options, visit https://groups.google.com/d/optout.
>>
>
>

-- 
You received this message because you are subscribed to the Google Groups 
"emscripten-discuss" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
For more options, visit https://groups.google.com/d/optout.

Reply via email to