]> SALOME platform Git repositories - modules/kernel.git/commitdiff
Salome HOME
CCAR: add attributes to Container (logfilename, workingdir)
authorcaremoli <caremoli>
Tue, 19 Feb 2008 10:11:57 +0000 (10:11 +0000)
committercaremoli <caremoli>
Tue, 19 Feb 2008 10:11:57 +0000 (10:11 +0000)
- now SALOME Launcher put the Container in a working directory that can be set by the user
through machineParameters (member workindir)
- add complex, logical and strings to Datastream/Calcium DSC ports python interface

12 files changed:
bin/appliskel/runRemote.sh
idl/SALOME_Component.idl
idl/SALOME_ContainerManager.idl
salome_adm/unix/SALOMEconfig.ref.in
src/Container/Component_i.cxx
src/Container/Container_i.cxx
src/Container/SALOME_Component_i.hxx
src/Container/SALOME_ContainerManager.cxx
src/Container/SALOME_Container_i.hxx
src/DSC/DSC_Python/calcium.i
src/DSC/DSC_User/Datastream/Calcium/Calcium.c
src/ResourcesManager/SALOME_ResourcesManager.cxx

index 6cd76ef4695adb645142191348d2e74275202d55..522b6ddd75e9f5888d078fa83175f49dc93589d5 100755 (executable)
@@ -37,7 +37,8 @@
 #     $0 : ${APPLI}/runRemote.sh: from arg name, rebuild and export $APPLI variable
 #     $1 : computer name for CORBA name service (where SALOME was launched)
 #     $2 : port for CORBA name service
-#     $3 and following : local command to execute, with args
+#     $3 : working directory
+#     $4 and following : local command to execute, with args
 #
 
 # --- retrieve APPLI path, relative to $HOME, set ${APPLI}
@@ -60,9 +61,34 @@ export NSPORT
 initref="NameService=corbaname::"$1":$2"
 echo "ORBInitRef $initref" > $OMNIORB_CONFIG
 
+#go to the requested working directory if any
+if test "x$3" != x; then
+  if test "x$3" = "x\$TEMPDIR"; then
+    #create a temp working dir and change to it
+    WDIR=`mktemp -d` && {
+      cd $WDIR
+    }
+  else
+    if test -d $3; then
+      #the dir exists, go to it
+      cd $3
+    else
+      if test -a $3; then
+        # It's a file do nothing
+        echo $3 "is an existing file. Can't use it as a working directory"
+      else
+        #It does not exists, create it
+        mkdir -p $3 && {
+          cd $3
+        }
+      fi
+    fi
+  fi
+fi
+
 # --- execute the command in the SALOME environment
 
-shift 2
+shift 3
 
 # suppress --rcfile option because of problem on Mandriva2006 - B Secher mai 2007
 #${KERNEL_ROOT_DIR}/bin/salome/envSalome.py /bin/sh --rcfile $HOME/$APPLI/.bashrc -c "$*"
index f3139b6ecf37474a7587a437e721d3e6e25f91c4..0619ebfa0c6a4efb8b103b439b008553e37ce921 100644 (file)
@@ -132,6 +132,16 @@ module Engines
     */
     readonly attribute string name ;
 
+    /*!
+      working directory of the %container
+    */
+    readonly attribute string workingdir ;
+
+    /*!
+      name of the %container log file (this has been set by the launcher)
+    */
+    attribute string logfilename ;
+
     /*!
       Shutdown the Container process.
     */
index 7fcc66cf6147903ab12726903a77f63c3675317e..8d2258cf571a1da8a0c7ab0e158d9aaaf0a40bc9 100644 (file)
@@ -54,6 +54,7 @@ struct MachineParameters
   boolean isMPI;
   string mpiImpl;
   string batch;
+  string workingdir;
 
   // PaCO specific informations
   string parallelLib;
index 20c03488bc574857a6245c58b2e199f4761c934f..78688bd880cdd3e9e5375612d6a99a28ace3f936 100644 (file)
 #define SSH "@SSH@"
 
 // This is only to suppress warning messages with defines redefined (cause of omniORB that exports these names)
+#ifdef PACKAGE_BUGREPORT
 #undef PACKAGE_BUGREPORT
+#endif
+#ifdef PACKAGE_NAME
 #undef PACKAGE_NAME
+#endif
+#ifdef PACKAGE_STRING
 #undef PACKAGE_STRING
+#endif
+#ifdef PACKAGE_TARNAME
 #undef PACKAGE_TARNAME
+#endif
+#ifdef PACKAGE_VERSION
 #undef PACKAGE_VERSION
