本文整理汇总了C++中xassert函数的典型用法代码示例。如果您正苦于以下问题:C++ xassert函数的具体用法?C++ xassert怎么用?C++ xassert使用的例子?那么, 这里精选的函数代码示例或许可以为您提供帮助。
在下文中一共展示了xassert函数的15个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: glp_write_lp
int glp_write_lp(glp_prob *P, const glp_cpxcp *parm, const char *fname)
{ /* write problem data in CPLEX LP format */
glp_cpxcp _parm;
struct csa _csa, *csa = &_csa;
glp_file *fp;
GLPROW *row;
GLPCOL *col;
GLPAIJ *aij;
int i, j, len, flag, count, ret;
char line[1000+1], term[500+1], name[255+1];
xprintf("Writing problem data to '%s'...\n", fname);
if (parm == NULL)
glp_init_cpxcp(&_parm), parm = &_parm;
/* check control parameters */
check_parm("glp_write_lp", parm);
/* initialize common storage area */
csa->P = P;
csa->parm = parm;
/* create output CPLEX LP file */
fp = glp_open(fname, "w"), count = 0;
if (fp == NULL)
{ xprintf("Unable to create '%s' - %s\n", fname, get_err_msg());
ret = 1;
goto done;
}
/* write problem name */
xfprintf(fp, "\\* Problem: %s *\\\n",
P->name == NULL ? "Unknown" : P->name), count++;
xfprintf(fp, "\n"), count++;
/* the problem should contain at least one row and one column */
if (!(P->m > 0 && P->n > 0))
{ xprintf("Warning: problem has no rows/columns\n");
xfprintf(fp, "\\* WARNING: PROBLEM HAS NO ROWS/COLUMNS *\\\n"),
count++;
xfprintf(fp, "\n"), count++;
goto skip;
}
/* write the objective function definition */
if (P->dir == GLP_MIN)
xfprintf(fp, "Minimize\n"), count++;
else if (P->dir == GLP_MAX)
xfprintf(fp, "Maximize\n"), count++;
else
xassert(P != P);
row_name(csa, 0, name);
sprintf(line, " %s:", name);
len = 0;
for (j = 1; j <= P->n; j++)
{ col = P->col[j];
if (col->coef != 0.0 || col->ptr == NULL)
{ len++;
col_name(csa, j, name);
if (col->coef == 0.0)
sprintf(term, " + 0 %s", name); /* empty column */
else if (col->coef == +1.0)
sprintf(term, " + %s", name);
else if (col->coef == -1.0)
sprintf(term, " - %s", name);
else if (col->coef > 0.0)
sprintf(term, " + %.*g %s", DBL_DIG, +col->coef, name);
else
sprintf(term, " - %.*g %s", DBL_DIG, -col->coef, name);
if (strlen(line) + strlen(term) > 72)
xfprintf(fp, "%s\n", line), line[0] = '\0', count++;
strcat(line, term);
}
}
if (len == 0)
{ /* empty objective */
sprintf(term, " 0 %s", col_name(csa, 1, name));
strcat(line, term);
}
xfprintf(fp, "%s\n", line), count++;
if (P->c0 != 0.0)
xfprintf(fp, "\\* constant term = %.*g *\\\n", DBL_DIG, P->c0),
count++;
xfprintf(fp, "\n"), count++;
/* write the constraints section */
xfprintf(fp, "Subject To\n"), count++;
for (i = 1; i <= P->m; i++)
{ row = P->row[i];
if (row->type == GLP_FR) continue; /* skip free row */
row_name(csa, i, name);
sprintf(line, " %s:", name);
/* linear form */
for (aij = row->ptr; aij != NULL; aij = aij->r_next)
{ col_name(csa, aij->col->j, name);
if (aij->val == +1.0)
sprintf(term, " + %s", name);
else if (aij->val == -1.0)
sprintf(term, " - %s", name);
else if (aij->val > 0.0)
sprintf(term, " + %.*g %s", DBL_DIG, +aij->val, name);
else
sprintf(term, " - %.*g %s", DBL_DIG, -aij->val, name);
if (strlen(line) + strlen(term) > 72)
xfprintf(fp, "%s\n", line), line[0] = '\0', count++;
strcat(line, term);
}
if (row->type == GLP_DB)
//.........这里部分代码省略.........
示例2: list_count
static void *_track_freeing_blocks(void *args)
{
bg_free_block_list_t *bg_free_list = (bg_free_block_list_t *)args;
List track_list = bg_free_list->track_list;
bool destroy = bg_free_list->destroy;
uint32_t job_id = bg_free_list->job_id;
int retry_cnt = 0;
int free_cnt = 0, track_cnt = list_count(track_list);
ListIterator itr = list_iterator_create(track_list);
bg_record_t *bg_record;
bool restore = true;
debug("_track_freeing_blocks: Going to free %d for job %u",
track_cnt, job_id);
while (retry_cnt < MAX_FREE_RETRIES) {
free_cnt = 0;
slurm_mutex_lock(&block_state_mutex);
/* just to make sure state is updated */
bridge_status_update_block_list_state(track_list);
list_iterator_reset(itr);
/* just incase this changes from the update function */
track_cnt = list_count(track_list);
while ((bg_record = list_next(itr))) {
if (bg_record->magic != BLOCK_MAGIC) {
/* update_block_list_state should
remove this already from the list
so we shouldn't ever have this.
*/
error("_track_freeing_blocks: block was "
"already destroyed %p", bg_record);
xassert(0);
free_cnt++;
continue;
}
#ifndef HAVE_BG_FILES
/* Fake a free since we are n deallocating
state before this.
*/
if (!(bg_record->state & BG_BLOCK_ERROR_FLAG)
&& (retry_cnt >= 3))
bg_record->state = BG_BLOCK_FREE;
#endif
if ((bg_record->state == BG_BLOCK_FREE)
|| (bg_record->state & BG_BLOCK_ERROR_FLAG))
free_cnt++;
else if (bg_record->state != BG_BLOCK_TERM)
bg_free_block(bg_record, 0, 1);
}
slurm_mutex_unlock(&block_state_mutex);
if (free_cnt == track_cnt)
break;
debug("_track_freeing_blocks: freed %d of %d for job %u",
free_cnt, track_cnt, job_id);
sleep(FREE_SLEEP_INTERVAL);
retry_cnt++;
}
debug("_track_freeing_blocks: Freed them all for job %u", job_id);
if (destroy)
restore = false;
/* If there is a block in error state we need to keep all
* these blocks around. */
slurm_mutex_lock(&block_state_mutex);
list_iterator_reset(itr);
while ((bg_record = list_next(itr))) {
/* block no longer exists */
if (bg_record->magic != BLOCK_MAGIC)
continue;
if (bg_record->state != BG_BLOCK_FREE) {
restore = true;
break;
}
}
list_iterator_reset(itr);
while ((bg_record = list_next(itr)))
_post_block_free(bg_record, restore);
slurm_mutex_unlock(&block_state_mutex);
last_bg_update = time(NULL);
list_iterator_destroy(itr);
list_destroy(track_list);
xfree(bg_free_list);
return NULL;
}
示例3: _post_block_free
/* block_state_mutex should be locked before calling this */
static int _post_block_free(bg_record_t *bg_record, bool restore)
{
int rc = SLURM_SUCCESS;
if (bg_record->magic != BLOCK_MAGIC) {
error("block already destroyed %p", bg_record);
xassert(0);
return SLURM_ERROR;
}
bg_record->free_cnt--;
if (bg_record->free_cnt == -1) {
info("we got a negative 1 here for %s",
bg_record->bg_block_id);
xassert(0);
return SLURM_SUCCESS;
} else if (bg_record->modifying) {
info("others are modifing this block %s, don't clear it up",
bg_record->bg_block_id);
return SLURM_SUCCESS;
} else if (bg_record->free_cnt) {
if (bg_conf->slurm_debug_flags & DEBUG_FLAG_SELECT_TYPE)
info("%d others are trying to destroy this block %s",
bg_record->free_cnt, bg_record->bg_block_id);
return SLURM_SUCCESS;
}
/* Even if the block is already in error state we need to do this to
avoid any overlapping blocks that may have been created due
to bad hardware.
*/
if ((bg_record->state & (~BG_BLOCK_ERROR_FLAG)) != BG_BLOCK_FREE) {
/* Something isn't right, go mark this one in an error
state. */
update_block_msg_t block_msg;
if (bg_conf->slurm_debug_flags & DEBUG_FLAG_SELECT_TYPE)
info("_post_block_free: block %s is not in state "
"free (%s), putting it in error state.",
bg_record->bg_block_id,
bg_block_state_string(bg_record->state));
slurm_init_update_block_msg(&block_msg);
block_msg.bg_block_id = bg_record->bg_block_id;
block_msg.state = BG_BLOCK_ERROR_FLAG;
block_msg.reason = "Block would not deallocate";
slurm_mutex_unlock(&block_state_mutex);
select_g_update_block(&block_msg);
slurm_mutex_lock(&block_state_mutex);
if (block_ptr_exist_in_list(bg_lists->main, bg_record))
bg_record->destroy = 0;
return SLURM_SUCCESS;
}
/* If we are here we are done with the destroy so just reset it. */
bg_record->destroy = 0;
/* A bit of a sanity check to make sure blocks are being
removed out of all the lists.
*/
remove_from_bg_list(bg_lists->booted, bg_record);
if (remove_from_bg_list(bg_lists->job_running, bg_record)
== SLURM_SUCCESS) {
debug2("_post_block_free: we are freeing block %s and "
"it was in the job_running list. This can happen if a "
"block is removed while waiting for mmcs to finish "
"removing the job from the block.",
bg_record->bg_block_id);
num_unused_cpus += bg_record->cpu_cnt;
}
/* If we don't have any mp_counts force block removal */
if (restore && bg_record->mp_count)
return SLURM_SUCCESS;
if (remove_from_bg_list(bg_lists->main, bg_record) != SLURM_SUCCESS) {
/* This should only happen if called from
* bg_job_place.c where the block was never added to
* the list. */
debug("_post_block_free: It appears this block %s isn't "
"in the main list anymore.",
bg_record->bg_block_id);
}
if (bg_conf->slurm_debug_flags & DEBUG_FLAG_SELECT_TYPE)
info("_post_block_free: removing %s from database",
bg_record->bg_block_id);
rc = bridge_block_remove(bg_record);
if (rc != SLURM_SUCCESS) {
if (rc == BG_ERROR_BLOCK_NOT_FOUND) {
debug("_post_block_free: block %s is not found",
bg_record->bg_block_id);
} else {
error("_post_block_free: "
"bridge_block_remove(%s): %s",
bg_record->bg_block_id,
bg_err_str(rc));
}
} else if (bg_conf->slurm_debug_flags & DEBUG_FLAG_SELECT_TYPE)
info("_post_block_free: done %s(%p)",
//.........这里部分代码省略.........
示例4: _get_precs
static List _get_precs(List task_list, bool pgid_plugin, uint64_t cont_id,
jag_callbacks_t *callbacks)
{
List prec_list = list_create(destroy_jag_prec);
char proc_stat_file[256]; /* Allow ~20x extra length */
char proc_io_file[256]; /* Allow ~20x extra length */
char proc_smaps_file[256]; /* Allow ~20x extra length */
static int slash_proc_open = 0;
int i;
struct jobacctinfo *jobacct = NULL;
xassert(task_list);
jobacct = list_peek(task_list);
if (!pgid_plugin) {
pid_t *pids = NULL;
int npids = 0;
/* get only the processes in the proctrack container */
proctrack_g_get_pids(cont_id, &pids, &npids);
if (!npids) {
/* update consumed energy even if pids do not exist */
if (jobacct) {
acct_gather_energy_g_get_data(
energy_profile,
&jobacct->energy);
jobacct->tres_usage_in_tot[TRES_ARRAY_ENERGY] =
jobacct->energy.consumed_energy;
jobacct->tres_usage_out_tot[TRES_ARRAY_ENERGY] =
jobacct->energy.current_watts;
debug2("%s: energy = %"PRIu64" watts = %"PRIu64,
__func__,
jobacct->tres_usage_in_tot[
TRES_ARRAY_ENERGY],
jobacct->tres_usage_out_tot[
TRES_ARRAY_ENERGY]);
}
debug4("no pids in this container %"PRIu64"", cont_id);
goto finished;
}
for (i = 0; i < npids; i++) {
snprintf(proc_stat_file, 256, "/proc/%d/stat", pids[i]);
snprintf(proc_io_file, 256, "/proc/%d/io", pids[i]);
snprintf(proc_smaps_file, 256, "/proc/%d/smaps", pids[i]);
_handle_stats(prec_list, proc_stat_file, proc_io_file,
proc_smaps_file, callbacks,
jobacct ? jobacct->tres_count : 0);
}
xfree(pids);
} else {
struct dirent *slash_proc_entry;
char *iptr = NULL, *optr = NULL, *optr2 = NULL;
if (slash_proc_open) {
rewinddir(slash_proc);
} else {
slash_proc=opendir("/proc");
if (slash_proc == NULL) {
perror("opening /proc");
goto finished;
}
slash_proc_open=1;
}
strcpy(proc_stat_file, "/proc/");
strcpy(proc_io_file, "/proc/");
strcpy(proc_smaps_file, "/proc/");
while ((slash_proc_entry = readdir(slash_proc))) {
/* Save a few cyles by simulating
* strcat(statFileName, slash_proc_entry->d_name);
* strcat(statFileName, "/stat");
* while checking for a numeric filename (which really
* should be a pid). Then do the same for the
* /proc/<pid>/io file name.
*/
optr = proc_stat_file + sizeof("/proc");
iptr = slash_proc_entry->d_name;
i = 0;
do {
if ((*iptr < '0') ||
((*optr++ = *iptr++) > '9')) {
i = -1;
break;
}
} while (*iptr);
if (i == -1)
continue;
iptr = (char*)"/stat";
do {
*optr++ = *iptr++;
} while (*iptr);
*optr = 0;
optr2 = proc_io_file + sizeof("/proc");
iptr = slash_proc_entry->d_name;
i = 0;
//.........这里部分代码省略.........
示例5: addto_update_list
/*
* addto_update_list - add object updated to list
* IN/OUT update_list: list of updated objects
* IN type: update type
* IN object: object updated
* RET: error code
*
* NOTE: This function will take the object given and free it later so it
* needed to be removed from a list if in one before.
*/
extern int addto_update_list(List update_list, slurmdb_update_type_t type,
void *object)
{
slurmdb_update_object_t *update_object = NULL;
slurmdb_association_rec_t *assoc = object;
slurmdb_qos_rec_t *qos = object;
ListIterator itr = NULL;
if(!update_list) {
error("no update list given");
return SLURM_ERROR;
}
itr = list_iterator_create(update_list);
while((update_object = list_next(itr))) {
if(update_object->type == type)
break;
}
list_iterator_destroy(itr);
if(update_object) {
/* here we prepend primarly for remove association
since parents need to be removed last, and they are
removed first in the calling code */
list_prepend(update_object->objects, object);
return SLURM_SUCCESS;
}
update_object = xmalloc(sizeof(slurmdb_update_object_t));
list_append(update_list, update_object);
update_object->type = type;
list_sort(update_list, (ListCmpF)_sort_update_object_dec);
switch(type) {
case SLURMDB_MODIFY_USER:
case SLURMDB_ADD_USER:
case SLURMDB_REMOVE_USER:
case SLURMDB_ADD_COORD:
case SLURMDB_REMOVE_COORD:
update_object->objects = list_create(slurmdb_destroy_user_rec);
break;
case SLURMDB_ADD_ASSOC:
/* We are going to send these to the slurmctld's so
lets set up the correct limits to INIFINITE instead
of NO_VAL */
if(assoc->grp_cpu_mins == (uint64_t)NO_VAL)
assoc->grp_cpu_mins = (uint64_t)INFINITE;
if(assoc->grp_cpu_run_mins == (uint64_t)NO_VAL)
assoc->grp_cpu_run_mins = (uint64_t)INFINITE;
if(assoc->grp_cpus == NO_VAL)
assoc->grp_cpus = INFINITE;
if(assoc->grp_jobs == NO_VAL)
assoc->grp_jobs = INFINITE;
if(assoc->grp_nodes == NO_VAL)
assoc->grp_nodes = INFINITE;
if(assoc->grp_submit_jobs == NO_VAL)
assoc->grp_submit_jobs = INFINITE;
if(assoc->grp_wall == NO_VAL)
assoc->grp_wall = INFINITE;
if(assoc->max_cpu_mins_pj == (uint64_t)NO_VAL)
assoc->max_cpu_mins_pj = (uint64_t)INFINITE;
if(assoc->max_cpu_run_mins == (uint64_t)NO_VAL)
assoc->max_cpu_run_mins = (uint64_t)INFINITE;
if(assoc->max_cpus_pj == NO_VAL)
assoc->max_cpus_pj = INFINITE;
if(assoc->max_jobs == NO_VAL)
assoc->max_jobs = INFINITE;
if(assoc->max_nodes_pj == NO_VAL)
assoc->max_nodes_pj = INFINITE;
if(assoc->max_submit_jobs == NO_VAL)
assoc->max_submit_jobs = INFINITE;
if(assoc->max_wall_pj == NO_VAL)
assoc->max_wall_pj = INFINITE;
case SLURMDB_MODIFY_ASSOC:
case SLURMDB_REMOVE_ASSOC:
xassert(((slurmdb_association_rec_t *)object)->cluster);
update_object->objects = list_create(
slurmdb_destroy_association_rec);
break;
case SLURMDB_ADD_QOS:
/* We are going to send these to the slurmctld's so
lets set up the correct limits to INIFINITE instead
of NO_VAL */
if(qos->grp_cpu_mins == (uint64_t)NO_VAL)
qos->grp_cpu_mins = (uint64_t)INFINITE;
if(qos->grp_cpu_run_mins == (uint64_t)NO_VAL)
qos->grp_cpu_run_mins = (uint64_t)INFINITE;
if(qos->grp_cpus == NO_VAL)
//.........这里部分代码省略.........
示例6: glp_asnprob_okalg
int glp_asnprob_okalg(int form, glp_graph *G, int v_set, int a_cost,
double *sol, int a_x)
{ /* solve assignment problem with out-of-kilter algorithm */
glp_vertex *v;
glp_arc *a;
int nv, na, i, k, *tail, *head, *low, *cap, *cost, *x, *pi, ret;
double temp;
if (!(form == GLP_ASN_MIN || form == GLP_ASN_MAX ||
form == GLP_ASN_MMP))
xerror("glp_asnprob_okalg: form = %d; invalid parameter\n",
form);
if (v_set >= 0 && v_set > G->v_size - (int)sizeof(int))
xerror("glp_asnprob_okalg: v_set = %d; invalid offset\n",
v_set);
if (a_cost >= 0 && a_cost > G->a_size - (int)sizeof(double))
xerror("glp_asnprob_okalg: a_cost = %d; invalid offset\n",
a_cost);
if (a_x >= 0 && a_x > G->a_size - (int)sizeof(int))
xerror("glp_asnprob_okalg: a_x = %d; invalid offset\n", a_x);
if (glp_check_asnprob(G, v_set))
return GLP_EDATA;
/* nv is the total number of nodes in the resulting network */
nv = G->nv + 1;
/* na is the total number of arcs in the resulting network */
na = G->na + G->nv;
/* allocate working arrays */
tail = xcalloc(1+na, sizeof(int));
head = xcalloc(1+na, sizeof(int));
low = xcalloc(1+na, sizeof(int));
cap = xcalloc(1+na, sizeof(int));
cost = xcalloc(1+na, sizeof(int));
x = xcalloc(1+na, sizeof(int));
pi = xcalloc(1+nv, sizeof(int));
/* construct the resulting network */
k = 0;
/* (original arcs) */
for (i = 1; i <= G->nv; i++)
{ v = G->v[i];
for (a = v->out; a != NULL; a = a->t_next)
{ k++;
tail[k] = a->tail->i;
head[k] = a->head->i;
low[k] = 0;
cap[k] = 1;
if (a_cost >= 0)
memcpy(&temp, (char *)a->data + a_cost, sizeof(double));
else
temp = 1.0;
if (!(fabs(temp) <= (double)INT_MAX && temp == floor(temp)))
{ ret = GLP_EDATA;
goto done;
}
cost[k] = (int)temp;
if (form != GLP_ASN_MIN) cost[k] = - cost[k];
}
}
/* (artificial arcs) */
for (i = 1; i <= G->nv; i++)
{ v = G->v[i];
k++;
if (v->out == NULL)
tail[k] = i, head[k] = nv;
else if (v->in == NULL)
tail[k] = nv, head[k] = i;
else
xassert(v != v);
low[k] = (form == GLP_ASN_MMP ? 0 : 1);
cap[k] = 1;
cost[k] = 0;
}
xassert(k == na);
/* find minimal-cost circulation in the resulting network */
ret = okalg(nv, na, tail, head, low, cap, cost, x, pi);
switch (ret)
{ case 0:
/* optimal circulation found */
ret = 0;
break;
case 1:
/* no feasible circulation exists */
ret = GLP_ENOPFS;
break;
case 2:
/* integer overflow occured */
ret = GLP_ERANGE;
goto done;
case 3:
/* optimality test failed (logic error) */
ret = GLP_EFAIL;
goto done;
default:
xassert(ret != ret);
}
/* store solution components */
/* (objective function = the total cost) */
if (sol != NULL)
{ temp = 0.0;
for (k = 1; k <= na; k++)
temp += (double)cost[k] * (double)x[k];
if (form != GLP_ASN_MIN) temp = - temp;
//.........这里部分代码省略.........
示例7: slurm_ckpt_op
extern int slurm_ckpt_op (uint32_t job_id, uint32_t step_id,
struct step_record *step_ptr, uint16_t op,
uint16_t data, char *image_dir, time_t * event_time,
uint32_t *error_code, char **error_msg )
{
int rc = SLURM_SUCCESS;
struct check_job_info *check_ptr;
if (!step_ptr) /* batch job restore */
return ESLURM_NOT_SUPPORTED;
check_ptr = (struct check_job_info *)step_ptr->check_job;
xassert(check_ptr);
switch (op) {
case CHECK_ABLE:
if (check_ptr->disabled)
rc = ESLURM_DISABLED;
else {
if ((check_ptr->reply_cnt < 1) && event_time) {
/* Return time of last event */
*event_time = check_ptr->time_stamp;
}
rc = SLURM_SUCCESS;
}
break;
case CHECK_DISABLE:
check_ptr->disabled++;
break;
case CHECK_ENABLE:
check_ptr->disabled--;
break;
case CHECK_CREATE:
check_ptr->time_stamp = time(NULL);
check_ptr->reply_cnt = 0;
check_ptr->error_code = 0;
xfree(check_ptr->error_msg);
rc = _ckpt_step(step_ptr, data, 0);
break;
case CHECK_VACATE:
check_ptr->time_stamp = time(NULL);
check_ptr->reply_cnt = 0;
check_ptr->error_code = 0;
xfree(check_ptr->error_msg);
rc = _ckpt_step(step_ptr, data, 1);
break;
case CHECK_RESTART:
case CHECK_REQUEUE:
/* Lots of work is required in Slurm to restart a
* checkpointed job. For now the user can submit a
* new job and execute "ompi_restart <snapshot>" */
rc = ESLURM_NOT_SUPPORTED;
break;
case CHECK_ERROR:
xassert(error_code);
xassert(error_msg);
*error_code = check_ptr->error_code;
xfree(*error_msg);
*error_msg = xstrdup(check_ptr->error_msg);
break;
default:
error("Invalid checkpoint operation: %d", op);
rc = EINVAL;
}
return rc;
}
示例8: pack_process_mapping
/* pack_process_mapping()
*/
char *
pack_process_mapping(uint32_t node_cnt,
uint32_t task_cnt,
uint16_t *tasks,
uint32_t **tids)
{
int offset, i;
int start_node, end_node;
char *packing = NULL;
/* next_task[i] - next process for processing
*/
uint16_t *next_task = xmalloc(node_cnt * sizeof(uint16_t));
packing = xstrdup("(vector");
offset = 0;
while (offset < task_cnt) {
int mapped = 0;
int depth = -1;
int j;
start_node = end_node = 0;
/* find the task with id == offset
*/
for (i = 0; i < node_cnt; i++) {
if (next_task[i] < tasks[i]) {
/* if we didn't consume entire
* quota on this node
*/
xassert(offset >= tids[i][next_task[i]]);
if (offset == tids[i][next_task[i]]) {
start_node = i;
break;
}
}
}
end_node = node_cnt;
for (i = start_node; i < end_node; i++) {
if (next_task[i] >= tasks[i] ) {
/* Save first non-matching node index
* and interrupt loop
*/
end_node = i;
continue;
}
for (j = next_task[i]; ((j + 1) < tasks[i])
&& ((tids[i][j]+1) == tids[i][j+1]); j++);
j++;
/* First run determines the depth
*/
if (depth < 0) {
depth = j - next_task[i];
} else {
/* If this is not the first node in the bar
* check that: 1. First tid on this node is
* sequentially next after last tid
* on the previous node
*/
if (tids[i-1][next_task[i-1]-1] + 1
!= tids[i][next_task[i]]) {
end_node = i;
continue;
}
}
if (depth == (j - next_task[i])) {
mapped += depth;
next_task[i] = j;
} else {
/* Save first non-matching node index
*
* and interrupt loop
*/
end_node = i;
}
}
xstrfmtcat(packing,",(%u,%u,%u)",
start_node, end_node - start_node, depth);
offset += mapped;
}
xstrcat(packing,")");
return packing;
}
示例9: slurm_ckpt_op
/*
* The remainder of this file implements the standard SLURM checkpoint API.
*/
extern int slurm_ckpt_op (uint32_t job_id, uint32_t step_id,
struct step_record *step_ptr, uint16_t op,
uint16_t data, char *image_dir, time_t * event_time,
uint32_t *error_code, char **error_msg )
{
int rc = SLURM_SUCCESS;
struct check_job_info *check_ptr;
uint16_t done_sig = 0;
struct job_record *job_ptr;
struct node_record *node_ptr;
pthread_attr_t attr;
pthread_t ckpt_agent_tid = 0;
char *nodelist;
struct ckpt_req *req_ptr;
/* job/step checked already */
job_ptr = find_job_record(job_id);
if (!job_ptr)
return ESLURM_INVALID_JOB_ID;
if (step_id == SLURM_BATCH_SCRIPT) {
check_ptr = (struct check_job_info *)job_ptr->check_job;
node_ptr = find_first_node_record(job_ptr->node_bitmap);
nodelist = node_ptr->name;
} else {
step_ptr = find_step_record(job_ptr, step_id);
if (!step_ptr)
return ESLURM_INVALID_JOB_ID;
check_ptr = (struct check_job_info *)step_ptr->check_job;
nodelist = step_ptr->step_layout->node_list;
}
xassert(check_ptr);
switch (op) {
case CHECK_ABLE:
if (check_ptr->disabled)
rc = ESLURM_DISABLED;
else {
*event_time = check_ptr->time_stamp;
rc = SLURM_SUCCESS;
}
break;
case CHECK_DISABLE:
check_ptr->disabled++;
break;
case CHECK_ENABLE:
check_ptr->disabled--;
break;
case CHECK_REQUEUE:
if (step_id != SLURM_BATCH_SCRIPT) {
rc = ESLURM_NOT_SUPPORTED;
break;
}
/* no break */
case CHECK_VACATE:
done_sig = SIGTERM;
/* no break */
case CHECK_CREATE:
if (check_ptr->disabled) {
rc = ESLURM_DISABLED;
break;
}
if (check_ptr->time_stamp != 0) {
rc = EALREADY;
break;
}
check_ptr->time_stamp = time(NULL);
check_ptr->error_code = 0;
xfree(check_ptr->error_msg);
req_ptr = xmalloc(sizeof(struct ckpt_req));
if (!req_ptr) {
rc = ENOMEM;
break;
}
req_ptr->gid = job_ptr->group_id;
req_ptr->uid = job_ptr->user_id;
req_ptr->job_id = job_id;
req_ptr->step_id = step_id;
req_ptr->begin_time = check_ptr->time_stamp;
req_ptr->wait = data;
req_ptr->image_dir = xstrdup(image_dir);
req_ptr->nodelist = xstrdup(nodelist);
req_ptr->sig_done = done_sig;
req_ptr->op = op;
slurm_attr_init(&attr);
if (pthread_attr_setdetachstate(&attr,
PTHREAD_CREATE_DETACHED)) {
error("pthread_attr_setdetachstate: %m");
rc = errno;
break;
}
if (pthread_create(&ckpt_agent_tid, &attr, _ckpt_agent_thr,
req_ptr)) {
error("pthread_create: %m");
//.........这里部分代码省略.........
示例10: switch_p_libstate_restore
extern int switch_p_libstate_restore(char *dir_name, bool recover)
{
#ifdef HAVE_NATIVE_CRAY
char *data = NULL, *file_name;
Buf buffer = NULL;
int error_code = SLURM_SUCCESS;
int state_fd, data_allocated = 0, data_read = 0, data_size = 0;
xassert(dir_name != NULL);
if (debug_flags & DEBUG_FLAG_SWITCH) {
CRAY_INFO("restore from %s, recover %d",
dir_name, (int) recover);
}
if (!recover) /* clean start, no recovery */
return SLURM_SUCCESS;
file_name = xstrdup(dir_name);
xstrcat(file_name, "/switch_cray_state");
state_fd = open (file_name, O_RDONLY);
if (state_fd >= 0) {
data_allocated = SWITCH_BUF_SIZE;
data = xmalloc(data_allocated);
while (1) {
data_read = read (state_fd, &data[data_size],
SWITCH_BUF_SIZE);
if ((data_read < 0) && (errno == EINTR))
continue;
if (data_read < 0) {
CRAY_ERR("Read error on %s, %m", file_name);
error_code = SLURM_ERROR;
break;
} else if (data_read == 0)
break;
data_size += data_read;
data_allocated += data_read;
xrealloc(data, data_allocated);
}
close (state_fd);
(void) unlink(file_name); /* One chance to recover */
xfree(file_name);
} else {
CRAY_ERR("No %s file for switch/cray state recovery",
file_name);
CRAY_ERR("Starting switch/cray with clean state");
xfree(file_name);
return SLURM_SUCCESS;
}
if (error_code == SLURM_SUCCESS) {
buffer = create_buf (data, data_size);
data = NULL; /* now in buffer, don't xfree() */
_state_read_buf(buffer);
}
if (buffer)
free_buf(buffer);
xfree(data);
#endif
return SLURM_SUCCESS;
}
示例11: start_msg_tree
/*
* start_msg_tree - logic to begin the forward tree and
* accumulate the return codes from processes getting the
* the forwarded message
*
* IN: hl - hostlist_t - list of every node to send message to
* IN: msg - slurm_msg_t - message to send.
* IN: timeout - int - how long to wait in milliseconds.
* RET List - List containing the responses of the childern
* (if any) we forwarded the message to. List
* containing type (ret_data_info_t).
*/
extern List start_msg_tree(hostlist_t hl, slurm_msg_t *msg, int timeout)
{
int *span = NULL;
fwd_tree_t *fwd_tree = NULL;
pthread_mutex_t tree_mutex;
pthread_cond_t notify;
int j = 0, count = 0;
List ret_list = NULL;
char *name = NULL;
int thr_count = 0;
int host_count = 0;
xassert(hl);
xassert(msg);
hostlist_uniq(hl);
host_count = hostlist_count(hl);
span = set_span(host_count, 0);
slurm_mutex_init(&tree_mutex);
pthread_cond_init(¬ify, NULL);
ret_list = list_create(destroy_data_info);
while ((name = hostlist_shift(hl))) {
pthread_attr_t attr_agent;
pthread_t thread_agent;
int retries = 0;
slurm_attr_init(&attr_agent);
if (pthread_attr_setdetachstate
(&attr_agent, PTHREAD_CREATE_DETACHED))
error("pthread_attr_setdetachstate error %m");
fwd_tree = xmalloc(sizeof(fwd_tree_t));
fwd_tree->orig_msg = msg;
fwd_tree->ret_list = ret_list;
fwd_tree->timeout = timeout;
fwd_tree->notify = ¬ify;
fwd_tree->tree_mutex = &tree_mutex;
if(fwd_tree->timeout <= 0) {
/* convert secs to msec */
fwd_tree->timeout = slurm_get_msg_timeout() * 1000;
}
fwd_tree->tree_hl = hostlist_create(name);
free(name);
for (j = 0; j < span[thr_count]; j++) {
name = hostlist_shift(hl);
if (!name)
break;
hostlist_push(fwd_tree->tree_hl, name);
free(name);
}
while (pthread_create(&thread_agent, &attr_agent,
_fwd_tree_thread, (void *)fwd_tree)) {
error("pthread_create error %m");
if (++retries > MAX_RETRIES)
fatal("Can't create pthread");
sleep(1); /* sleep and try again */
}
slurm_attr_destroy(&attr_agent);
thr_count++;
}
xfree(span);
slurm_mutex_lock(&tree_mutex);
count = list_count(ret_list);
debug2("Tree head got back %d looking for %d", count, host_count);
while ((count < host_count)) {
pthread_cond_wait(¬ify, &tree_mutex);
count = list_count(ret_list);
debug2("Tree head got back %d", count);
}
debug2("Tree head got them all");
slurm_mutex_unlock(&tree_mutex);
slurm_mutex_destroy(&tree_mutex);
pthread_cond_destroy(¬ify);
return ret_list;
}
示例12: parse_bounds
static void parse_bounds(struct csa *csa)
{ int j, lb_flag;
double lb, s;
/* parse the keyword 'bounds' */
xassert(csa->token == T_BOUNDS);
scan_token(csa);
loop: /* bound definition can start with a sign, numeric constant, or
a symbolic name */
if (!(csa->token == T_PLUS || csa->token == T_MINUS ||
csa->token == T_NUMBER || csa->token == T_NAME)) goto done;
/* parse bound definition */
if (csa->token == T_PLUS || csa->token == T_MINUS)
{ /* parse signed lower bound */
lb_flag = 1;
s = (csa->token == T_PLUS ? +1.0 : -1.0);
scan_token(csa);
if (csa->token == T_NUMBER)
lb = s * csa->value, scan_token(csa);
else if (the_same(csa->image, "infinity") ||
the_same(csa->image, "inf"))
{ if (s > 0.0)
error(csa, "invalid use of '+inf' as lower bound\n");
lb = -DBL_MAX, scan_token(csa);
}
else
error(csa, "missing lower bound\n");
}
else if (csa->token == T_NUMBER)
{ /* parse unsigned lower bound */
lb_flag = 1;
lb = csa->value, scan_token(csa);
}
else
{ /* lower bound is not specified */
lb_flag = 0;
}
/* parse the token that should follow the lower bound */
if (lb_flag)
{ if (csa->token != T_LE)
error(csa, "missing '<', '<=', or '=<' after lower bound\n")
;
scan_token(csa);
}
/* parse variable name */
if (csa->token != T_NAME)
error(csa, "missing variable name\n");
j = find_col(csa, csa->image);
/* set lower bound */
if (lb_flag) set_lower_bound(csa, j, lb);
scan_token(csa);
/* parse the context that follows the variable name */
if (csa->token == T_LE)
{ /* parse upper bound */
scan_token(csa);
if (csa->token == T_PLUS || csa->token == T_MINUS)
{ /* parse signed upper bound */
s = (csa->token == T_PLUS ? +1.0 : -1.0);
scan_token(csa);
if (csa->token == T_NUMBER)
{ set_upper_bound(csa, j, s * csa->value);
scan_token(csa);
}
else if (the_same(csa->image, "infinity") ||
the_same(csa->image, "inf"))
{ if (s < 0.0)
error(csa, "invalid use of '-inf' as upper bound\n");
set_upper_bound(csa, j, +DBL_MAX);
scan_token(csa);
}
else
error(csa, "missing upper bound\n");
}
else if (csa->token == T_NUMBER)
{ /* parse unsigned upper bound */
set_upper_bound(csa, j, csa->value);
scan_token(csa);
}
else
error(csa, "missing upper bound\n");
}
else if (csa->token == T_GE)
{ /* parse lower bound */
if (lb_flag)
{ /* the context '... <= x >= ...' is invalid */
error(csa, "invalid bound definition\n");
}
scan_token(csa);
if (csa->token == T_PLUS || csa->token == T_MINUS)
{ /* parse signed lower bound */
s = (csa->token == T_PLUS ? +1.0 : -1.0);
scan_token(csa);
if (csa->token == T_NUMBER)
{ set_lower_bound(csa, j, s * csa->value);
scan_token(csa);
}
else if (the_same(csa->image, "infinity") ||
the_same(csa->image, "inf") == 0)
{ if (s > 0.0)
error(csa, "invalid use of '+inf' as lower bound\n");
set_lower_bound(csa, j, -DBL_MAX);
//.........这里部分代码省略.........
示例13: check_parm
static void check_parm(const char *func, const glp_cpxcp *parm)
{ /* check control parameters */
xassert(func != NULL);
xassert(parm != NULL);
return;
}
示例14: glp_init_cpxcp
void glp_init_cpxcp(glp_cpxcp *parm)
{ xassert(parm != NULL);
return;
}
示例15: glp_maxflow_ffalg
int glp_maxflow_ffalg(glp_graph *G, int s, int t, int a_cap,
double *sol, int a_x, int v_cut)
{ /* find maximal flow with Ford-Fulkerson algorithm */
glp_vertex *v;
glp_arc *a;
int nv, na, i, k, flag, *tail, *head, *cap, *x, ret;
char *cut;
double temp;
if (!(1 <= s && s <= G->nv))
xerror("glp_maxflow_ffalg: s = %d; source node number out of r"
"ange\n", s);
if (!(1 <= t && t <= G->nv))
xerror("glp_maxflow_ffalg: t = %d: sink node number out of ran"
"ge\n", t);
if (s == t)
xerror("glp_maxflow_ffalg: s = t = %d; source and sink nodes m"
"ust be distinct\n", s);
if (a_cap >= 0 && a_cap > G->a_size - (int)sizeof(double))
xerror("glp_maxflow_ffalg: a_cap = %d; invalid offset\n",
a_cap);
if (v_cut >= 0 && v_cut > G->v_size - (int)sizeof(int))
xerror("glp_maxflow_ffalg: v_cut = %d; invalid offset\n",
v_cut);
/* allocate working arrays */
nv = G->nv;
na = G->na;
tail = xcalloc(1+na, sizeof(int));
head = xcalloc(1+na, sizeof(int));
cap = xcalloc(1+na, sizeof(int));
x = xcalloc(1+na, sizeof(int));
if (v_cut < 0)
cut = NULL;
else
cut = xcalloc(1+nv, sizeof(char));
/* copy the flow network */
k = 0;
for (i = 1; i <= G->nv; i++)
{ v = G->v[i];
for (a = v->out; a != NULL; a = a->t_next)
{ k++;
tail[k] = a->tail->i;
head[k] = a->head->i;
if (tail[k] == head[k])
{ ret = GLP_EDATA;
goto done;
}
if (a_cap >= 0)
memcpy(&temp, (char *)a->data + a_cap, sizeof(double));
else
temp = 1.0;
if (!(0.0 <= temp && temp <= (double)INT_MAX &&
temp == floor(temp)))
{ ret = GLP_EDATA;
goto done;
}
cap[k] = (int)temp;
}
}
xassert(k == na);
/* find maximal flow in the flow network */
ffalg(nv, na, tail, head, s, t, cap, x, cut);
ret = 0;
/* store solution components */
/* (objective function = total flow through the network) */
if (sol != NULL)
{ temp = 0.0;
for (k = 1; k <= na; k++)
{ if (tail[k] == s)
temp += (double)x[k];
else if (head[k] == s)
temp -= (double)x[k];
}
*sol = temp;
}
/* (arc flows) */
if (a_x >= 0)
{ k = 0;
for (i = 1; i <= G->nv; i++)
{ v = G->v[i];
for (a = v->out; a != NULL; a = a->t_next)
{ temp = (double)x[++k];
memcpy((char *)a->data + a_x, &temp, sizeof(double));
}
}
}
/* (node flags) */
if (v_cut >= 0)
{ for (i = 1; i <= G->nv; i++)
{ v = G->v[i];
flag = cut[i];
memcpy((char *)v->data + v_cut, &flag, sizeof(int));
}
}
done: /* free working arrays */
xfree(tail);
xfree(head);
xfree(cap);
xfree(x);
if (cut != NULL) xfree(cut);
return ret;
//.........这里部分代码省略.........