+/*\r
+ * Host.cxx\r
+ *\r
+ * Copyright 2006,2007 Martin Quinson, Malek Cherier \r
+ * All right reserved. \r
+ *\r
+ * This program is free software; you can redistribute \r
+ * it and/or modify it under the terms of the license \r
+ *(GNU LGPL) which comes with this package. \r
+ *\r
+ */\r
+ \r
+ /* Host class member functions implementation.\r
+ */ \r
#include <Host.hpp>\r
\r
-namespace msg\r
-{\r
-// Default constructor.\r
-Host::Host()\r
-{\r
- nativeHost = NULL;\r
- data = NULL;\r
-}\r
-\r
-// Copy constructor.\r
-Host::Host(const Host& rHost)\r
-{\r
-}\r
-\r
-// Destructor.\r
-Host::~Host()\r
-{\r
- nativeHost = NULL;\r
-}\r
+#include <InvalidArgumentException.hpp>\r
+#include <BadAllocException.hpp>\r
+#include <HostNotFoundException.hpp>\r
+#include <MsgException.hpp>\r
\r
-// Operations\r
+#include <Task.hpp>\r
+#include <Process.hpp>\r
\r
-Host& Host::getByName(const char* hostName)\r
-throw(HostNotFoundException)\r
-{\r
- m_host_t nativeHost; // native host.\r
- Host* host = NULL; // wrapper host.\r
- \r
- /* get the host by name (the hosts are created during the grid resolution) */\r
- nativeHost = MSG_get_host_by_name(name);\r
- DEBUG2("MSG gave %p as native host (simdata=%p)",nativeHost,nativeHost->simdata);\r
- \r
- if(!nativeHost) \r
- {// invalid host name\r
- // TODO throw HostNotFoundException\r
- return NULL;\r
- }\r
- \r
- if(!nativeHost->data) \r
- { // native host not associated yet with its wrapper\r
- \r
- // instanciate a new wrapper \r
- host = new Host();\r
- \r
- host->nativeHost = nativeHost; \r
- \r
- // the native host data field is set with its wrapper returned \r
- \r
- nativeHost->data = (void*)host;\r
- }\r
- \r
- // return the reference to cxx wrapper\r
- return *((Host*)nativeHost->data); \r
-}\r
+#include <stdlib.h>\r
+#include <stdio.h>\r
\r
-int Host::getNumber(void)\r
-{\r
- return MSG_get_host_number();\r
-}\r
+#include <msg/msg.h>\r
+#include <msg/private.h>\r
\r
-Host& Host::currentHost(void)\r
-{\r
- Host* host = NULL;\r
- m_host_t nativeHost = MSG_host_self();\r
- \r
- if(!nativeHost->data) \r
- {\r
- // the native host not yet associated with its wrapper\r
- \r
- // instanciate a new wrapper\r
- host = new Host();\r
- \r
- host->nativeHost = nativeHost;\r
- \r
- nativeHost->data = (void*)host;\r
- } \r
- else \r
- {\r
- host = (Host*)nativeHost->data;\r
- }\r
- \r
- return *host;\r
-}\r
+#include <xbt/fifo.h>\r
\r
-int Host::all(Host** hosts) \r
+namespace SimGrid\r
{\r
- int count = xbt_fifo_size(msg_global->host);\r
- \r
- *hosts = new Host[count];\r
- int index;\r
- m_host_t nativeHost;\r
- Host* host;\r
-\r
- m_host_t* table = (m_host_t *)xbt_fifo_to_array(msg_global->host);\r
- \r
- for(index = 0; index < count; index++) \r
+ namespace Msg\r
{\r
- nativeHost = table[index];\r
- host = (Host*)(nativeHost->data);\r
- \r
- if(!host) \r
+ Host::Host()\r
+ {\r
+ nativeHost = NULL;\r
+ data = NULL;\r
+ }\r
+ \r
+ Host::Host(const Host& rHost)\r
+ {\r
+ this->nativeHost = rHost.nativeHost;\r
+ this->data = rHost.getData(); \r
+ }\r
+ \r
+ Host::~Host()\r
{\r
- host = new Host();\r
+ // NOTHING TODO\r
+ }\r
+ \r
+ \r
+ Host& Host::getByName(const char* hostName)\r
+ throw(HostNotFoundException, InvalidArgumentException, BadAllocException)\r
+ {\r
+ // check the parameters\r
+ if(!hostName)\r
+ throw InvalidArgumentException("hostName");\r
+ \r
+ m_host_t nativeHost = NULL; // native host.\r
+ Host* host = NULL; // wrapper host.\r
+ \r
+ if(!(nativeHost = MSG_get_host_by_name(hostName))) \r
+ throw HostNotFoundException(hostName);\r
\r
- host->nativeHost = nativeHost;\r
- nativeHost->data = (void*)host;\r
+ if(!nativeHost->data) \r
+ { // native host not associated yet with its wrapper\r
+ \r
+ // instanciate a new wrapper \r
+ if(!(host = new Host()))\r
+ throw BadAllocException(hostName);\r
+ \r
+ host->nativeHost = nativeHost; \r
+ \r
+ // the native host data field is set with its wrapper returned \r
+ nativeHost->data = (void*)host;\r
+ }\r
+ \r
+ // return the reference to cxx wrapper\r
+ return *((Host*)nativeHost->data); \r
}\r
\r
- hosts[index] = host;\r
- }\r
-\r
- return count; \r
-}\r
-\r
-\r
-const char* Host::getName(void) const\r
-{\r
- return nativeHost->name;\r
-}\r
-\r
-\r
-void Host::setData(void* data)\r
-{\r
- this->data = data;\r
-}\r
-\r
-// Getters/setters\r
-\r
-void* Host::getData(void) const\r
-{\r
- return this->data;\r
-}\r
-\r
-int Host::getRunningTaskNumber(void) const\r
-{\r
- return MSG_get_host_msgload(nativeHost); \r
-}\r
-\r
-double Host::getSpeed(void) const\r
-{\r
- return MSG_get_host_speed(nativeHost->simdata->smx_host);\r
-}\r
-\r
-bool Host::hasData(void) const\r
-{\r
- return (NULL != this->data);\r
-}\r
-\r
-bool Host::isAvailable(void) const\r
-{\r
- return (bool)SIMIX_host_get_state(nativeHost->simdata->smx_host);\r
-}\r
-\r
-void Host::put(int channel, const Task& rTask) \r
-throw(NativeException)\r
-{\r
- if(MSG_OK != MSG_task_put_with_timeout(rTask.nativeTask, nativeHost, channel , -1.0))\r
- {\r
- // TODO throw NativeException\r
- }\r
-} \r
-\r
-void Host::put(int channel, const Task& rTask, double timeout) \r
-throw(NativeException) \r
-{\r
- if(MSG_OK != MSG_task_put_with_timeout(rTask.nativeTask, nativeHost, channel , timeout))\r
- {\r
- // TODO throw NativeException\r
- }\r
-}\r
-\r
-void Host::putBounded(int channel, const Task& rTask, double maxRate) \r
-throw(NativeException)\r
-{\r
- MsgNative.hostPutBounded(this, channel, task, maxrate);\r
- \r
- if(MSG_OK != MSG_task_put_bounded(rTask.nativeTask, nativeHost, channel, maxRate))\r
- {\r
- // TODO throw NativeException\r
- }\r
-}\r
-\r
-\r
-\r
-\r
- \r
-\r
-void Host::send(const Task& rTask) \r
-throw(NativeException) \r
-{ \r
- MSG_error_t rv;\r
- \r
- char* alias = (char*)calloc(strlen(this->getName() + strlen(Process::currentProcess().getName()) + 2);\r
- sprintf(alias,"%s:%s", this->getName(),Process::currentProcess().getName());\r
+ int Host::getNumber(void)\r
+ {\r
+ return MSG_get_host_number();\r
+ }\r
\r
+ Host& Host::currentHost(void)\r
+ {\r
+ Host* host = NULL;\r
+ m_host_t nativeHost = MSG_host_self();\r
+ \r
+ if(!nativeHost->data) \r
+ {\r
+ // the native host not yet associated with its wrapper\r
+ \r
+ // instanciate a new wrapper\r
+ host = new Host();\r
+ \r
+ host->nativeHost = nativeHost;\r
+ \r
+ nativeHost->data = (void*)host;\r
+ } \r
+ else \r
+ {\r
+ host = (Host*)nativeHost->data;\r
+ }\r
+ \r
+ return *host;\r
+ }\r
\r
- rv = MSG_task_send_with_timeout(rTask.nativeTask, alias, -1.0);\r
- \r
- free(alias);\r
- \r
- if(MSG_OK != rv)\r
- {\r
- // TODO throw NativeException\r
- }\r
-} \r
-\r
-void Host::send(const char* alias, const Task& rTask) \r
-throw(NativeException) \r
-{\r
- \r
- if(MSG_OK != MSG_task_send_with_timeout(rTask.nativeTask, alias, -1.0))\r
- {\r
- // TODO throw NativeException\r
- }\r
-}\r
-\r
-void Host::send(const Task& rTask, double timeout) \r
-throw(NativeException) \r
-{\r
- MSG_error_t rv;\r
- \r
- char* alias = (char*)calloc(strlen(this->getName() + strlen(Process::currentProcess().getName()) + 2);\r
- sprintf(alias,"%s:%s", this->getName(),Process::currentProcess().getName());\r
+ void Host::all(Host*** hosts, int* len) \r
+ throw(InvalidArgumentException, BadAllocException) \r
+ {\r
+ // check the parameters\r
+ if(!hosts)\r
+ throw InvalidArgumentException("hosts");\r
+ \r
+ if(len < 0)\r
+ throw InvalidArgumentException("len parameter must be positive");\r
+ \r
+ int count = xbt_fifo_size(msg_global->host);\r
+ \r
+ if(*len < count)\r
+ throw InvalidArgumentException("len parameter must be more than the number of installed host\n (use Host::getNumber() to get the number of hosts)");\r
+ \r
+ int index;\r
+ m_host_t nativeHost;\r
+ Host* host;\r
\r
+ m_host_t* table = (m_host_t *)xbt_fifo_to_array(msg_global->host);\r
+ \r
+ for(index = 0; index < count; index++) \r
+ {\r
+ nativeHost = table[index];\r
+ host = (Host*)(nativeHost->data);\r
+ \r
+ if(!host) \r
+ {\r
+ if(!(host = new Host()))\r
+ {\r
+ // release all allocated memory.\r
+ for(int i = 0; i < index; i++)\r
+ delete (*(hosts)[i]);\r
+ \r
+ throw BadAllocException("to fill the table of the hosts installed on your platform");\r
+ }\r
+ \r
+ host->nativeHost = nativeHost;\r
+ nativeHost->data = (void*)host;\r
+ }\r
+ \r
+ (*hosts)[index] = host;\r
+ }\r
\r
- rv = MSG_task_send_with_timeout(rTask.nativeTask, alias, timeout);\r
- \r
- free(alias);\r
- \r
- if(MSG_OK != rv)\r
- {\r
- // TODO throw NativeException\r
- }\r
-}\r
-\r
-void Host::send(const char* alias, const Task& rTask, double timeout) \r
-throw(NativeException) \r
-{\r
- if(MSG_OK != MSG_task_send_with_timeout(rTask.nativeTask, alias, timeout))\r
- {\r
- // TODO throw NativeException\r
- }\r
-}\r
-\r
-\r
-void Host::sendBounded(const Task& rTask, double maxRate) \r
-throw(NativeException) \r
-{\r
- \r
- MSG_error_t rv;\r
- \r
- char* alias = (char*)calloc(strlen(this->getName() + strlen(Process::currentProcess().getName()) + 2);\r
- sprintf(alias,"%s:%s", this->getName(),Process::currentProcess().getName());\r
+ *len = count; \r
+ }\r
\r
- rv = MSG_task_send_bounded(rTask.nativeTask, alias, maxRate);\r
- \r
- free(alias);\r
- \r
- if(MSG_OK != rv)\r
- {\r
- // TODO throw NativeException\r
- }\r
-} \r
-\r
-void Host::sendBounded(const char* alias, const Task& rTask, double maxRate) \r
-throw(NativeException) \r
-{\r
- if(MSG_OK != MSG_task_send_bounded(rTask.nativeTask, alias, maxRate))\r
- {\r
- // TODO throw NativeException\r
- }\r
-} \r
-\r
- \r
-}
\ No newline at end of file
+ const char* Host::getName(void) const\r
+ {\r
+ return nativeHost->name;\r
+ }\r
+ \r
+ void Host::setData(void* data)\r
+ {\r
+ this->data = data;\r
+ }\r
+ \r
+ void* Host::getData(void) const\r
+ {\r
+ return this->data;\r
+ }\r
+ \r
+ int Host::getRunningTaskNumber(void) const\r
+ {\r
+ return MSG_get_host_msgload(nativeHost); \r
+ }\r
+ \r
+ double Host::getSpeed(void) const\r
+ {\r
+ return MSG_get_host_speed(nativeHost);\r
+ }\r
+ \r
+ bool Host::hasData(void) const\r
+ {\r
+ return (NULL != this->data);\r
+ }\r
+ \r
+ int Host::isAvailable(void) const\r
+ {\r
+ return SIMIX_host_get_state(nativeHost->simdata->smx_host);\r
+ }\r
+ \r
+ void Host::put(int channel, const Task& rTask) \r
+ throw(MsgException, InvalidArgumentException)\r
+ {\r
+ // checks the parameters\r
+ if(channel < 0)\r
+ throw InvalidArgumentException("channel (must be more or equal to zero)");\r
+ \r
+ if(MSG_OK != MSG_task_put_with_timeout(rTask.nativeTask, nativeHost, channel , -1.0))\r
+ throw MsgException("MSG_task_put_with_timeout() failed");\r
+ } \r
+\r
+ void Host::put(int channel, Task* task) \r
+ throw(MsgException, InvalidArgumentException)\r
+ {\r
+ // checks the parameters\r
+ if(channel < 0)\r
+ throw InvalidArgumentException("channel (must be more or equal to zero)");\r
+ \r
+ if(MSG_OK != MSG_task_put_with_timeout(task->nativeTask, nativeHost, channel , -1.0))\r
+ throw MsgException("MSG_task_put_with_timeout() failed");\r
+ } \r
+ \r
+ void Host::put(int channel, const Task& rTask, double timeout) \r
+ throw(MsgException, InvalidArgumentException) \r
+ {\r
+ // checks the parameters\r
+ if(channel < 0)\r
+ throw InvalidArgumentException("channel (must be more or equal to zero)");\r
+ \r
+ if(timeout < 0.0 && timeout != -1.0)\r
+ throw InvalidArgumentException("timeout (must be more or equal to zero or equal to -1.0)"); \r
+ \r
+ \r
+ if(MSG_OK != MSG_task_put_with_timeout(rTask.nativeTask, nativeHost, channel , timeout))\r
+ throw MsgException("MSG_task_put_with_timeout() failed");\r
+ }\r
+ \r
+ void Host::putBounded(int channel, const Task& rTask, double maxRate) \r
+ throw(MsgException, InvalidArgumentException)\r
+ {\r
+ // checks the parameters\r
+ if(channel < 0)\r
+ throw InvalidArgumentException("channel (must be more or equal to zero)");\r
+ \r
+ if(maxRate < 0.0 && maxRate != -1.0)\r
+ throw InvalidArgumentException("maxRate (must be more or equal to zero or equal to -1.0)"); \r
+ \r
+ if(MSG_OK != MSG_task_put_bounded(rTask.nativeTask, nativeHost, channel, maxRate))\r
+ throw MsgException("MSG_task_put_bounded() failed");\r
+ }\r
+ \r
+ void Host::send(const Task& rTask) \r
+ throw(MsgException) \r
+ { \r
+ MSG_error_t rv;\r
+ \r
+ char* alias = (char*)calloc(strlen(this->getName())+ strlen(Process::currentProcess().getName()) + 2, sizeof(char));\r
+ \r
+ if(!alias)\r
+ throw BadAllocException("alias");\r
+ \r
+ sprintf(alias,"%s:%s", this->getName(),Process::currentProcess().getName());\r
+ \r
+ rv = MSG_task_send_with_timeout(rTask.nativeTask, alias, -1.0);\r
+ \r
+ free(alias);\r
+ \r
+ if(MSG_OK != rv)\r
+ throw MsgException("MSG_task_send_with_timeout() failed");\r
+ } \r
+ \r
+ void Host::send(const char* alias, const Task& rTask) \r
+ throw(InvalidArgumentException, MsgException) \r
+ {\r
+ // check the parameters\r
+ if(!alias)\r
+ throw InvalidArgumentException("alias (must not be NULL)");\r
+ \r
+ if(MSG_OK != MSG_task_send_with_timeout(rTask.nativeTask, alias, -1.0))\r
+ throw MsgException("MSG_task_send_with_timeout() failed");\r
+ }\r
+ \r
+ void Host::send(const Task& rTask, double timeout) \r
+ throw(InvalidArgumentException, BadAllocException, MsgException) \r
+ {\r
+ // check the parameters\r
+ if(timeout < 0 && timeout != -1.0)\r
+ throw InvalidArgumentException("timeout (must be positive or equal to zero or equal to -1.0)");\r
+ \r
+ MSG_error_t rv;\r
+ \r
+ char* alias = (char*)calloc(strlen(this->getName()) + strlen(Process::currentProcess().getName()) + 2, sizeof(char));\r
+ \r
+ if(!alias)\r
+ throw BadAllocException("alias");\r
+ \r
+ sprintf(alias,"%s:%s", this->getName(),Process::currentProcess().getName());\r
+ \r
+ \r
+ rv = MSG_task_send_with_timeout(rTask.nativeTask, alias, timeout);\r
+ \r
+ free(alias);\r
+ \r
+ if(MSG_OK != rv)\r
+ throw MsgException("MSG_task_send_with_timeout() failed");\r
+ }\r
+ \r
+ void Host::send(const char* alias, const Task& rTask, double timeout) \r
+ throw(InvalidArgumentException, MsgException) \r
+ {\r
+ // check the parameter\r
+ \r
+ if(!alias)\r
+ throw InvalidArgumentException("alias (must not be NULL)");\r
+ \r
+ if(timeout < 0 && timeout != -1.0)\r
+ throw InvalidArgumentException("timeout (must be positive or equal to zero or equal to -1.0)");\r
+ \r
+ if(MSG_OK != MSG_task_send_with_timeout(rTask.nativeTask, alias, timeout))\r
+ throw MsgException("MSG_task_send_with_timeout() failed");\r
+ }\r
+ \r
+ \r
+ void Host::sendBounded(const Task& rTask, double maxRate) \r
+ throw(InvalidArgumentException, BadAllocException, MsgException) \r
+ {\r
+ if(maxRate < 0 && maxRate != -1.0)\r
+ throw InvalidArgumentException("maxRate (must be positive or equal to zero or equal to -1.0)");\r
+ \r
+ MSG_error_t rv;\r
+ \r
+ char* alias = (char*)calloc(strlen(this->getName()) + strlen(Process::currentProcess().getName()) + 2, sizeof(char));\r
+ \r
+ if(!alias)\r
+ throw BadAllocException("alias");\r
+ \r
+ sprintf(alias,"%s:%s", this->getName(),Process::currentProcess().getName());\r
+ \r
+ rv = MSG_task_send_bounded(rTask.nativeTask, alias, maxRate);\r
+ \r
+ free(alias);\r
+ \r
+ if(MSG_OK != rv)\r
+ throw MsgException("MSG_task_send_bounded() failed");\r
+ } \r
+ \r
+ void Host::sendBounded(const char* alias, const Task& rTask, double maxRate) \r
+ throw(InvalidArgumentException, MsgException) \r
+ {\r
+ // check the parameters\r
+ if(!alias)\r
+ throw InvalidArgumentException("alias (must not be NULL)");\r
+ \r
+ if(maxRate < 0 && maxRate != -1)\r
+ throw InvalidArgumentException("maxRate (must be positive or equal to zero or equal to -1.0)");\r
+ \r
+ if(MSG_OK != MSG_task_send_bounded(rTask.nativeTask, alias, maxRate))\r
+ throw MsgException("MSG_task_send_bounded() failed");\r
+ \r
+ }\r
+ } // namspace Msg\r
+} // namespace SimGrid
\ No newline at end of file