+#endif
 
 #endif
index cdbef093f044b1f50fde72b2ff7e8e2131047e6c..5b7efac97b8a6fef73547d3c4eb9a02d6c5c17f9 100644 (file)
@@ -164,6 +164,8 @@ Engines_Component_i::~Engines_Component_i()
 {
   MESSAGE("Component destructor");
   Engines_Container_i::decInstanceCnt(_interfaceName);
+  if(_myConnexionToRegistry)delete _myConnexionToRegistry;
+  if(_notifSupplier)delete _notifSupplier;
 }
 
 //=============================================================================
index ea1c23c116885daa9e07fcc12c127767a9016386..41e2b5b61ab952a652a7f01ce896b388e41a39b7 100644 (file)
@@ -241,6 +241,35 @@ char* Engines_Container_i::name()
    return CORBA::string_dup(_containerName.c_str()) ;
 }
 
+//=============================================================================
+/*! 
+ *  CORBA attribute: Container working directory 
+ */
+//=============================================================================
+
+char* Engines_Container_i::workingdir()
+{
+  char wd[256];
+  getcwd (wd,256);
+  return CORBA::string_dup(wd) ;
+}
+
+//=============================================================================
+/*! 
+ *  CORBA attribute: Container log file name
+ */
+//=============================================================================
+
+char* Engines_Container_i::logfilename()
+{
+  return CORBA::string_dup(_logfilename.c_str()) ;
+}
+
+void Engines_Container_i::logfilename(const char* name)
+{
+  _logfilename=name;
+}
+
 //=============================================================================
 /*! 
  *  CORBA method: Get the hostName of the Container (without domain extensions)
index 9e3ee13839e0124fec946027ae525481b03056f2..03234c307d2a2a16d397b3d552b86f24a11b5f1d 100644 (file)
@@ -29,6 +29,8 @@
 #ifndef _SALOME_COMPONENT_I_HXX_
 #define _SALOME_COMPONENT_I_HXX_
 
+#include <SALOMEconfig.h>
+
 #include <SALOME_Container.hxx>
 
 #include <iostream>
@@ -40,7 +42,6 @@
 #include <sys/types.h>
 #include <string>
 #include <map>
-#include <SALOMEconfig.h>
 #include CORBA_SERVER_HEADER(SALOME_Component)
 #include "NOTIFICATION.hxx"
 #include "Salome_file_i.hxx"
index b74dda3756bd2ab00479f0e0f0fd7caf81d4acb0..dd6ee5a308a3239049dc91473db4ca45d0ff7aa4 100644 (file)
@@ -278,6 +278,10 @@ StartContainer(const Engines::MachineParameters& params,
       //Engines::Container_var cont=Engines::Container::_narrow(obj);
     }
 
+  //redirect stdout and stderr in a file
+  string logFilename="/tmp/"+_NS->ContainerName(params)+"_"+GetHostname()+"_"+getenv( "USER" )+".log" ;
+  command += " > " + logFilename + " 2>&1 &";
+
   // launch container with a system call
   int status=system(command.c_str());
   if (status == -1){
@@ -308,7 +312,16 @@ StartContainer(const Engines::MachineParameters& params,
     }
     
     if ( CORBA::is_nil(ret) )
-      MESSAGE("SALOME_LifeCycleCORBA::StartOrFindContainer rsh failed");
+      {
+        MESSAGE("SALOME_LifeCycleCORBA::StartOrFindContainer rsh failed");
+      }
+    else
+      {
+        logFilename=":"+logFilename;
+        logFilename="@"+GetHostname()+logFilename;
+        logFilename=getenv( "USER" )+logFilename;
+        ret->logfilename(logFilename.c_str());
+      }
 
     return ret;
   }
index f39a54c4b4608fb08f767b626efe7c5c93c77619..153b381f84d8820656b3f04d66559535e8a1d98d 100644 (file)
@@ -83,6 +83,10 @@ public:
 
   virtual void ping();
   char* name();
+  char* workingdir();
+  char* logfilename();
+  void logfilename(const char* name);
+
   virtual void Shutdown();
   char* getHostName();
   CORBA::Long getPID();
@@ -125,6 +129,7 @@ protected:
   SALOME_NamingService *_NS ;
   std::string _library_path;
   std::string _containerName;
+  std::string _logfilename;
   CORBA::ORB_var _orb;
   PortableServer::POA_var _poa;
   PortableServer::ObjectId * _id ;
index beb704e77188d16b220305d0474f390dc4eef7f3..dddf3aa063f20c47c9af8dfa00d8c709573e1a5e 100644 (file)
@@ -39,10 +39,6 @@ struct omniORBpyAPI {
 
   omniORBpyAPI* api;
 
-#define OMNIPY_CATCH_AND_HANDLE_SYSTEM_EXCEPTIONS \
-catch (const CORBA::SystemException& ex) { \
-  return api->handleCxxSystemException(ex); \
-}
 
 %}
 
@@ -67,11 +63,8 @@ catch (const CORBA::SystemException& ex) { \
 %}
 
 %include <exception.i>
-%include "carrays.i" 
 
-%array_class(int, intArray);
-%array_class(float, floatArray);
-%array_class(double, doubleArray);
+
 
 /*
  * Most of this code is borrowed from numpy distribution
@@ -115,13 +108,52 @@ char* pytype_string(PyObject* py_obj) {
   return "unkown type";
 }
 
+/*
+For documentation only : numpy typecodes
+
+enum NPY_TYPECHAR { NPY_BOOLLTR = '?',
+                        NPY_BYTELTR = 'b',
+                        NPY_UBYTELTR = 'B',
+                        NPY_SHORTLTR = 'h',
+                        NPY_USHORTLTR = 'H',
+                        NPY_INTLTR = 'i',
+                        NPY_UINTLTR = 'I',
+                        NPY_LONGLTR = 'l',
+                        NPY_ULONGLTR = 'L',
+                        NPY_LONGLONGLTR = 'q',
+                        NPY_ULONGLONGLTR = 'Q',
+                        NPY_FLOATLTR = 'f',
+                        NPY_DOUBLELTR = 'd',
+                        NPY_LONGDOUBLELTR = 'g',
+                        NPY_CFLOATLTR = 'F',
+                        NPY_CDOUBLELTR = 'D',
+                        NPY_CLONGDOUBLELTR = 'G',
+                        NPY_OBJECTLTR = 'O',
+                        NPY_STRINGLTR = 'S',
+                        NPY_STRINGLTR2 = 'a',
+                        NPY_UNICODELTR = 'U',
+                        NPY_VOIDLTR = 'V',
+                        NPY_CHARLTR = 'c',
+
+                        NPY_INTPLTR = 'p',
+                        NPY_UINTPLTR = 'P',
+
+                        NPY_GENBOOLLTR ='b',
+                        NPY_SIGNEDLTR = 'i',
+                        NPY_UNSIGNEDLTR = 'u',
+                        NPY_FLOATINGLTR = 'f',
+                        NPY_COMPLEXLTR = 'c'
+};
+*/
+
 /* Given a Numeric typecode, return a string describing the type.
  */
 char* typecode_string(int typecode) {
-  char* type_names[20] = {"char","unsigned byte","byte","short",
-        "unsigned short","int","unsigned int","long",
-        "float","double","complex float","complex double",
-        "object","ntype","unkown"};
+  char* type_names[] = {"bool","byte","unsigned byte","short",
+        "unsigned short","int","unsigned int","long","unsigned long",
+        "longlong","unsigned longlong",
+        "float","double","long double","complex float","complex double","complex long double",
+        "object","string","unicode","void","ntypes","notype","char","unkown"};
   return type_names[typecode];
 }
 
