⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mom_mach.c

📁 openPBS的开放源代码
💻 C
📖 第 1 页 / 共 4 页
字号:
		if (strcmp(pname, "walltime") == 0)	return (TRUE);		pres = (resource *)GET_NEXT(pres->rs_link);	}	return (FALSE);}/* * Setup for polling. * *	Open kernel device and get namelist info. */int mom_open_poll(){	static char	*id = "mom_open_poll";	DBPRT(("%s: entered\n", id))	return (PBSE_NONE);}/* * Declare start of polling loop. * *	Until the next call to mom_get_sample, all mom_over_limit calls will *	use the same data.  Returns a PBS error code. */int mom_get_sample(){	return (PBSE_NONE);}/* * Measure job resource usage and compare with its limits. * *	If it has exceeded any well-formed polled limit return TRUE. *	Otherwise, return FALSE. */int mom_over_limit(pjob)    job			*pjob;{	static char	*id = "mom_over_limit";	char		*pname;	int		retval;	unsigned long	value;	resource	*pres;	int		num;	assert(pjob != NULL);	assert(pjob->ji_wattr[(int)JOB_ATR_resource].at_type == ATR_TYPE_RESC);	pres = (resource *)	    GET_NEXT(pjob->ji_wattr[(int)JOB_ATR_resource].at_val.at_list);	DBPRT(("%s: entered %s\n", id, pjob->ji_qs.ji_jobid))	for ( ; pres != NULL; pres = (resource *)GET_NEXT(pres->rs_link)) {		assert(pres->rs_defin != NULL);		pname = pres->rs_defin->rs_name;		assert(pname != NULL);		assert(*pname != '\0');		if (strcmp(pname, "walltime") == 0) {			retval = gettime(pres, &value);			if (retval != PBSE_NONE)				continue;			num = (unsigned long)((double)(time_now - pjob->ji_qs.ji_stime) * wallfactor);			if (num > value) {				sprintf(log_buffer,					"walltime %d exceeded limit %d",					num, value);				return (TRUE);			}		}	}	return (FALSE);}/* * Update the job attribute for resources used. * *	The first time this is called for a job, set up resource entries for *	each resource that can be reported for this machine.  Fill in the *	correct values.  Return an error code. */int mom_set_use(pjob)    job			*pjob;{	static char		*id = "mom_set_use";	resource		*pres;	attribute		*at;	resource_def		*rd;	long			*lp, num;	assert(pjob != NULL);	at = &pjob->ji_wattr[(int)JOB_ATR_resc_used];	assert(at->at_type == ATR_TYPE_RESC);	if ((pjob->ji_qs.ji_svrflags & JOB_SVFLG_Suspend) != 0)		return (PBSE_NONE);	/* job suspended, don't track it */	DBPRT(("%s: entered %s\n", id, pjob->ji_qs.ji_jobid))	at->at_flags |= ATR_VFLAG_MODIFY;	if ((at->at_flags & ATR_VFLAG_SET) == 0) {		at->at_flags |= ATR_VFLAG_SET;		rd = find_resc_def(svr_resc_def, "cput", svr_resc_size);		assert(rd != NULL);		pres = add_resource_entry(at, rd);		pres->rs_value.at_flags |= ATR_VFLAG_SET;		pres->rs_value.at_type = ATR_TYPE_LONG;		rd = find_resc_def(svr_resc_def, "mppt", svr_resc_size);		assert(rd != NULL);		pres = add_resource_entry(at, rd);		pres->rs_value.at_flags |= ATR_VFLAG_SET;		pres->rs_value.at_type = ATR_TYPE_LONG;		rd = find_resc_def(svr_resc_def, "walltime", svr_resc_size);		assert(rd != NULL);		pres = add_resource_entry(at, rd);		pres->rs_value.at_flags |= ATR_VFLAG_SET;		pres->rs_value.at_type = ATR_TYPE_LONG;	}	rd = find_resc_def(svr_resc_def, "cput", svr_resc_size);	assert(rd != NULL);	pres = find_resc_entry(at, rd);	assert(pres != NULL);	lp = &pres->rs_value.at_val.at_long;	num = cput_sum(pjob);	*lp = max(*lp, num);	rd = find_resc_def(svr_resc_def, "mppt", svr_resc_size);	assert(rd != NULL);	pres = find_resc_entry(at, rd);	assert(pres != NULL);	lp = &pres->rs_value.at_val.at_long;	num = mppt_sum(pjob);	*lp = max(*lp, num);	rd = find_resc_def(svr_resc_def, "walltime", svr_resc_size);	assert(rd != NULL);	pres = find_resc_entry(at, rd);	assert(pres != NULL);	pres->rs_value.at_val.at_long = (long)((double)(time_now - pjob->ji_qs.ji_stime) * wallfactor);	return (PBSE_NONE);}/* *	Kill a task session. *	Call with the task pointer and a signal number. */int kill_task(ptask, sig)    task	*ptask;    int		sig;{	static char	*id = "kill_task";	int		ct = 1;        int		sesid;	sesid = ptask->ti_qs.ti_sid;	if (sesid > 1) {		if (killm(C_JOB, sesid, sig) == -1) {		    if (errno != ESRCH) {			sprintf(log_buffer, "killm: sid=%d sig=%d", sesid, sig);			log_err(errno, id, log_buffer);		    } else {			ct = 0;			sprintf(log_buffer, "killm: sid=%d sig=%d", sesid, sig);			log_record(PBSEVENT_DEBUG, PBS_EVENTCLASS_JOB,				   ptask->ti_job->ji_qs.ji_jobid, log_buffer);		    }		}	}	return ct;}/* * Clean up everything related to polling. */int mom_close_poll(){	return (PBSE_NONE);}/* * mom_does_chkpnt - return 1 if mom supports checkpoint *			    0 if not */int mom_does_chkpnt(){	return (1);}/* * Checkpoint the job. * *	If abort is TRUE, kill it too. */int mach_checkpoint(ptask, path, abort)    task	*ptask;    char	*path;    int		abort;{	int	cprtn;	long	flags = 0;	if (abort)		flags = CHKPNT_KILL;	cprtn = chkpnt( C_JOB, ptask->ti_qs.ti_sid, path, flags );	return cprtn;}/* * Restart the job from the checkpoint file. * *	Return the session/job id */long mach_restart(ptask, path)    task	*ptask;    char	*path;{	int	sid;	sid = restart(path, 0);	return sid;}char	*cput_job(jobid)pid_t	jobid;{	char		*id = "cput_job";	struct	resclim		rl;	rl.resc_category = C_JOB;	rl.resc_resource = L_CPU;	if (getlim(jobid, &rl) == -1) {		rm_errno = RM_ERR_EXIST;		return NULL;	}	sprintf(ret_string, "%.2f", cputfactor * rl.resc_used);	return ret_string;}char	*cput_proc(pid)pid_t	pid;{	char		*id = "cput_pid";	struct	resclim		rl;	DBPRT(("%s: entered %d\n", id, pid))	rl.resc_category = C_PROC;	rl.resc_resource = L_CPU;	if (getlim(pid, &rl) == -1) {		rm_errno = RM_ERR_EXIST;		return NULL;	}	sprintf(ret_string, "%.2f", cputfactor * rl.resc_used);	return ret_string;}char	*cput(attrib)struct	rm_attribute	*attrib;{	char			*id = "cput";	int			value;	if (attrib == NULL) {		log_err(-1, id, no_parm);		rm_errno = RM_ERR_NOPARAM;		return NULL;	}	if ((value = atoi(attrib->a_value)) == 0) {		sprintf(log_buffer, "bad param: %s", attrib->a_value);		log_err(-1, id, log_buffer);		rm_errno = RM_ERR_BADPARAM;		return NULL;	}	if (momgetattr(NULL)) {		log_err(-1, id, extra_parm);		rm_errno = RM_ERR_BADPARAM;		return NULL;	}	if (strcmp(attrib->a_qualifier, "session") == 0)		return (cput_job((pid_t)value));	else if (strcmp(attrib->a_qualifier, "proc") == 0)		return (cput_proc((pid_t)value));	else {		rm_errno = RM_ERR_BADPARAM;		return NULL;	}}char	*mem_job(jobid)pid_t	jobid;{	char		*id = "mem_job";	rm_errno = RM_ERR_EXIST;	return NULL;}char	*mem_proc(pid)pid_t	pid;{	char		*id = "mem_proc";	rm_errno = RM_ERR_EXIST;	return NULL;}char	*mem(attrib)struct	rm_attribute	*attrib;{	char		*id = "mem";	int		value;	if (attrib == NULL) {		log_err(-1, id, no_parm);		rm_errno = RM_ERR_NOPARAM;		return NULL;	}	if ((value = atoi(attrib->a_value)) == 0) {		sprintf(log_buffer, "bad param: %s", attrib->a_value);		log_err(-1, id, log_buffer);		rm_errno = RM_ERR_BADPARAM;		return NULL;	}	if (momgetattr(NULL)) {		log_err(-1, id, extra_parm);		rm_errno = RM_ERR_BADPARAM;		return NULL;	}	if (strcmp(attrib->a_qualifier, "session") == 0)		return (mem_job((pid_t)value));	else if (strcmp(attrib->a_qualifier, "proc") == 0)		return (mem_proc((pid_t)value));	else {		rm_errno = RM_ERR_BADPARAM;		return NULL;	}}char	*sessions(attrib)struct	rm_attribute	*attrib;{	char			*id = "sessions";	if (attrib) {		log_err(-1, id, extra_parm);		rm_errno = RM_ERR_BADPARAM;		return NULL;	}	rm_errno = RM_ERR_EXIST;	return NULL;}char	*nsessions(attrib)struct	rm_attribute	*attrib;{	char	*result, *ch;	int	num = 0;	if ((result = sessions(attrib)) == NULL)		return result;	for (ch=result; *ch; ch++) {		if (*ch == ' ')		/* count blanks */			num++;	}	sprintf(ret_string, "%d", num);	return ret_string;}char	*nusers(attrib)struct	rm_attribute	*attrib;{	char			*id = "nusers";	if (attrib) {		log_err(-1, id, extra_parm);		rm_errno = RM_ERR_BADPARAM;		return NULL;	}	rm_errno = RM_ERR_EXIST;	return NULL;}char	*pids(attrib)struct	rm_attribute	*attrib;{	char		*id = "pids";	pid_t		jobid;	if (attrib == NULL) {		log_err(-1, id, no_parm);		rm_errno = RM_ERR_NOPARAM;		return NULL;	}	if ((jobid = (pid_t)atoi(attrib->a_value)) == 0) {		sprintf(log_buffer, "bad param: %s", attrib->a_value);		log_err(-1, id, log_buffer);		rm_errno = RM_ERR_BADPARAM;		return NULL;	}	if (momgetattr(NULL)) {		log_err(-1, id, extra_parm);		rm_errno = RM_ERR_BADPARAM;		return NULL;	}	if (strcmp(attrib->a_qualifier, "session") != 0) {		rm_errno = RM_ERR_BADPARAM;		return NULL;	}	rm_errno = RM_ERR_EXIST;	return NULL;}static char	*totmem(attrib)struct	rm_attribute	*attrib;{	char	*id = "totmem";	struct	statfs	fsbuf;	if (attrib) {		log_err(-1, id, extra_parm);		rm_errno = RM_ERR_BADPARAM;		return NULL;	}	if (statfs(procfs, &fsbuf, sizeof(struct statfs), 0) == -1) {		log_err(errno, id, "statfs");		rm_errno = RM_ERR_SYSTEM;		return NULL;	}	DBPRT(("%s: bsize=%d blocks=%d\n", id, fsbuf.f_bsize, fsbuf.f_blocks))	sprintf(ret_string, "%d", fsbuf.f_bsize * fsbuf.f_blocks);	return ret_string;}static char	*availmem(attrib)struct	rm_attribute	*attrib;{	char	*id = "availmem";	struct	statfs	fsbuf;	if (attrib) {

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -