+#include "surf/surf.h"
+#include "surf/surf_resource.h"
+#include "msg/msg.h"
+
+XBT_LOG_NEW_DEFAULT_SUBCATEGORY(sd_workstation, sd,
+ "Logging specific to SimDag (workstation)");
+
+/* Creates a workstation and registers it in SD.
+ */
+SD_workstation_t __SD_workstation_create(void *surf_workstation,
+ void *data)
+{
+
+ SD_workstation_priv_t workstation;
+ const char *name;
+
+ workstation = xbt_new(s_SD_workstation_priv_t, 1);
+ workstation->data = data; /* user data */
+ workstation->access_mode = SD_WORKSTATION_SHARED_ACCESS; /* default mode is shared */
+ workstation->task_fifo = NULL;
+ workstation->current_task = NULL;
+
+ name = surf_resource_name(surf_workstation);
+ xbt_lib_set(host_lib,name,SD_HOST_LEVEL,workstation);
+ return xbt_lib_get_elm_or_null(host_lib,name);
+}
+
+/* Creates a storage and registers it in SD.
+ */
+SD_storage_t __SD_storage_create(void *surf_storage, void *data)
+{
+
+ SD_storage_priv_t storage;
+ const char *name;
+
+ storage = xbt_new(s_SD_storage_priv_t, 1);
+ storage->data = data; /* user data */
+ name = surf_resource_name(surf_storage);
+ storage->host = surf_storage_get_host(surf_storage_resource_by_name(name));
+ xbt_lib_set(storage_lib,name, SD_STORAGE_LEVEL, storage);
+ return xbt_lib_get_elm_or_null(storage_lib, name);
+}
+
+/* Destroys a storage.
+ */
+void __SD_storage_destroy(void *storage)
+{
+ SD_storage_priv_t s;
+
+ s = (SD_storage_priv_t) storage;
+ xbt_free(s);
+}
+
+/**
+ * \brief Returns a workstation given its name
+ *
+ * If there is no such workstation, the function returns \c NULL.
+ *
+ * \param name workstation name
+ * \return the workstation, or \c NULL if there is no such workstation
+ */
+SD_workstation_t SD_workstation_get_by_name(const char *name)
+{
+ return xbt_lib_get_elm_or_null(host_lib, name);
+}
+
+/**
+ * \brief Returns the workstation list
+ *
+ * Use SD_workstation_get_number() to know the array size.
+ *
+ * \return an array of \ref SD_workstation_t containing all workstations
+ * \see SD_workstation_get_number()
+ */
+const SD_workstation_t *SD_workstation_get_list(void)
+{
+
+ xbt_lib_cursor_t cursor;
+ char *key;
+ void **data;
+ int i;
+
+ xbt_assert(SD_workstation_get_number() > 0, "There is no workstation!");
+
+ if (sd_global->workstation_list == NULL) { /* this is the first time the function is called */
+ sd_global->workstation_list =
+ xbt_new(SD_workstation_t, xbt_lib_length(host_lib));
+
+ i = 0;
+ xbt_lib_foreach(host_lib, cursor, key, data) {
+ if(data[SD_HOST_LEVEL])
+ sd_global->workstation_list[i++] = xbt_dict_cursor_get_elm(cursor);
+ }
+ }
+ return sd_global->workstation_list;
+}
+
+/**
+ * \brief Returns the number of workstations
+ *
+ * \return the number of existing workstations
+ * \see SD_workstation_get_list()
+ */
+int SD_workstation_get_number(void)
+{
+ return xbt_lib_length(host_lib);
+}
+
+/**
+ * \brief Returns the user data of a workstation
+ *
+ * \param workstation a workstation
+ * \return the user data associated with this workstation (can be \c NULL)
+ * \see SD_workstation_set_data()
+ */
+void *SD_workstation_get_data(SD_workstation_t workstation)
+{
+ return SD_workstation_priv(workstation)->data;
+}
+
+/**
+ * \brief Sets the user data of a workstation
+ *
+ * The new data can be \c NULL. The old data should have been freed first
+ * if it was not \c NULL.
+ *
+ * \param workstation a workstation
+ * \param data the new data you want to associate with this workstation
+ * \see SD_workstation_get_data()
+ */
+void SD_workstation_set_data(SD_workstation_t workstation, void *data)
+{
+ SD_workstation_priv(workstation)->data = data;
+}
+
+/**
+ * \brief Returns the name of a workstation
+ *
+ * \param workstation a workstation
+ * \return the name of this workstation (cannot be \c NULL)
+ */
+const char *SD_workstation_get_name(SD_workstation_t workstation)
+{
+ return sg_host_name(workstation);
+}