X-Git-Url: http://winboard.nl/cgi-bin?p=polyglot.git;a=blobdiff_plain;f=engine.c;h=5ed6ed76e6dd487c279df909826823c31d73c796;hp=4dffd4aa53fdb04437204a0d43a857db5d9cb2f2;hb=HEAD;hpb=e15efca6667b2673b4c1a5879a6917eab6800e58 diff --git a/engine.c b/engine.c index 4dffd4a..5ed6ed7 100644 --- a/engine.c +++ b/engine.c @@ -1,120 +1,112 @@ -// engine.c - -// includes - -#include -#include -#include -#include - - -#include "engine.h" -#include "option.h" -#include "pipex.h" -#include "util.h" - -// defines - -#define StringSize 4096 - -// variables - -static int write_index = 0; -static char write_buffer[StringSize]; -engine_t Engine[1]; - -// functions - -// set_affinity() - -void set_affinity(engine_t *engine, int value){ - pipex_set_affinity(engine->pipex,value); -} - -// engine_set_nice_value() - -void engine_set_nice_value(engine_t *engine, int value){ - pipex_set_priority(engine->pipex,value); -} - -// engine_send_queue() - -void engine_send_queue(engine_t * engine, const char *format, ...) { - if(write_index>=StringSize){ - my_fatal("engine_send_queue(): write_buffer overflow\n"); - } - write_index += vsnprintf(write_buffer + write_index, - StringSize-write_index, - format, - (va_list) (&format + 1)); -} - -// engine_send() - -void engine_send(engine_t * engine, const char *format, ...) { - if(write_index>=StringSize){ - my_fatal("engine_send(): write_buffer overflow\n"); - } - vsnprintf(write_buffer + write_index, - StringSize-write_index, - format, - (va_list) (&format + 1)); - pipex_writeln(engine->pipex,write_buffer); - write_index = 0; -} - -// engine_close() - -void engine_close(engine_t * engine){ - char string[StringSize]; - pipex_send_eof(engine->pipex); - // TODO: Timeout - while (!engine_eof(engine)) { - engine_get(Engine,string); - } - pipex_exit(engine->pipex); -} - -// engine_open() - -void engine_open(engine_t * engine){ - int affinity; - char *my_dir; - if( (my_dir = my_getcwd( NULL, 0 )) == NULL ) - my_fatal("engine_open(): no current directory: %s\n",strerror(errno)); - if(my_chdir(option_get_string("EngineDir"))){ - my_fatal("engine_open(): cannot change directory: %s\n",strerror(errno)); - } - pipex_open(engine->pipex,"Engine",option_get_string("EngineCommand")); - if(pipex_active(engine->pipex)){ - //play with affinity (bad idea) - affinity=option_get_int("Affinity"); - if(affinity!=-1) set_affinity(engine,affinity); //AAA - //lets go back - my_chdir(my_dir); - // set a low priority - if (option_get_bool("UseNice")){ - my_log("POLYGLOT Adjust Engine Piority\n"); - engine_set_nice_value(engine, option_get_int("NiceValue")); - } - } - -} - -bool engine_active(engine_t *engine){ - return pipex_active(engine->pipex); -} - -bool engine_eof(engine_t *engine){ - return pipex_eof(engine->pipex); -} - -bool engine_get_non_blocking(engine_t * engine, char *string){ - return pipex_readln_nb(engine->pipex,string); - } - -void engine_get(engine_t * engine, char *string){ - pipex_readln(engine->pipex,string); -} - - +// engine.c + +// includes + +#include +#include +#include +#include + +#include "engine.h" +#include "option.h" +#include "pipex.h" +#include "util.h" + +// variables + +engine_t Engine[1]; + +// functions + +// set_affinity() + +void set_affinity(engine_t *engine, int value){ + pipex_set_affinity(engine->pipex,value); +} + +// engine_set_nice_value() + +void engine_set_nice_value(engine_t *engine, int value){ + pipex_set_priority(engine->pipex,value); +} + +// engine_send_queue() + +void engine_send_queue(engine_t * engine, const char *format, ...) { + char buf[FormatBufferSize]; + CONSTRUCT_ARG_STRING(format,buf); + pipex_write(engine->pipex,buf); +} + +// engine_send() + +void engine_send(engine_t * engine, const char *format, ...) { + char buf[FormatBufferSize]; + CONSTRUCT_ARG_STRING(format,buf); + pipex_writeln(engine->pipex,buf); +} + +// engine_close() + +void engine_close(engine_t * engine){ + char string[StringSize]; + int elapsed_time; + int ret; + int close_timeout=500; + my_log("POLYGLOT Closing engine.\n"); + pipex_send_eof(engine->pipex); + // TODO: Timeout + + elapsed_time=0; + while (!engine_eof(engine) && (elapsed_time=close_timeout){ + my_log("POLYGLOT Waited more than %dms. Moving on.\n",close_timeout); + } + pipex_exit(engine->pipex,200); +} + +// engine_open() + +void engine_open(engine_t * engine){ + int affinity; + pipex_open(engine->pipex, + "Engine", + option_get_string(Option,"EngineDir"), + option_get_string(Option,"EngineCommand")); + if(pipex_active(engine->pipex)){ + //play with affinity (bad idea) + affinity=option_get_int(Option,"Affinity"); + if(affinity!=-1) set_affinity(engine,affinity); //AAA + // set a low priority + if (option_get_bool(Option,"UseNice")){ + my_log("POLYGLOT Adjust Engine Piority\n"); + engine_set_nice_value(engine, option_get_int(Option,"NiceValue")); + } + } + +} + +bool engine_active(engine_t *engine){ + return pipex_active(engine->pipex); +} + +bool engine_eof(engine_t *engine){ + return pipex_eof(engine->pipex); +} + +bool engine_get_non_blocking(engine_t * engine, char *string){ + return pipex_readln_nb(engine->pipex,string); + } + +void engine_get(engine_t * engine, char *string){ + pipex_readln(engine->pipex,string); +} + +