+ if (access_mode == SD_WORKSTATION_SHARED_ACCESS) {
+ xbt_fifo_free(SD_workstation_priv(workstation)->task_fifo);
+ SD_workstation_priv(workstation)->task_fifo = NULL;
+ } else {
+ SD_workstation_priv(workstation)->task_fifo = xbt_fifo_new();
+ }
+}
+
+/* Returns whether a task can start now on a workstation*/
+/*
+ int __SD_workstation_can_start(SD_workstation_t workstation, SD_task_t task) {
+ SD_CHECK_INIT_DONE();
+ xbt_assert(workstation != NULL && task != NULL, "Invalid parameter");
+
+ return !__SD_workstation_is_busy(workstation) &&
+ (xbt_fifo_size(workstation->task_fifo) == 0) || xbt_fifo_get_first_item(workstation->task_fifo) == task);
+ }
+*/
+
+/* Returns whether a workstation is busy. A workstation is busy is it is
+ * in sequential mode and a task is running on it or the fifo is not empty.
+ */
+int __SD_workstation_is_busy(SD_workstation_t workstation)
+{
+ XBT_DEBUG
+ ("Workstation '%s' access mode: '%s', current task: %s, fifo size: %d",
+ SD_workstation_get_name(workstation),
+ (SD_workstation_priv(workstation)->access_mode ==
+ SD_WORKSTATION_SHARED_ACCESS) ? "SHARED" : "FIFO",
+ (SD_workstation_priv(workstation)->current_task ?
+ SD_task_get_name(SD_workstation_priv(workstation)->current_task)
+ : "none"),
+ (SD_workstation_priv(workstation)->task_fifo ? xbt_fifo_size(SD_workstation_priv(workstation)->task_fifo) :
+ 0));
+
+ return SD_workstation_priv(workstation)->access_mode == SD_WORKSTATION_SEQUENTIAL_ACCESS &&
+ (SD_workstation_priv(workstation)->current_task != NULL
+ || xbt_fifo_size(SD_workstation_priv(workstation)->task_fifo) > 0);
+}
+
+/* Destroys a workstation.
+ */
+void __SD_workstation_destroy(void *workstation)
+{
+
+ SD_workstation_priv_t w;
+
+ /* workstation->surf_workstation is freed by surf_exit and workstation->data is freed by the user */
+
+ w = (SD_workstation_priv_t) workstation;
+
+ if (w->access_mode == SD_WORKSTATION_SEQUENTIAL_ACCESS) {
+ xbt_fifo_free(w->task_fifo);
+ }
+ xbt_free(w);
+}
+
+/**
+ * \brief Returns the kind of the task currently running on a workstation
+ * Only call this with sequential access mode set
+ * \param workstation a workstation */
+SD_task_t SD_workstation_get_current_task(SD_workstation_t workstation)
+{
+ xbt_assert(SD_workstation_priv(workstation)->access_mode == SD_WORKSTATION_SEQUENTIAL_ACCESS,
+ "Access mode must be set to SD_WORKSTATION_SEQUENTIAL_ACCESS"
+ " to use this function");
+
+ return (SD_workstation_priv(workstation)->current_task);
+}
+
+/**
+ * \brief Returns a #xbt_dict_t consisting of the list of properties assigned to the AS
+ * or router
+ *
+ * \param AS, router name
+ * \return the xbt_dict_t properties of the AS
+ */
+xbt_dict_t SD_as_router_get_properties(const char *asr)
+{
+ return get_as_router_properties(asr);
+}
+/**
+ * \brief Returns a #xbt_dict_t consisting of the list of properties assigned to the AS
+ * or router
+ *
+ * \param AS, router name
+ * \param The name of a properties
+ * \return value of the properties
+ */
+const char* SD_as_router_get_property_value(const char *asr, const char *name)
+{
+ xbt_dict_t dict = get_as_router_properties(asr);
+ if(!dict) return NULL;
+ return xbt_dict_get_or_null(dict,name);