-// Thread::listener_loop() is where the listener thread, used for I/O, waits for
-// input. When is_searching is false then input is read in sync with main thread
-// (that blocks), otherwise the listener thread reads any input asynchronously
-// and processes the input line calling do_uci_async_cmd().
+// split() does the actual work of distributing the work at a node between
+// several available threads. If it does not succeed in splitting the node
+// (because no idle threads are available, or because we have no unused split
+// point objects), the function immediately returns. If splitting is possible, a
+// SplitPoint object is initialized with all the data that must be copied to the
+// helper threads and then helper threads are told that they have been assigned
+// work. This will cause them to instantly leave their idle loops and call
+// search(). When all threads have returned from search() then split() returns.
+
+template <bool Fake>
+Value ThreadPool::split(Position& pos, Stack* ss, Value alpha, Value beta,
+ Value bestValue, Move* bestMove, Depth depth,
+ Move threatMove, int moveCount, MovePicker* mp, int nodeType) {
+
+ assert(pos.pos_is_ok());
+ assert(bestValue > -VALUE_INFINITE);
+ assert(bestValue <= alpha);
+ assert(alpha < beta);
+ assert(beta <= VALUE_INFINITE);
+ assert(depth > DEPTH_ZERO);