Ticket #30: arend_7_7.7-regress.pike_locking.diff

File arend_7_7.7-regress.pike_locking.diff, 5.0 kB (added by arend, 3 years ago)

Revise synchronization between threads; localize write_queue.

  • regression/regress.pike

    old new  
    11#!/usr/bin/env pike 
    22 
    3 static Thread.Queue write_queue; 
    4 static Thread.Condition cond; 
    5 static Thread.Mutex condmutex; 
    6 static Thread.MutexKey condmutexkey; 
     3static Thread.Queue writing_finished; 
     4static Thread.Queue reading_finished; 
    75static int debug = 0; 
    86static object machine; 
    97static mapping(int:string) correct_results = ([]); 
     
    9492Highscorelist slow_moves; 
    9593int report_slow = 0; 
    9694 
    97 void send(string|void s) 
     95void send(Thread.Queue out, string|void s) 
    9896{ 
    9997  if (!s) { 
    10098    if (debug) 
    10199      werror("Finishing sending.\n"); 
    102     write_queue->write(""); 
    103100  } 
    104101  else { 
    105102    if (debug) 
    106103      werror("Sent: " + s + "\n"); 
    107     write_queue->write(s + "\n"); 
     104    out->write(s + "\n"); 
    108105  } 
    109106} 
    110107 
     
    114111        current_testsuite->cputime, 
    115112        current_testsuite->reading_nodes, current_testsuite->owl_nodes, 
    116113        current_testsuite->connection_nodes); 
    117   cond->signal(); 
    118114} 
    119115 
    120116static void program_reader(object f) 
     
    126122  array(int) unexpected_failures = ({}); 
    127123  array(int) unexpected_passes = ({}); 
    128124  int test_number; 
     125  if (debug) 
     126    werror("Waiting for writing to be finished.\n"); 
     127  writing_finished->read(); 
     128  if (debug) 
     129    werror("Finished Waiting for writing to be finished.\n"); 
    129130  while (1) { 
    130131    string s = f->gets(); 
    131132    float current_time = time(timebase); 
     
    187188    else if (sscanf(s, "?%s", answer)) { 
    188189      number = -1; 
    189190      sscanf(answer, "%d", number); 
    190       if (verbose || (number != -1 && number < 10000)) 
    191         write("%-15s ?%s\n", current_testsuite->name + ":", answer); 
     191      write("%-15s ?%s\n", current_testsuite->name + ":", answer); 
    192192    } 
    193193  } 
    194   f->close(); 
    195194  if (debug) 
    196     werror("Reader closed down.\n"); 
     195    werror("Reader closing down.\n"); 
    197196  finish(); 
     197  f->close(); 
     198  reading_finished->write("\n"); 
    198199} 
    199200 
    200 static void program_writer(object f) 
     201static void program_writer(Thread.Queue in, object f) 
    201202{ 
    202203  while (1) { 
    203     string s = write_queue->read(); 
     204    string s = in->read(); 
    204205    if (s == "") 
    205206      break; 
    206207    f->write(s); 
     
    254255  if (options["check-unoccupied-answers"]) 
    255256    testsuite = modify_testsuite(testsuite); 
    256257 
    257   write_queue = Thread.Queue(); 
     258  writing_finished = Thread.Queue(); 
     259  reading_finished = Thread.Queue(); 
     260  Thread.Queue write_queue = Thread.Queue(); 
    258261  object f1 = Stdio.File(); 
    259262  object pipe1 = f1->pipe(); 
    260263  object f2 = Stdio.FILE(); 
     
    262265  machine = Process.create_process(program_start_array, 
    263266                                   (["stdin":pipe1, "stdout":pipe2])); 
    264267  thread_create(program_reader, f2); 
    265   thread_create(program_writer, f1); 
     268  thread_create(program_writer, write_queue, f1); 
    266269 
    267270  int number; 
    268271  string answer; 
     
    287290        continue; 
    288291      if (correct_results[(int) number]) 
    289292        write("Repeated test number " + number + ".\n"); 
    290       send("reset_reading_node_counter"); 
    291       send("reset_owl_node_counter"); 
    292       send("reset_connection_node_counter"); 
    293       send(s); 
     293      send(write_queue, "reset_reading_node_counter"); 
     294      send(write_queue, "reset_owl_node_counter"); 
     295      send(write_queue, "reset_connection_node_counter"); 
     296      send(write_queue, s); 
    294297      if (sscanf(s, "%*sreg_genmove%*s") == 2) 
    295         send("10005 move_uncertainty"); 
    296       send("10000 get_reading_node_counter"); 
    297       send("10001 get_owl_node_counter"); 
    298       send("10002 get_connection_node_counter"); 
    299       send("10003 cputime"); 
     298        send(write_queue, "10005 move_uncertainty"); 
     299      send(write_queue, "10000 get_reading_node_counter"); 
     300      send(write_queue, "10001 get_owl_node_counter"); 
     301      send(write_queue, "10002 get_connection_node_counter"); 
     302      send(write_queue, "10003 cputime"); 
    300303    } 
    301304    else if (sscanf(s, "#? [%[^]]]%s", answer, expected)) { 
    302305      correct_results[(int)number] = answer; 
     
    304307        expected_failures[(int)number] = 1; 
    305308    } 
    306309    else 
    307       send(s); 
     310      send(write_queue, s); 
    308311  } 
    309312   
    310   send("10004 quit"); 
    311   send(); 
    312   cond->wait(condmutexkey); 
     313  if (debug) 
     314    werror("Signalling finish of writing\n"); 
     315  writing_finished->write("\n"); 
     316  send(write_queue, "10004 cputime"); 
     317  reading_finished->read(); 
     318  send(write_queue, "10004 quit"); 
     319  send(write_queue, ); 
    313320} 
    314321 
    315322void final_report() 
     
    385392 
    386393int main(int argc, array(string) argv) 
    387394{ 
    388   cond = Thread.Condition(); 
    389   condmutex = Thread.Mutex(); 
    390   condmutexkey = condmutex->lock(); 
    391395  array(string) testsuites = ({}); 
    392396  mapping(string:array(int)) partial_testsuites = ([]); 
    393397