From 4b2e076784b6bfd57781000e1ec809a1dc7ba4a1 Mon Sep 17 00:00:00 2001 From: H.G.Muller Date: Sat, 26 Nov 2016 13:56:16 +0100 Subject: [PATCH] Only resend changed options on xreuse restart For engines that specify reuse=1, a new engine process is started for every game. This new process is made aware of the option settings as they were specified by the user during the live of its predecessors. Now this resending is limited to the options that have different value from their original default. To achieve that, the default values are now remembered (in the last 104 bytes of the Option.name buffer, which was allocated way too large): 4 bytes for integet value, 99 char text. --- backend.c | 10 ++++++++-- 1 files changed, 8 insertions(+), 2 deletions(-) diff --git a/backend.c b/backend.c index c18fa3e..2f3db5e 100644 --- a/backend.c +++ b/backend.c @@ -10935,23 +10935,27 @@ ResendOptions (ChessProgramState *cps) char buf[MSG_SIZ]; Option *opt = cps->option; for(i=0; inrOptions; i++, opt++) { + *buf = NULLCHAR; switch(opt->type) { case Spin: case Slider: case CheckBox: + if(opt->value != *(int*) (opt->name + MSG_SIZ - 104)) snprintf(buf, MSG_SIZ, "option %s=%d\n", opt->name, opt->value); break; case ComboBox: - snprintf(buf, MSG_SIZ, "option %s=%s\n", opt->name, opt->choice[opt->value]); + if(opt->value != *(int*) (opt->name + MSG_SIZ - 104)) + snprintf(buf, MSG_SIZ, "option %s=%s\n", opt->name, opt->choice[opt->value]); break; default: + if(strcmp(opt->textValue, opt->name + MSG_SIZ - 100)) snprintf(buf, MSG_SIZ, "option %s=%s\n", opt->name, opt->textValue); break; case Button: case SaveButton: continue; } - SendToProgram(buf, cps); + if(*buf) SendToProgram(buf, cps); } } @@ -17281,6 +17285,8 @@ ParseOption (Option *opt, ChessProgramState *cps) strcat(buf, "\n"); SendToProgram(buf, cps); } + *(int*) (opt->name + MSG_SIZ - 104) = opt->value; // hide default values somewhere + if(opt->target == &opt->textValue) strncpy(opt->name + MSG_SIZ - 100, opt->textValue, 99); return TRUE; } -- 1.7.0.4