@@ -338,6 +370,45 @@ typedef PyObject ArrayObject;
 #endif
 %}
 
+%include "carrays.i" 
+
+%array_class(int, intArray);
+%array_class(float, floatArray);
+%array_class(double, doubleArray);
+
+/* special struct to handle string arrays */
+%inline %{
+struct stringArray
+{
+  stringArray(int nelements,int size=0) {
+    nelem=nelements;
+    data= new char*[nelements];
+    for(int i=0;i<nelements;i++)
+    {
+      data[i]=(char *)malloc((size+1)*sizeof(char));
+      data[i][size+1]='\0';
+    }
+  }
+  ~stringArray() 
+  {
+    std::cerr << "~stringArray() " << nelem << std::endl;
+    for(int i=0;i<nelem;i++)
+      free(data[i]);
+    delete [] data;
+  }
+  char* __getitem__(int index) {
+    return data[index];
+  }
+  void __setitem__(int index, char* value) {
+    free(data[index]);
+    data[index] = strdup(value);
+  }
+  char** data;
+  int nelem;
+};
+%}
+/* End of special struct to handle string arrays */
+
 /* input typemap 
    This typemap can be used for input array objects only.
    It accepts swig carray objects or numpy contiguous or non contiguous objects.
@@ -374,6 +445,55 @@ TYPEMAP_IN3(double,  PyArray_DOUBLE)
 %apply float*  IN_ARRAY3 {float  *eval};
 %apply double* IN_ARRAY3 {double *eval};
 
+/*  Specific typemap for complex */
+%typemap(in) float*  ecpval
+             (ArrayObject* array=NULL, int is_new_object) {
+  int size[1] = {-1};
+  if ((SWIG_ConvertPtr($input, (void **) &$1, $1_descriptor,0)) == -1)
+  {
+%#ifdef WITH_NUMPY
+    array = obj_to_array_contiguous_allow_conversion($input, PyArray_CFLOAT, &is_new_object);
+    if (!array || !require_dimensions(array,1) || !require_size(array,size,1)) SWIG_fail;
+    $1 = (float*) array->data;
+%#else
+    SWIG_exception(SWIG_TypeError, "complex array expected");
+%#endif
+  }
+}
+%typemap(freearg) float* ecpval {
+  if (is_new_object$argnum && array$argnum) Py_DECREF(array$argnum);
+}
+/* End of  Specific typemap for complex */
+
+/* array of strings on input */
+%typemap(in) char** eval
+         (ArrayObject* array=NULL, int is_new_object) {
+  int size[1] = {-1};
+  stringArray* sarray;
+  if ((SWIG_ConvertPtr($input, (void **) &sarray, $descriptor(stringArray *),0)) == -1)
+  {
+%#ifdef WITH_NUMPY
+    array = obj_to_array_contiguous_allow_conversion($input, PyArray_STRING, &is_new_object);
+    if (!array || !require_dimensions(array,1) || !require_size(array,size,1)) SWIG_fail;
+    $1 = (char**) malloc(array_size(array,0)*sizeof(char*));
+    for(int i=0;i<array_size(array,0);i++)
+      $1[i]=(char*) array->data + i* array->strides[0];
+%#else
+    SWIG_exception(SWIG_TypeError, "string array expected");
+%#endif
+  }
+  else
+  {
+    $1=sarray->data;
+  }
+}
+
+%typemap(freearg) char** eval {
+  if (array$argnum) free($1);
+  if (is_new_object$argnum && array$argnum) Py_DECREF(array$argnum);
+}
+/* End of array of strings on input */
+
 /* inplace typemaps 
    This typemap can be used for input/output array objects.
    It accepts swig carray objects or numpy contiguous objects.
@@ -404,94 +524,145 @@ TYPEMAP_INPLACE3(double,  PyArray_DOUBLE)
 %apply float*  INPLACE_ARRAY3 {float  *lval};
 %apply double* INPLACE_ARRAY3 {double *lval};
 
-
-%typemap(in) CORBA::Boolean
-{
-  $1=(CORBA::Boolean)PyInt_AsLong($input);
+/*  typemap for complex inout */
+%typemap(in) float* lcpval
+             (ArrayObject* temp=NULL) {
+  if ((SWIG_ConvertPtr($input, (void **) &$1, $1_descriptor,0)) == -1)
+  {
+%#ifdef WITH_NUMPY
+    temp = obj_to_array_no_conversion($input,PyArray_CFLOAT);
+    if (!temp  || !require_contiguous(temp)) SWIG_fail;
+    $1 = (float*) temp->data;
+%#else
+    SWIG_exception(SWIG_TypeError, "complex array expected");
+%#endif
+  }
 }
