version 1.4.58b
[polyglot.git] / engine.c
1 // engine.c\r
2 \r
3 // includes\r
4 \r
5 #include <stdlib.h>\r
6 #include <stdarg.h>\r
7 #include <string.h>\r
8 #include <errno.h>\r
9 \r
10 #include "engine.h"\r
11 #include "option.h"\r
12 #include "pipex.h"\r
13 #include "util.h"\r
14 \r
15 // variables\r
16 \r
17 engine_t Engine[1];\r
18 #define StringSize ((int)4096)\r
19 \r
20 // functions\r
21 \r
22 // set_affinity()\r
23 \r
24 void set_affinity(engine_t *engine, int value){\r
25     pipex_set_affinity(engine->pipex,value);\r
26 }\r
27 \r
28 // engine_set_nice_value()\r
29 \r
30 void engine_set_nice_value(engine_t *engine, int value){\r
31     pipex_set_priority(engine->pipex,value);\r
32 }\r
33 \r
34 // engine_send_queue()\r
35 \r
36 void engine_send_queue(engine_t * engine, const char *format, ...) {\r
37     char buf[FormatBufferSize];\r
38     CONSTRUCT_ARG_STRING(format,buf);\r
39     pipex_write(engine->pipex,buf);\r
40 }\r
41 \r
42 // engine_send()\r
43 \r
44 void engine_send(engine_t * engine, const char *format, ...) {\r
45     char buf[FormatBufferSize];\r
46     CONSTRUCT_ARG_STRING(format,buf);\r
47     pipex_writeln(engine->pipex,buf);\r
48 }\r
49 \r
50 // engine_close()\r
51 \r
52 void engine_close(engine_t * engine){\r
53     char string[StringSize];\r
54     int elapsed_time;\r
55     int ret;\r
56     int close_timeout=500;\r
57     my_log("POLYGLOT Closing engine.\n");\r
58     pipex_send_eof(engine->pipex);\r
59         // TODO: Timeout\r
60 \r
61     elapsed_time=0;\r
62     while (!engine_eof(engine) && (elapsed_time<close_timeout)) { \r
63       ret=engine_get_non_blocking(engine,string);\r
64       if(!ret  && !engine_eof(engine)){\r
65         my_log("POLYGLOT Engine does not reply. Sleeping %dms.\n", WAIT_GRANULARITY);\r
66         my_sleep(WAIT_GRANULARITY);\r
67         elapsed_time+=WAIT_GRANULARITY;\r
68       }\r
69     }\r
70     if(elapsed_time>=close_timeout){\r
71       my_log("POLYGLOT Waited more than %dms. Moving on.\n",close_timeout); \r
72     }\r
73     pipex_exit(engine->pipex,200);\r
74 }\r
75 \r
76 // engine_open()\r
77 \r
78 void engine_open(engine_t * engine){\r
79     int affinity;\r
80     pipex_open(engine->pipex,\r
81                "Engine",\r
82                option_get_string(Option,"EngineDir"),\r
83                option_get_string(Option,"EngineCommand"));\r
84     if(pipex_active(engine->pipex)){\r
85             //play with affinity (bad idea)\r
86         affinity=option_get_int(Option,"Affinity");\r
87         if(affinity!=-1) set_affinity(engine,affinity); //AAA\r
88             // set a low priority\r
89         if (option_get_bool(Option,"UseNice")){\r
90             my_log("POLYGLOT Adjust Engine Piority\n");\r
91             engine_set_nice_value(engine, option_get_int(Option,"NiceValue"));\r
92         }\r
93     }\r
94     \r
95 }\r
96 \r
97 bool engine_active(engine_t *engine){\r
98     return pipex_active(engine->pipex);\r
99 }\r
100 \r
101 bool engine_eof(engine_t *engine){\r
102     return pipex_eof(engine->pipex);\r
103 }\r
104 \r
105 bool engine_get_non_blocking(engine_t * engine, char *string){\r
106     return pipex_readln_nb(engine->pipex,string);\r
107  }\r
108 \r
109 void engine_get(engine_t * engine, char *string){\r
110     pipex_readln(engine->pipex,string);\r
111 }\r
112 \r
113 \r