program rbt_oddface_cluster;

(**
rch@20180929 -- 10:03 Washingnton DC esperando para embarcar .

Este programa intenta sustituir el script php que se corre en los clusters
para el funcionamiento de OddFace.

Hoy intenté usar el Cluster-UY y no tiene php instalado como interprete
por lo que parece mejor sustituir dicho lenguaje porp este proyecto
para que este todo bajo control.


  El script est� pensado para aplicaciones que ejecutan una Evaluacion en loop.
  La estructura de la aplicaci�n tiene que ser del tipo:

  ---------------------
  // esto garantiza que no se interfieren las tareas del mismo nodo

  mkdir( '/tmp/miaplic/'.$idEjecutor );

  copiarArchivosDeTrabajoDelServidorAlDirectorioTemporal( idEjecutor );
  while testearArchivo( $flog_parar_ntareas ) do
  begin
  X:= getDatos( idEjecutor ); // sortes de MonteCarlo por ejemplo, o conectando al nodo servidor requerir datos
  val:= Evaluar( X ); // seguramente la parte pesada del c�lculo
  sendResultados( idEjecutor, val, X ); // transmitir al servidor el nuevo punto evaluado
  end;

  // borrar la carpeta temporal y su contenido
  system( '(/bin/rm -rf /tmp/miapic/'.$idEjecutor );
  exit;
  ----------------------

  El idEjecutor, es un par�metro pasado al lanzar la aplicaci�n y es �nico en el conjunto
  de aplicaciones. Si todos los


  La idea que el archivo $flg_parar_ntareas tiene un n�mero entero con la
  cantidad de tareas a parar para liberar n�cleos.
  Las aplicaciones que ejecuntan en loop en los n�cleos deben primero ver si
  existe el archivo $flg_parar_ntareas, si existe tienen que leer el n�mero
  entero en el almacenado, decrementarlo, reescribir el archivo con el nuevo
  n�mero y cerrarse. Si la aplicaci�n llega al cero (al decremnetar) deber�a
  eliminar el archivo para que las dem�s que continuan corriendo no se gasten
  en leerlo. Si no lo borran las dem�s lleran un '0' y no tienen que darle bola


**)
{$mode objfpc}{$H+}
{$define UseCThreads}

uses {$IFDEF UNIX} {$IFDEF UseCThreads}
  cthreads, {$ENDIF} {$ENDIF}
  baseunix,
  ssl_openssl_lib,
  ssl_openssl,
 uoddface_cluster;

var
  rbt: TRBT_OddFace_Cluster;

begin
  if not IsSSLloaded then
  begin
    writeln( 'Lo siento, no fue posible cargar las librerías OpenSSL' );
    exit;
  end;
  rbt:= TRBT_OddFace_Cluster.Create;
  if not rbt.ProcesarOrden then
    rbt.Ayuda;
  rbt.Free;
end.
