version 1.4w10UCIb17
[polyglot.git] / mainloop.cpp
1 // mainloop.cpp\r
2 \r
3 // constants\r
4 \r
5 static const int StringSize = 4096;\r
6 \r
7 // includes\r
8 \r
9 #include <cerrno>\r
10 #include <cstdio>\r
11 #include <cstdlib>\r
12 #include <cstring>\r
13 \r
14 #ifndef _WIN32\r
15 #include <sys/select.h>\r
16 #include <sys/types.h> // Mac OS X needs this one\r
17 #include <unistd.h>\r
18 #endif\r
19 \r
20 #include "main.h"\r
21 #include "engine.h"\r
22 #include "gui.h"\r
23 #include "option.h"\r
24 #include "xboard2uci.h"\r
25 #include "uci2uci.h"\r
26 \r
27 // prototypes\r
28 \r
29 static void mainloop_step      ();\r
30 static void mainloop_init();\r
31 static void mainloop_engine_step(char * string);\r
32 static void mainloop_gui_step(char * string);\r
33 \r
34 // mainloop_init()\r
35     \r
36 static void mainloop_init(){\r
37     if(!option_get_bool("UCI")){\r
38         xboard_init();\r
39     }\r
40 }\r
41 \r
42 // mainloop_engine_step()\r
43 \r
44 static void mainloop_engine_step(char * string){\r
45     if(option_get_bool("UCI")){\r
46        uci_engine_step(string); \r
47     }else{\r
48         engine_step(string);\r
49     }\r
50 }\r
51 \r
52 // mainloop_gui_step()\r
53 \r
54 static void mainloop_gui_step(char * string){\r
55     if(option_get_bool("UCI")){\r
56         uci_gui_step(string); \r
57     }else{\r
58         xboard_step(string);\r
59     }  \r
60 }\r
61 \r
62 \r
63 \r
64 // mainloop()\r
65 \r
66 void mainloop() {\r
67     mainloop_init();\r
68     while (!engine_eof(Engine)) mainloop_step();\r
69     my_log("POLYGLOT *** EOF file received from engine ***");\r
70 }\r
71 \r
72 // adapter_step()\r
73 \r
74 #ifdef _WIN32\r
75 static void mainloop_step(){  // polling!\r
76     bool xin,ein;\r
77     char string[StringSize];\r
78     xin=gui_get_non_blocking(GUI,string,StringSize);\r
79     if(xin) mainloop_gui_step(string);\r
80     ein=engine_get_non_blocking(Engine,string,StringSize);\r
81     if(ein) mainloop_engine_step(string);\r
82     if(xin==false && ein==false) Idle();//nobody wants me,lets have a beauty nap\r
83 }\r
84 #else\r
85 static void mainloop_step() {\r
86 \r
87    fd_set set[1];\r
88    int fd_max;\r
89    int val;\r
90    char string[StringSize];\r
91 \r
92        // process buffered lines\r
93 \r
94    while (io_line_ready(GUI->io)){\r
95        gui_get(GUI,string,StringSize);\r
96        mainloop_gui_step(string);\r
97    }\r
98    while (!engine_eof(Engine) && io_line_ready(Engine->io)){\r
99        engine_get(Engine,string,StringSize);\r
100        mainloop_engine_step(string);\r
101    }\r
102 \r
103    // init\r
104 \r
105    FD_ZERO(set);\r
106    fd_max = -1; // HACK\r
107 \r
108    // add xboard input\r
109 \r
110    ASSERT(GUI->io->in_fd>=0);\r
111 \r
112    FD_SET(GUI->io->in_fd,set);\r
113    if (GUI->io->in_fd > fd_max) fd_max = GUI->io->in_fd;\r
114 \r
115    // add engine input\r
116 \r
117    ASSERT(Engine->io->in_fd>=0);\r
118 \r
119    FD_SET(Engine->io->in_fd,set);\r
120    if (Engine->io->in_fd > fd_max) fd_max = Engine->io->in_fd;\r
121 \r
122    // wait for something to read (no timeout)\r
123 \r
124    ASSERT(fd_max>=0);\r
125    val = select(fd_max+1,set,NULL,NULL,NULL);\r
126    if (val == -1 && errno != EINTR) my_fatal("adapter_step(): select(): %s\n",strerror(errno));\r
127 \r
128    if (val > 0) {\r
129       if (FD_ISSET(GUI->io->in_fd,set)) io_get_update(GUI->io); // read some xboard input\r
130       if (FD_ISSET(Engine->io->in_fd,set)) io_get_update(Engine->io); // read some engine input\r
131    }\r
132 }\r
133 #endif\r
134 \r