diff --git a/Common/CommandLine.cpp b/Common/CommandLine.cpp index 8050d55b6f35f9d617708c881b410ef470d2f6c4..55cffc680e80799fc2b93642de63a59466708735 100644 --- a/Common/CommandLine.cpp +++ b/Common/CommandLine.cpp @@ -880,29 +880,12 @@ void GetOptions(int argc, char *argv[]) CTX::instance()->batch = 1; i++; if(argv[i]) { - CTX::instance()->onelab.listen_port = atoi(argv[i]); + CTX::instance()->onelab.listen_port = atoi(argv[i++]); } else CTX::instance()->onelab.listen_port = 1148; - // TODO get port if one is provided #endif } - else if(!strcmp(argv[i] + 1, "server")) { - CTX::instance()->batch = 1; - i++; - if(argv[i]){ - std::string hostname = std::string(argv[i]); - size_t colon = hostname.find(':'); - if(colon != std::string::npos) { - strcpy(&CTX::instance()->onelab.server_ip[0], hostname.substr(0,colon).c_str()); - CTX::instance()->onelab.server_port = atoi(hostname.substr(colon+1).c_str()); - } - else { - CTX::instance()->onelab.server_ip[0] = '\0'; - CTX::instance()->onelab.server_port = 0; - } - } - } else if(!strcmp(argv[i] + 1, "minterpreter")) { i++; if(argv[i]) diff --git a/Common/Context.h b/Common/Context.h index a1ce981aa3c1aea3c905e9dd127b6a6b07340d3d..2612cc4a46da692fd409e2fa2679f0d314c40d59 100644 --- a/Common/Context.h +++ b/Common/Context.h @@ -256,8 +256,7 @@ class CTX { }solver; // onelab options struct{ - short listen_port, server_port; - char server_ip[16]; + short listen_port; }onelab; // print options struct{ diff --git a/Common/GmshMessage.cpp b/Common/GmshMessage.cpp index 489b67f2cf7c13beab1b38ea8cec3ef7fa89a082..e5f9ded7eae1bdd510e8c000834bd79696def7d5 100644 --- a/Common/GmshMessage.cpp +++ b/Common/GmshMessage.cpp @@ -67,7 +67,7 @@ GmshClient *Msg::_client = 0; std::string Msg::_execName; #if defined(HAVE_ONELAB2) OnelabDatabase *OnelabDatabase::_instance = NULL; -GmshNetworkClient *Msg::_onelabClient = 0; +OnelabDatabase *Msg::_onelabClient = 0; #elif defined(HAVE_ONELAB) onelab::client *Msg::_onelabClient = 0; #endif @@ -714,7 +714,9 @@ int Msg::GetAnswer(const char *question, int defaultval, const char *zero, bool Msg::UseOnelab() { -#if defined(HAVE_ONELAB) +#if defined(HAVE_ONELAB2) + return true; +#elif defined(HAVE_ONELAB) return _onelabClient ? true : false; #else return false; @@ -786,10 +788,6 @@ public: void Msg::InitializeOnelab(const std::string &name, const std::string &sockname) { #ifdef HAVE_ONELAB2 - if(_onelabClient) { - delete _onelabClient; - _onelabClient = 0; - } if(sockname.empty()){ if(name != "Gmsh"){ // load db from file: FILE *fp = Fopen(name.c_str(), "rb"); @@ -800,6 +798,7 @@ void Msg::InitializeOnelab(const std::string &name, const std::string &sockname) else Error("Error loading onelab database '%s'", name.c_str()); } + _onelabClient = OnelabDatabase::instance(); } else{ UInt32 address = 0; @@ -814,7 +813,7 @@ void Msg::InitializeOnelab(const std::string &name, const std::string &sockname) Error("Unable to connect ONELAB server (%s)", sockname.c_str()); Exit(1); } - _onelabClient = c; + _onelabClient = OnelabDatabase::instance(); SetOnelabNumber(name + "/UseCommandLine", 1, false); SetOnelabString(name + "/FileExtension", ".geo", false); @@ -1176,8 +1175,7 @@ void Msg::FinalizeOnelab() { #ifdef HAVE_ONELAB2 if(_onelabClient) { - _onelabClient->disconnect(); - OnelabDatabase::instance()->wait(); + _onelabClient->finalize(); delete _onelabClient; _onelabClient = 0; } diff --git a/Common/GmshMessage.h b/Common/GmshMessage.h index 38ebc84d90a23fe72890dc7e501be6dda713c700..37e59c8da42de5105d569aa0c94efed95774d86d 100644 --- a/Common/GmshMessage.h +++ b/Common/GmshMessage.h @@ -16,7 +16,7 @@ class GmshClient; namespace onelab{ class client; } #ifdef HAVE_ONELAB2 -class GmshNetworkClient; +class OnelabDatabase; #endif // the external message handler @@ -50,7 +50,7 @@ class Msg { static GmshClient *_client; #if defined(HAVE_ONELAB2) // communication with onelab server (replace _client and old _onelabClient) - static GmshNetworkClient *_onelabClient; + static OnelabDatabase *_onelabClient; #elif defined(HAVE_ONELAB) // communication with onelab server static onelab::client *_onelabClient; @@ -108,7 +108,7 @@ class Msg { static void LoadOnelabClient(const std::string &name, const std::string &sockName); static GmshClient *GetGmshClient(){ return _client; } #if defined(HAVE_ONELAB2) - static GmshNetworkClient *GetOnelabClient(){ return _onelabClient; } + static OnelabDatabase *GetOnelabClient(){ return _onelabClient; } #elif defined(HAVE_ONELAB) static onelab::client *GetOnelabClient(){ return _onelabClient; } #endif diff --git a/Common/OpenFile.cpp b/Common/OpenFile.cpp index 4642db2360bad7acd619cad49bc5a7574158a34d..e447b3893c2bd0954a06da204740e196c0537715 100644 --- a/Common/OpenFile.cpp +++ b/Common/OpenFile.cpp @@ -487,6 +487,9 @@ int MergeFile(const std::string &fileName, bool warnIfMissing, bool setWindowTit #endif else { status = GModel::readGEO(fileName); +#ifdef HAVE_ONELAB2 + Msg::SetOnelabString("Gmsh/1ModelName", fileName, false); +#endif } } diff --git a/Fltk/onelab2Group.cpp b/Fltk/onelab2Group.cpp index ceb13b8e68c5e5db1e2ec0c9991b60c341a747a3..15182af70e7581b4889e235c73d4eeb1675e4a64 100644 --- a/Fltk/onelab2Group.cpp +++ b/Fltk/onelab2Group.cpp @@ -142,7 +142,6 @@ void solver_cb(Fl_Widget *w, void *data) int num = (intptr_t)data; if(num >= 0){ std::string name = opt_solver_name(num, GMSH_GET, ""); - std::cout << name << ' '; std::string exe = opt_solver_executable(num, GMSH_GET, ""); std::string host = opt_solver_remote_login(num, GMSH_GET, ""); OnelabDatabase::instance()->run("initialize", name); @@ -409,7 +408,6 @@ static void onelab_number_input_range_cb(Fl_Widget *w, void *data) { if(!data) return; std::string name((char*)data); - std::cout << name << std::endl; std::vector<onelab::number> numbers; OnelabDatabase::instance()->get(numbers, name); if(numbers.size()){ diff --git a/Geo/GModel.h b/Geo/GModel.h index ebef3c99f45f757d3c7b6ca9ee60e14f2790192e..dc4d26914e5af40e27c8c545259048143e832379 100644 --- a/Geo/GModel.h +++ b/Geo/GModel.h @@ -219,9 +219,6 @@ class GModel // get/set the model file name void setFileName(std::string fileName) { -#ifdef HAVE_ONELAB2 - Msg::SetOnelabString("Gmsh/1ModelName", fileName, false); -#endif _fileName = fileName; _fileNames.insert(fileName); } diff --git a/contrib/onelab2/OnelabDatabase.cpp b/contrib/onelab2/OnelabDatabase.cpp index 63e54290f70ecf27977d374d41f42211a78b3807..8ff5dd031a3dc2ce9fbfd4f2b7e89b2b360d726d 100644 --- a/contrib/onelab2/OnelabDatabase.cpp +++ b/contrib/onelab2/OnelabDatabase.cpp @@ -93,3 +93,14 @@ DWORD WINAPI OnelabDatabase_server(LPVOID arg) { OnelabServer::instance()->Run(); } + +void OnelabDatabase::finalize() +{ + if(_client) { + _client->disconnect(); + pthread_join(_listenThread, NULL); + } + else { + //TODO pthread_join(_serverThread, NULL); + } +} diff --git a/contrib/onelab2/OnelabDatabase.h b/contrib/onelab2/OnelabDatabase.h index 78f3dab21b1f752460ddfe72e57a9c71f98a2327..5e7db5312a03b6fdec8f025c8ede78a1741c1b67 100644 --- a/contrib/onelab2/OnelabDatabase.h +++ b/contrib/onelab2/OnelabDatabase.h @@ -110,10 +110,7 @@ public: bool networkClientHaveToStop() {return _haveToStop;} void haveToDo(const std::string action) {_action = action;} std::string &actionToDo() {return _action;} - int wait() { - if(_client) return pthread_join(_listenThread, NULL); - return pthread_join(_serverThread, NULL); - } + void finalize(); int listen(OnelabProtocol &msg) { if(_client) return _client->recvfrom(msg); return 0; @@ -152,6 +149,9 @@ public: //if(_localGUI) _localGUI->get(ps, name); return OnelabServer::instance()->get(ps, name, client); } + void clear(const std::string &name="", const std::string &client="") { + if(_client) return _client->clear(name, client); + } bool fromFile(FILE *fp, const std::string &client="") { if(_client) return _client->fromFile(fp, client); diff --git a/contrib/onelab2/OnelabLocalClient.cpp b/contrib/onelab2/OnelabLocalClient.cpp deleted file mode 100644 index 13be1125fb4178edb2548e690986ab8242c7d84b..0000000000000000000000000000000000000000 --- a/contrib/onelab2/OnelabLocalClient.cpp +++ /dev/null @@ -1,12 +0,0 @@ -#include "OnelabLocalClient.h" -#include "OnelabServer.h" - - -template <class T> bool OnelabLocalClient::set(const T &p) -{ - return OnelabServer::instance->set(p, _name); -} -template <class T> bool OnelabLocalClient::get(std::vector<T> &ps, const std::string &name) -{ - return OnelabServer::instance->get(ps, name, _name); -} diff --git a/contrib/onelab2/OnelabNetworkClient.cpp b/contrib/onelab2/OnelabNetworkClient.cpp index 3b32ec31abc8610a8190b9b64c3dcfb8bf3d99c6..d3d0889556ef127285c5b933043e9d40e84fe528 100644 --- a/contrib/onelab2/OnelabNetworkClient.cpp +++ b/contrib/onelab2/OnelabNetworkClient.cpp @@ -137,11 +137,12 @@ int OnelabNetworkClient::recvfrom() } bool OnelabNetworkClient::connect() { + if(_connected) return true; + UInt16 bufflen = 1024; int recvlen = 0; UInt8 buff[1024]; OnelabProtocol msg(OnelabProtocol::OnelabStart); - if(_connected) return true; #ifdef HAVE_UDT if(_fds) { ip4_socket_connect(_fds, _ip); @@ -156,16 +157,17 @@ bool OnelabNetworkClient::connect() recvlen = msg.encodeMsg(buff, bufflen); sendto(buff, recvlen); #ifdef HAVE_UDT - udt_socket_timeout(_fdu, 3); + if(_fdu)udt_socket_timeout(_fdu, 3); + else #endif ip4_socket_timeout(_fds, 3); recvlen = recvfrom(msg); #ifdef HAVE_UDT - udt_socket_timeout(_fdu, -1); + if(_fdu)udt_socket_timeout(_fdu, -1); + else #endif ip4_socket_timeout(_fds, 0); - if(recvlen <= 0) return false; if(recvlen > 0 && msg.msgType() == OnelabProtocol::OnelabStart) _connected = true; return _connected; } @@ -189,12 +191,26 @@ void OnelabNetworkClient::disconnect(bool waitForServer) recvlen = recvfrom(msg); if(msg.msgType() == OnelabProtocol::OnelabStop) { _connected = false; + closeSocket(); break; } } } - else + else { _connected = false; + } +} + +void OnelabNetworkClient::closeSocket() +{ +#ifdef HAVE_UDT + if(_fds) + ip4_socket_close(_fds); + else + udt_socket_close(_fdu); +#else + ip4_socket_close(_fds); +#endif } void OnelabNetworkClient::request(OnelabProtocol &msg) diff --git a/contrib/onelab2/OnelabNetworkClient.h b/contrib/onelab2/OnelabNetworkClient.h index 08474840e49bb2db9dec20d3ad78440ece840718..5e3da23ef00bcca63836be9ae25de9d3dc82d3d7 100644 --- a/contrib/onelab2/OnelabNetworkClient.h +++ b/contrib/onelab2/OnelabNetworkClient.h @@ -149,6 +149,7 @@ public: int recvfrom(UInt8 *buff, UInt16 maxlen); void sendto(UInt8 *buff, UInt16 len); void disconnect(bool waitForServer=false); + void closeSocket(); void setRemoteIP(unsigned long ip){if(!_connected) _ip.address=ip;} void setRemotePort(unsigned short port){if(!_connected) _ip.port=port;}