+/*  End of typemap for complex inout */
 
-%typemap(in) CORBA::ORB_ptr 
-{
-  try {
-     CORBA::Object_ptr obj = api->pyObjRefToCxxObjRef($input,1);
-     $1 = CORBA::ORB::_narrow(obj);
+/* typemap for array of strings on input/output */
+%typemap(in) char** lval
+            (ArrayObject* temp=NULL) {
+  stringArray* sarray;
+  if ((SWIG_ConvertPtr($input, (void **) &sarray, $descriptor(stringArray *) ,0)) == -1)
+  {
+%#ifdef WITH_NUMPY
+    temp = obj_to_array_no_conversion($input,PyArray_STRING);
+    if (!temp  || !require_contiguous(temp)) SWIG_fail;
+    $1 = (char**) malloc(array_size(temp,0)*sizeof(char*));
+    for(int i=0;i<array_size(temp,0);i++)
+      $1[i]=(char*) temp->data+i*temp->strides[0];
+%#else
+    SWIG_exception(SWIG_TypeError, "string array expected");
+%#endif
   }
-  catch (...) {
-     PyErr_SetString(PyExc_RuntimeError, "not a valid CORBA object ptr");
+  else
+  {
+    $1=sarray->data;
   }
 }
+%typemap(freearg) char** lval {
+  if (temp$argnum) free($1);
+}
+/* End of typemap for array of strings on input/output */
 
-%typemap(in) PortableServer::POA_ptr
+%typemap(in) CORBA::Boolean
 {
-  try {
-     CORBA::Object_ptr obj = api->pyObjRefToCxxObjRef($input,1);
-     $1 = PortableServer::POA::_narrow(obj);
-  }
-  catch (...) {
-     PyErr_SetString(PyExc_RuntimeError, "not a valid CORBA object ptr");
-  }
+  $1=(CORBA::Boolean)PyInt_AsLong($input);
 }
 
-%typemap(in) Engines::Container_ptr
+%define CORBAPTR(type)
+%typemap(in) type##_ptr
 {
-  try {
-     CORBA::Object_ptr obj = api->pyObjRefToCxxObjRef($input,1);
-     $1 = Engines::Container::_narrow(obj);
+  Py_BEGIN_ALLOW_THREADS
+  try
+  {
+     CORBA::Object_var obj = api->pyObjRefToCxxObjRef($input,0);
+     $1 = type##::_narrow(obj);
   }
-  catch (...) {
+  catch(...)
+  {
+     Py_BLOCK_THREADS
      PyErr_SetString(PyExc_RuntimeError, "not a valid CORBA object ptr");
   }
+  Py_END_ALLOW_THREADS
+}
+%typemap(freearg) type##_ptr {
+  CORBA::release($1);
 }
+%enddef
+
+CORBAPTR(CORBA::ORB)
+CORBAPTR(Ports::PortProperties)
+CORBAPTR(Ports::Port)
+CORBAPTR(Engines::Container)
+CORBAPTR(PortableServer::POA)
 
-%typemap(in) Ports::Port_ptr
+%typemap(out) Ports::Port_ptr 
 {
-  try {
-     CORBA::Object_ptr obj = api->pyObjRefToCxxObjRef($input,1);
-     $1 = Ports::Port::_narrow(obj);
-  }
-  catch (...) {
-     PyErr_SetString(PyExc_RuntimeError, "not a valid CORBA object ptr");
-  }
+  $result = api->cxxObjRefToPyObjRef($1, 1);
+  //All output Ports::Port_ptr variables are duplicated by security. Need to release them for python . Explanation ??
+  CORBA::release($1);
 }
 
-%typemap(out) Ports::Port_ptr , Ports::PortProperties_ptr, Engines::Salome_file_ptr
+%typemap(out) Ports::PortProperties_ptr, Engines::Salome_file_ptr
 {
   $result = api->cxxObjRefToPyObjRef($1, 1);
 }
 
+%typemap(out) Engines::DSC::uses_port *
+{
+   $result = PyList_New($1->length());
+   for (CORBA::ULong i=0; i < $1->length() ; i++)
+     PyList_SetItem($result,i,api->cxxObjRefToPyObjRef((*$1)[i], 1));
+   //delete the copy (created by new) of uses port sequence
+   delete $1;
+}
+
 /*
  * Exception section
  */
 // a general exception handler
 %exception {
+   Py_BEGIN_ALLOW_THREADS
    try {
       $action
    }
    catch(Engines::DSC::PortNotDefined& _e) {
+      Py_BLOCK_THREADS
       PyErr_SetString(PyExc_ValueError,"Port not defined");
       return NULL;
    }
    catch(Engines::DSC::PortNotConnected& _e) {
+      Py_BLOCK_THREADS
       PyErr_SetString(PyExc_ValueError,"Port not connected");
       return NULL;
    }
    catch(Engines::DSC::BadPortType& _e) {
+      Py_BLOCK_THREADS
       PyErr_SetString(PyExc_ValueError,"Bad port type");
       return NULL;
    }
    catch (SALOME_Exception &e) {
+      Py_BLOCK_THREADS
       PyErr_SetString(PyExc_RuntimeError,e.what());
       return NULL;
    }
    catch (SALOME::SALOME_Exception &e) {
+      Py_BLOCK_THREADS
       PyErr_SetString(PyExc_RuntimeError,e.details.text);
       return NULL;
    }
-   OMNIPY_CATCH_AND_HANDLE_SYSTEM_EXCEPTIONS
+   catch (const CORBA::SystemException& e) {
+      Py_BLOCK_THREADS 
+      return api->handleCxxSystemException(e);
+   }
    catch(...) {
+      Py_BLOCK_THREADS
       PyErr_SetString(PyExc_ValueError,"Unknown exception");
       return NULL;
    }
+   Py_END_ALLOW_THREADS
 }
 
 /*
@@ -566,12 +737,22 @@ class PySupervCompo:public Superv_Component_i
 
     virtual Ports::PortProperties_ptr get_port_properties(const char* port_name);
 
+// Interface for Salome_file
     Engines::Salome_file_ptr getInputFileToService(const char* service_name, const char* Salome_file_name);
     void checkInputFilesToService(const char* service_name);
     Engines::Salome_file_ptr setInputFileToService(const char* service_name, const char* Salome_file_name);
     Engines::Salome_file_ptr getOutputFileToService(const char* service_name, const char* Salome_file_name);
     void checkOutputFilesToService(const char* service_name);
     Engines::Salome_file_ptr setOutputFileToService(const char* service_name, const char* Salome_file_name);
+// End of Interface for Salome_file
+
+// DSC interface for python components
+  virtual void add_provides_port(Ports::Port_ptr ref, const char* provides_port_name, Ports::PortProperties_ptr port_prop);
+  virtual void add_uses_port(const char* repository_id, const char* uses_port_name, Ports::PortProperties_ptr port_prop);
+  virtual Engines::DSC::uses_port * get_uses_port(const char* uses_port_name);
+// End of DSC interface for python components
+
+
 
     %extend
       {
@@ -600,14 +781,17 @@ int  cp_cd(Superv_Component_i *component,char *name);
 int cp_een(Superv_Component_i *component,int dep,float  t,int n,char *nom,int nval,int    *eval);
 int cp_edb(Superv_Component_i *component,int dep,double t,int n,char *nom,int nval,double *eval);
 int cp_ere(Superv_Component_i *component,int dep,float  t,int n,char *nom,int nval,float  *eval);
-int cp_ecp(Superv_Component_i *component,int dep,float  t,int n,char *nom,int nval,float  *eval);
+int cp_ecp(Superv_Component_i *component,int dep,float  t,int n,char *nom,int nval,float  *ecpval);
 int cp_elo(Superv_Component_i *component,int dep,float  t,int n,char *nom,int nval,int    *eval);
+int cp_ech(Superv_Component_i *component,int dep,float  t,int n,char *nom,int nval,char** eval,int strSize);
+
 
 int cp_len(Superv_Component_i *component,int dep,float  *ti,float  *tf,int *niter,char *nom,int nmax,int *nval,int    *lval);
 int cp_ldb(Superv_Component_i *component,int dep,double *ti,double *tf,int *niter,char *nom,int nmax,int *nval,double *lval);
 int cp_lre(Superv_Component_i *component,int dep,float  *ti,float  *tf,int *niter,char *nom,int nmax,int *nval,float  *lval);
-int cp_lcp(Superv_Component_i *component,int dep,float  *ti,float  *tf,int *niter,char *nom,int nmax,int *nval,float  *lval);
+int cp_lcp(Superv_Component_i *component,int dep,float  *ti,float  *tf,int *niter,char *nom,int nmax,int *nval,float  *lcpval);
 int cp_llo(Superv_Component_i *component,int dep,float  *ti,float  *tf,int *niter,char *nom,int nmax,int *nval,int    *lval);
+int cp_lch(Superv_Component_i *component,int dep,float  *ti,float  *tf,int *niter,char *nom,int nmax,int *nval,char** lval,int strSize);
 
 int cp_fin(Superv_Component_i *component,int cp_end);
 
index 46c4715a15eb9dd94d3ef85a9f8a4480d76dcc0a..cba14ca11ede2f90fbb3bf8e59534040a3119d69 100644 (file)
@@ -94,7 +94,7 @@ CALCIUM_EXT_LECT_INTERFACE_C_(lcp,float,float,cplx,);
     long   _i=*i;                                                      \
     fflush(stdout);                                                    \
     fflush(stderr);                                                    \
-    fprintf(stderr,"Beginning of cpl" #_name " : %s %d %f\n",nomvar,*i,*ti); \
+    fprintf(stderr,"Beginning of cp_" #_name " : %s %d %f\n",nomvar,*i,*ti); \
                                                                        \
     if ( (data == NULL) || (bufferLength < 1) ) return CPNTNULL;       \
                                                                        \
@@ -104,7 +104,7 @@ CALCIUM_EXT_LECT_INTERFACE_C_(lcp,float,float,cplx,);
     if(mode == CP_SEQUENTIEL)                                          \
       *i = _i;                                                         \
     *nRead=_nRead;                                                     \
-    fprintf(stderr,"End of cpl" #_name " : %s %d \n",nomvar,*i);       \
+    fprintf(stderr,"End of cp_" #_name " : %s %d \n",nomvar,*i);               \
     fflush(stdout);                                                    \
     fflush(stderr);                                                    \
                                                                        \
@@ -123,7 +123,7 @@ InfoType cp_lch(void * component, int mode, float * ti,     float * tf, int * i,
   size_t _nRead;                                                       
   long   _i=*i;                                                        
   fflush(stdout);fflush(stderr);                                                       
-  fprintf(stderr,"Beginning of cplch: %s %d %f\n",nomvar,*i,*ti);      
+  fprintf(stderr,"Beginning of cp_lch: %s %d %f\n",nomvar,*i,*ti);     
                                                                        
   if ( (data == NULL) || (bufferLength < 1) ) return CPNTNULL; 
   
@@ -133,7 +133,7 @@ InfoType cp_lch(void * component, int mode, float * ti,     float * tf, int * i,
   if(mode == CP_SEQUENTIEL)                                            
     *i = _i;                                                           
   *nRead=_nRead;                                                       
-  fprintf(stderr,"End of cplch: %s %d \n",nomvar,*i);                  
+  fprintf(stderr,"End of cp_lch: %s %d \n",nomvar,*i);                 
   fflush(stdout);fflush(stderr);                                                       
                                                                        
   return info;                                                 
@@ -209,13 +209,13 @@ InfoType cp_fin (void * component, int code) {
     /*long   _i=i;*/                                                   \
     fflush(stdout);                                                    \
     fflush(stderr);                                                    \
-    fprintf(stderr,"Beginning of cpe" #_name " : %s %d %f\n",nomvar,i,t);      \
+    fprintf(stderr,"Beginning of cp_" #_name " : %s %d %f\n",nomvar,i,t);      \
     if ( (data == NULL) || (nbelem < 1) ) return CPNTNULL;             \
                                                                        \
     InfoType info =  ecp_ecriture_##_typeName (component, mode, &t, i, \
                                               nomvar, nbelem,          \
                                               data );                  \
-    fprintf(stderr,"End of cpe" #_name " : %s %d \n",nomvar,i);                \
+    fprintf(stderr,"End of cp_" #_name " : %s %d \n",nomvar,i);                \
     fflush(stdout);                                                    \
     fflush(stderr);                                                    \
                                                                        \
@@ -230,13 +230,13 @@ InfoType cp_ech(void * component, int mode, float t, int i,
                                                                        
   /*long   _i=i;*/                                                     
   fflush(stdout);fflush(stderr);                                                       
-  fprintf(stderr,"Beginning of cpech: %s %d %f\n",nomvar,i,t); 
+  fprintf(stderr,"Beginning of cp_ech: %s %d %f\n",nomvar,i,t);        
   if ( (data == NULL) || (nbelem < 1) ) return CPNTNULL;               
     
   InfoType info =  ecp_ecriture_str (component, mode, &t, i,   
                                     nomvar, nbelem,            
                                     data);/*, strSize );*/
-  fprintf(stderr,"End of cpech: %s %d \n",nomvar,i);                   
+  fprintf(stderr,"End of cp_ech: %s %d \n",nomvar,i);                  
   fflush(stdout);                                                      
   fflush(stderr);                                                      
                                                                        
index f282ac73515099a32713646ef29594b46ba6782c..ea88da8f8de8b99f184482e23d9734fc8d62fd65 100644 (file)
@@ -473,7 +473,7 @@ bool isPythonContainer(const char* ContainerName)
  *  see BuildTempFileToLaunchRemoteContainer()
  *
  *  Else rely on distant configuration. Command is under the form (example):
- *  ssh user@machine distantPath/runRemote.sh hostNS portNS \
+ *  ssh user@machine distantPath/runRemote.sh hostNS portNS workingdir \
  *                   SALOME_Container containerName &"
 
  *  - where user is ommited if not specified in CatalogResources,
@@ -483,6 +483,7 @@ bool isPythonContainer(const char* ContainerName)
  *    use to launch SALOME and servers in $APPLI: runAppli.sh, runRemote.sh)
  *  - where portNS is the port used by CORBA naming server (set by scripts to
  *    use to launch SALOME and servers in $APPLI: runAppli.sh, runRemote.sh)
+ *  - where workingdir is the requested working directory for the container
  */ 
 //=============================================================================
 
@@ -514,7 +515,7 @@ SALOME_ResourcesManager::BuildCommandToLaunchRemoteContainer
             nbproc = params.nb_node * params.nb_proc_per_node;
         }
 
-      // "ssh user@machine distantPath/runRemote.sh hostNS portNS \
+      // "ssh user@machine distantPath/runRemote.sh hostNS portNS workingdir \
       //  SALOME_Container containerName &"
 
       if (resInfo.Protocol == rsh)
@@ -550,6 +551,13 @@ SALOME_ResourcesManager::BuildCommandToLaunchRemoteContainer
       ASSERT(getenv("NSPORT"));
       command += getenv("NSPORT"); // port of CORBA name server
 
+      command += " '";
+      std::string wdir=params.workingdir.in();
+      if(wdir == "$TEMPDIR")
+        wdir="\\$TEMPDIR";
+      command += wdir; // requested working directory
+      command += "'"; 
+
       if(params.isMPI)
        {
          command += " mpirun -np ";
@@ -570,13 +578,6 @@ SALOME_ResourcesManager::BuildCommandToLaunchRemoteContainer
       command += idc;
       command += " -";
       AddOmninamesParams(command);
-      command += " > /tmp/";
-      command += _NS->ContainerName(params);
-      command += "_";
-      command += GetHostname();
-      command += "_";
-      command += getenv( "USER" ) ;
-      command += ".log 2>&1 &" ;
 
       MESSAGE("command =" << command);
     }
@@ -629,10 +630,32 @@ SALOME_ResourcesManager::BuildCommandToLaunchLocalContainer
 
   else
     {
+      command="";
+      std::string wdir=params.workingdir.in();
+      std::cerr << wdir << std::endl;
+      if(wdir != "")
+        {
+          // a working directory is requested
+          if(wdir == "$TEMPDIR")
+            {
+              // a new temporary directory is requested
+              char dir[]="/tmp/salomeXXXXXX";
+              char* mdir=mkdtemp(dir);
+              if(mdir==NULL)
+                std::cerr << "Problem in mkdtemp " << dir << " " << mdir << std::endl;
+              else
+                command="cd "+std::string(dir)+";";
+            }
+          else
+            {
+              // a permanent directory is requested use it or create it
+              command="mkdir -p " + wdir + " && cd " + wdir + ";";
+            }
+        }
       if (isPythonContainer(params.container_name))
-        command = "SALOME_ContainerPy.py ";
+        command += "SALOME_ContainerPy.py ";
       else
-        command = "SALOME_Container ";
+        command += "SALOME_Container ";
     }
 
   command += _NS->ContainerName(params);
@@ -641,13 +664,7 @@ SALOME_ResourcesManager::BuildCommandToLaunchLocalContainer
   command += idc;
   command += " -";
   AddOmninamesParams(command);
-  command += " > /tmp/";
-  command += _NS->ContainerName(params);
-  command += "_";
-  command += GetHostname();
-  command += "_";
-  command += getenv( "USER" ) ;
-  command += ".log 2>&1 &" ;
+
   MESSAGE("Command is ... " << command);
   return command;
 }
@@ -717,13 +734,6 @@ SALOME_ResourcesManager::BuildCommand
   command += containerName;
   command += " -";
   AddOmninamesParams(command);
-  command += " > /tmp/";
-  command += containerName;
-  command += "_";
-  command += machine;
-  command += "_";
-  command += getenv( "USER" ) ;
-  command += ".log 2>&1 &" ;
 
   SCRUTE( command );
   return command;
@@ -823,11 +833,9 @@ void SALOME_ResourcesManager::AddOmninamesParams(string& command) const
     //}
     //command += nameservice ;
 
-    char *iorstr = _NS->getIORaddr();
+    CORBA::String_var iorstr = _NS->getIORaddr();
     command += "ORBInitRef NameService=";
     command += iorstr;
-    //It's in fact a CORBA::String allocated with new [] !!!
-    delete [] iorstr;
   }
 
 
@@ -839,8 +847,9 @@ void SALOME_ResourcesManager::AddOmninamesParams(string& command) const
 
 void SALOME_ResourcesManager::AddOmninamesParams(ofstream& fileStream) const
   {
+    CORBA::String_var iorstr = _NS->getIORaddr();
     fileStream << "ORBInitRef NameService=";
-    fileStream << _NS->getIORaddr();
+    fileStream << iorstr;
   }
 
 
@@ -987,14 +996,7 @@ SALOME_ResourcesManager::BuildTempFileToLaunchRemoteContainer
   _CommandForRemAccess = command;
   command += " ";
   command += _TmpFileName;
-  command += " > ";
-  command += "/tmp/";
-  command += _NS->ContainerName(params);
-  command += "_";
-  command += machine;
-  command += "_";
-  command += getenv( "USER" ) ;
-  command += ".log 2>&1 &";
+
   SCRUTE(command);
 
   return command;