X-Git-Url: http://winboard.nl/cgi-bin?p=polyglot.git;a=blobdiff_plain;f=mainloop.cpp;h=ffef0c9cb335e322067d59cd680cd2ea69ac3bd8;hp=0d5a8f0f16823a67a11a9808d78dbe82577b96ec;hb=5cd5185613348b13625e257efcd7b2f11ca85276;hpb=ad2265d4fc54fc9ba99fc606e6174df34bfb4a0f diff --git a/mainloop.cpp b/mainloop.cpp index 0d5a8f0..ffef0c9 100644 --- a/mainloop.cpp +++ b/mainloop.cpp @@ -26,16 +26,18 @@ static const int StringSize = 4096; // prototypes -static void mainloop_step (); -static void mainloop_init(); +static void mainloop_init (); +static void mainloop_wait_for_event (); static void mainloop_engine_step(char * string); static void mainloop_gui_step(char * string); +// functions + // mainloop_init() static void mainloop_init(){ if(!option_get_bool("UCI")){ - xboard_init(); + xboard2uci_init(); // the default } } @@ -43,9 +45,9 @@ static void mainloop_init(){ static void mainloop_engine_step(char * string){ if(option_get_bool("UCI")){ - uci_engine_step(string); + uci2uci_engine_step(string); }else{ - engine_step(string); + xboard2uci_engine_step(string); } } @@ -53,59 +55,65 @@ static void mainloop_engine_step(char * string){ static void mainloop_gui_step(char * string){ if(option_get_bool("UCI")){ - uci_gui_step(string); + uci2uci_gui_step(string); + }else if(my_string_equal(string,"uci")){ // mode auto detection + my_log("POLYGLOT *** Switching to UCI mode ***\n"); + option_set("UCI","true"); + uci2uci_gui_step(string); }else{ - xboard_step(string); - } + xboard2uci_gui_step(string); + } } - - // mainloop() void mainloop() { + char string[StringSize]; mainloop_init(); - while (!engine_eof(Engine)) mainloop_step(); - my_log("POLYGLOT *** EOF file received from engine ***"); + while (!engine_eof(Engine)) { + // process buffered lines + while(TRUE){ + if(gui_get_non_blocking(GUI,string,StringSize)){ + mainloop_gui_step(string); + }else if(!engine_eof(Engine) && + engine_get_non_blocking(Engine,string,StringSize) ){ + mainloop_engine_step(string); + }else{ + break; + } + } + mainloop_wait_for_event(); + } + my_log("POLYGLOT *** EOF file received from engine ***\n"); } -// adapter_step() + + +// mainloop_wait_for_event() + +static void mainloop_wait_for_event(){ #ifdef _WIN32 -static void mainloop_step(){ // polling! - bool xin,ein; + HANDLE hHandles[2]; char string[StringSize]; - xin=gui_get_non_blocking(GUI,string,StringSize); - if(xin) mainloop_gui_step(string); - ein=engine_get_non_blocking(Engine,string,StringSize); - if(ein) mainloop_engine_step(string); - if(xin==false && ein==false) Idle();//nobody wants me,lets have a beauty nap -} + hHandles[0]=(GUI->io).hEvent; + hHandles[1]=(Engine->io).hEvent; + WaitForMultipleObjects(2, // count + hHandles, // + FALSE, // return if one object is signaled + INFINITE // no timeout + ); #else -static void mainloop_step() { - fd_set set[1]; int fd_max; int val; char string[StringSize]; - - // process buffered lines - - while (io_line_ready(GUI->io)){ - gui_get(GUI,string,StringSize); - mainloop_gui_step(string); - } - while (!engine_eof(Engine) && io_line_ready(Engine->io)){ - engine_get(Engine,string,StringSize); - mainloop_engine_step(string); - } - // init FD_ZERO(set); fd_max = -1; // HACK - // add xboard input + // add gui input ASSERT(GUI->io->in_fd>=0); @@ -128,7 +136,9 @@ static void mainloop_step() { if (val > 0) { if (FD_ISSET(GUI->io->in_fd,set)) io_get_update(GUI->io); // read some xboard input if (FD_ISSET(Engine->io->in_fd,set)) io_get_update(Engine->io); // read some engine input - } -} + } #endif +} + +