+void SD_workstation_set_access_mode(SD_workstation_t workstation,
+ e_SD_workstation_access_mode_t
+ access_mode)
+{
+ xbt_assert(access_mode != SD_WORKSTATION_SEQUENTIAL_ACCESS ||
+ access_mode != SD_WORKSTATION_SHARED_ACCESS,
+ "Trying to set an invalid access mode");
+
+ if (access_mode == SD_workstation_priv(workstation)->access_mode) {
+ return; // nothing is changed
+ }
+
+ SD_workstation_priv(workstation)->access_mode = access_mode;
+
+ 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);