xbt_swag_t xbt_swag_new(size_t offset);
void xbt_swag_init(xbt_swag_t swag, size_t offset);
void xbt_swag_insert(void *obj, xbt_swag_t swag);
-void *xbt_swag_extract(void *obj, xbt_swag_t swag);
+void *xbt_swag_remove(void *obj, xbt_swag_t swag);
+void *xbt_swag_extract(xbt_swag_t swag);
int xbt_swag_size(xbt_swag_t swag);
int xbt_swag_belongs(void *obj, xbt_swag_t swag);
for (i = 0; i < var->cnsts_number; i++) {
elem = &var->cnsts[i];
- xbt_swag_extract(elem, &(elem->constraint->element_set));
+ xbt_swag_remove(elem, &(elem->constraint->element_set));
if (xbt_swag_size(&(elem->constraint->element_set)))
make_constraint_inactive(sys, elem->constraint);
}
*min_usage = cnst->remaining / cnst->usage;
while ((useless_cnst = xbt_swag_getFirst(&(sys->saturated_constraint_set))))
- xbt_swag_extract(useless_cnst, &(sys->saturated_constraint_set));
+ xbt_swag_remove(useless_cnst, &(sys->saturated_constraint_set));
xbt_swag_insert(cnst, &(sys->saturated_constraint_set));
} else if (*min_usage == cnst->remaining / cnst->usage) {
elem_list = &(cnst->active_element_set);
xbt_swag_foreach(elem, elem_list)
xbt_swag_insert(elem->variable, &(sys->saturated_variable_set));
- xbt_swag_extract(cnst, cnst_list);
+ xbt_swag_remove(cnst, cnst_list);
}
}
cnst->usage -= elem->value / var->weight;
remove_active_elem_in_constraint(elem);
}
- xbt_swag_extract(var, var_list);
+ xbt_swag_remove(var, var_list);
}
/* Find out which variables reach the maximum */
} s_lmm_element_t, *lmm_element_t;
#define insert_elem_in_constraint(elem) xbt_swag_insert(elem,&(elem->constraint->element_set))
#define insert_active_elem_in_constraint(elem) xbt_swag_insert(elem,&(elem->constraint->active_element_set))
-#define remove_active_elem_in_constraint(elem) xbt_swag_extract(elem,&(elem->constraint->active_element_set))
+#define remove_active_elem_in_constraint(elem) xbt_swag_remove(elem,&(elem->constraint->active_element_set))
typedef struct lmm_constraint {
/* hookup to system */
s_xbt_swag_t saturated_constraint_set; /* a list of lmm_constraint_t_t */
} s_lmm_system_t;
-#define extract_variable(sys) xbt_swag_extract(xbt_swag_getFirst(&(sys->variable_set)),&(sys->variable_set))
-#define extract_constraint(sys) xbt_swag_extract(xbt_swag_getFirst(&(sys->constraint_set)),&(sys->constraint_set))
+#define extract_variable(sys) xbt_swag_remove(xbt_swag_getFirst(&(sys->variable_set)),&(sys->variable_set))
+#define extract_constraint(sys) xbt_swag_remove(xbt_swag_getFirst(&(sys->constraint_set)),&(sys->constraint_set))
#define insert_variable(sys,var) xbt_swag_insert(var,&(sys->variable_set))
#define insert_constraint(sys,cnst) xbt_swag_insert(cnst,&(sys->constraint_set))
-#define remove_variable(sys,var) do {xbt_swag_extract(var,&(sys->variable_set));\
- xbt_swag_extract(var,&(sys->saturated_variable_set));} while(0)
-#define remove_constraint(sys,cnst) do {xbt_swag_extract(cnst,&(sys->constraint_set));\
- xbt_swag_extract(cnst,&(sys->saturated_constraint_set));} while(0)
-#define remove_active_constraint(sys,cnst) xbt_swag_extract(cnst,&(sys->active_constraint_set))
+#define remove_variable(sys,var) do {xbt_swag_remove(var,&(sys->variable_set));\
+ xbt_swag_remove(var,&(sys->saturated_variable_set));} while(0)
+#define remove_constraint(sys,cnst) do {xbt_swag_remove(cnst,&(sys->constraint_set));\
+ xbt_swag_remove(cnst,&(sys->saturated_constraint_set));} while(0)
+#define remove_active_constraint(sys,cnst) xbt_swag_remove(cnst,&(sys->active_constraint_set))
#define make_constraint_active(sys,cnst) xbt_swag_insert(cnst,&(sys->active_constraint_set))
#define make_constraint_inactive(sys,cnst) remove_active_constraint(sys,cnst)
{
surf_action_state_t action_state = &(action->resource_type->states);
- xbt_swag_extract(action, action->state_set);
+ xbt_swag_remove(action, action->state_set);
if(state == SURF_ACTION_READY)
action->state_set = action_state->ready_action_set;
swag->tail = obj;
}
-void *xbt_swag_extract(void *obj, xbt_swag_t swag)
+void *xbt_swag_remove(void *obj, xbt_swag_t swag)
{
size_t offset = swag->offset;
return obj;
}
+void *xbt_swag_extract(xbt_swag_t swag)
+{
+ size_t offset = swag->offset;
+ void *obj = NULL;
+
+ if ((!swag) || (!(swag->head)))
+ return NULL;
+
+ obj = swag->head;
+
+ if (swag->head == swag->tail) { /* special case */
+ swag->head = swag->tail = NULL;
+ } else {
+ swag->head = NEXT(obj, offset);
+ PREV(swag->head, offset) = NULL;
+ NEXT(obj, offset) = NULL;
+ }
+
+ return obj;
+}
+
int xbt_swag_size(xbt_swag_t swag)
{
return (swag->count);
xbt_swag_insert(obj2, setA);
xbt_swag_insert(obj2, setB);
- xbt_swag_extract(obj1, setB);
- // xbt_swag_extract(obj2, setB);
+ xbt_swag_remove(obj1, setB);
+ // xbt_swag_remove(obj2, setB);
xbt_swag_foreach(obj,setA) {
printf("\t%s\n",obj->name);