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

📄 pnp.c

📁 openPBS的开放源代码
💻 C
字号:
/**         OpenPBS (Portable Batch System) v2.3 Software License* * Copyright (c) 1999-2000 Veridian Information Solutions, Inc.* All rights reserved.* * ---------------------------------------------------------------------------* For a license to use or redistribute the OpenPBS software under conditions* other than those described below, or to purchase support for this software,* please contact Veridian Systems, PBS Products Department ("Licensor") at:* *    www.OpenPBS.org  +1 650 967-4675                  sales@OpenPBS.org*                        877 902-4PBS (US toll-free)* ---------------------------------------------------------------------------* * This license covers use of the OpenPBS v2.3 software (the "Software") at* your site or location, and, for certain users, redistribution of the* Software to other sites and locations.  Use and redistribution of* OpenPBS v2.3 in source and binary forms, with or without modification,* are permitted provided that all of the following conditions are met.* After December 31, 2001, only conditions 3-6 must be met:* * 1. Commercial and/or non-commercial use of the Software is permitted*    provided a current software registration is on file at www.OpenPBS.org.*    If use of this software contributes to a publication, product, or*    service, proper attribution must be given; see www.OpenPBS.org/credit.html* * 2. Redistribution in any form is only permitted for non-commercial,*    non-profit purposes.  There can be no charge for the Software or any*    software incorporating the Software.  Further, there can be no*    expectation of revenue generated as a consequence of redistributing*    the Software.* * 3. Any Redistribution of source code must retain the above copyright notice*    and the acknowledgment contained in paragraph 6, this list of conditions*    and the disclaimer contained in paragraph 7.* * 4. Any Redistribution in binary form must reproduce the above copyright*    notice and the acknowledgment contained in paragraph 6, this list of*    conditions and the disclaimer contained in paragraph 7 in the*    documentation and/or other materials provided with the distribution.* * 5. Redistributions in any form must be accompanied by information on how to*    obtain complete source code for the OpenPBS software and any*    modifications and/or additions to the OpenPBS software.  The source code*    must either be included in the distribution or be available for no more*    than the cost of distribution plus a nominal fee, and all modifications*    and additions to the Software must be freely redistributable by any party*    (including Licensor) without restriction.* * 6. All advertising materials mentioning features or use of the Software must*    display the following acknowledgment:* *     "This product includes software developed by NASA Ames Research Center,*     Lawrence Livermore National Laboratory, and Veridian Information *     Solutions, Inc.*     Visit www.OpenPBS.org for OpenPBS software support,*     products, and information."* * 7. DISCLAIMER OF WARRANTY* * THIS SOFTWARE IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND. ANY EXPRESS* OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES* OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, AND NON-INFRINGEMENT* ARE EXPRESSLY DISCLAIMED.* * IN NO EVENT SHALL VERIDIAN CORPORATION, ITS AFFILIATED COMPANIES, OR THE* U.S. GOVERNMENT OR ANY OF ITS AGENCIES BE LIABLE FOR ANY DIRECT OR INDIRECT,* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,* EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.* * This license will be governed by the laws of the Commonwealth of Virginia,* without reference to its choice of law rules.*//* $Id: pnp.c,v 1.1.6.2 2000/08/09 00:18:44 hender Exp $ *//* * It is important to be able to accurately determine when it is prime and  * non-prime time.  This is accomplished by reading the holidays file and  * creating a table of prime and non-prime times. * A quick search of the table can then determine whether we are in prime  * or non-prime time. */#include <sys/types.h>#include <ctype.h>#include <stdio.h>#include <stdlib.h>#include <string.h>#include <time.h>#include "pbs_ifl.h"#include "log.h"#include "toolkit.h"#include "gblxvars.h"#define	SUNDAY   0#define SATURDAY 1	/* XXX Saturday is 6 in timeval */#define WEEKDAY  2#define	PRIME    0#define NONPRIME 1#define MAX_HOLIDAYS	256/* * Range of valid primetime times is 0 - 86399 (hr * 3600 + min * 60 + sec). * Valid times cannot be negative. */#define	ALL      -1#define NONE     -2static int Num_holidays;static int holidays[MAX_HOLIDAYS][2];static int weekdays[3][2];static int day_prime_time (int, int);static void init_holidays (void);/* * Given a time_t, determine if it is prime or nonprime time then.  If * the 'when' argument is 0, find out if it is primetime *now*. * Return 1 for prime time, 0 for nonprime time */int schd_prime_time(time_t when){    struct tm *tmptr;    int     cur_time;	/* Now (decimal - 9:30AM == 930, 6:45PM == 1845) */    int     h_idx;    int     rcode;#ifdef DEBUG    if (!(schd_ENFORCE_PRIME_TIME && schd_TimeNow >= schd_ENFORCE_PRIME_TIME)) {	fprintf(stderr,"WARNING!!!  ");	fprintf(stderr,"prime_time() called but ENFORCE_PRIME_TIME not set\n");	fprintf(stderr,"WARNING!!!  ");	fprintf(stderr,"This is almost certainly a bug!\n");	return (0);    }#endif /* DEBUG */	/* If no time specified, use the scheduler's "TimeNow" time_t. */    if (when == 0)	when = schd_TimeNow;    tmptr = localtime(&when);    cur_time = (tmptr->tm_hour * 3600) + (tmptr->tm_min * 60) + tmptr->tm_sec;    /*      * Check holidays array to determine if today is a holiday.  Holidays     * are not primetime.  Note that days in struct timeval's are counted      * starting at 0, not at the first like on the calendar.     */    for (h_idx = 0; h_idx < Num_holidays; h_idx++) {	if (tmptr->tm_yday + 1 == holidays[h_idx][0])	    return (0);    }    /* Today isn't a holiday so is it SATURDAY, SUNDAY or WEEKDAY? */    switch (tmptr->tm_wday) {    case 0:	rcode = day_prime_time(SUNDAY, cur_time);	break;    case 6:	rcode = day_prime_time(SATURDAY, cur_time);	break;    default:	rcode = day_prime_time(WEEKDAY, cur_time);	break;    }    return (rcode);}/* Based on time of day and day of week, is it prime time now? */static int day_prime_time(int dow, int now){    int     prime_time;    int     not_prime_time;    prime_time = weekdays[dow][PRIME];    not_prime_time = weekdays[dow][NONPRIME];    switch (prime_time) {    case ALL:	return (1);		/* Prime time all day */    case NONE:	return (0);		/* No prime time today */    default:	/* XXX document this case */	if (not_prime_time > prime_time) {	    if ((now >= prime_time) && (now < not_prime_time))		return (1);	    else		return (0);	} else {	    if ((now >= not_prime_time) && (now < prime_time))		return (0);	    else		return (1);	}    }}/* Initialize the holidays[] array from the contents of the holidays file */int schd_read_holidays(void){    char   *id = "schd_read_holidays";    FILE   *fd;    char    buf[255];    char   *ptr, *err;    int     h_idx = 0;    long    day, line = 0;    init_holidays();    Num_holidays = 0;    if ((fd = fopen(HOLIDAYS_FILE, "r")) == NULL) {        (void)sprintf(log_buffer,	    "Warning: holidays file (%s) is unreadable. Ignoring...",	    HOLIDAYS_FILE);	log_record(PBSEVENT_SYSTEM, PBS_EVENTCLASS_SERVER, id, log_buffer);	DBPRT(("%s: %s\n", id, log_buffer));	return (-1);    }    /* Read lines from the holidays file one by one. */    while (fgets(buf, sizeof (buf), fd)) {	line ++;	if (strlen(buf) == (sizeof(buf) - 1)) {	    (void)sprintf(log_buffer,		"Line %ld of %s is too long.", line, HOLIDAYS_FILE);	    log_record(PBSEVENT_SYSTEM, PBS_EVENTCLASS_SERVER, id, log_buffer);	    DBPRT(("%s: %s\n", id, log_buffer));	    return (-1);	}	/* Trim off comments before anything else is done. */	if ((ptr = strchr(buf, '*')) != NULL)	    *ptr = '\0';	/* Find first whitespace-separated token in the remaining string. */	ptr = strtok(buf, " \t");	/* Skip blank lines (may have been only a comment). */	if (ptr == NULL)	    continue;	/* Skip 'HOLIDAYFILE_VERSION1 ...' entry */	if (!strncmp(ptr, "HOLIDAYFILE", 11))	    continue;	/* Skip 'YEAR ...' entries */	if (!strncmp(ptr, "YEAR", 4))	    continue;	/* Skip '*day ...' entries */	if (strstr(ptr, "day"))	    continue;	/* 	 * Line was not parsed otherwise -- must be a holiday.  Holidays 	 * are non prime, so set current holiday list to the day number 	 * of the current year on which the holiday is celebrated.	 * Note a syntax error if the number doesn't parse nicely, or it	 * is nonsensical.	 */	day = strtol(ptr, &err, 10);	if ((*err != '\0') || (day < 0) || (day > 365)) {	    (void)sprintf(log_buffer,		"Syntax error in line %ld of %s", line, HOLIDAYS_FILE);	    log_record(PBSEVENT_SYSTEM, PBS_EVENTCLASS_SERVER, id, log_buffer);	    DBPRT(("%s: %s\n", id, log_buffer));	    return (-1);	}	/* SGI uses a day of 0 to indicate "ANY YEAR" - ignore these. */	if (day == 0)	    continue;	/* No loss of precision, since 1 <= day <= 365 (see above). */	holidays[h_idx][0] = (int)day;	holidays[h_idx][NONPRIME] = ALL;	h_idx++;	Num_holidays++;	if (Num_holidays == MAX_HOLIDAYS) {	    (void)sprintf(log_buffer,		"Only %d holidays allowed - skipping any remaining in %s",		MAX_HOLIDAYS, HOLIDAYS_FILE);	    log_record(PBSEVENT_SYSTEM, PBS_EVENTCLASS_SERVER, id, log_buffer);	    DBPRT(("%s: %s\n", id, log_buffer));	    break;	}    }    fclose(fd);    return (Num_holidays);}/* * Initialize weekdays array.  Default is "no primetime anytime", and no  * holidays. * * Holidays are loaded from the file ''/usr/lib/acct/holidays'' on the NAS * Origin2000s. */static void init_holidays(void){    /* Default is no primetime anytime. */    weekdays[SATURDAY][PRIME]    = NONE;    weekdays[SATURDAY][NONPRIME] = ALL;    weekdays[SUNDAY][PRIME]      = NONE;    weekdays[SUNDAY][NONPRIME]   = ALL;    weekdays[WEEKDAY][PRIME]     = schd_PRIME_TIME_START;    weekdays[WEEKDAY][NONPRIME]  = schd_PRIME_TIME_END;    Num_holidays = 0;	/* No holidays to start out. */}#define MIDNIGHT 86400/*  * Calculate the number of seconds until the next prime time begins. * If the 'when' argument is non-zero, determine how long from the * time given.  Otherwise, determine how long it is from now. */int schd_secs_til_prime(time_t when){    struct tm *tmptr;    time_t  now;	/* Number of seconds elapsed since midnight */    int     next_prime;    int     prime_start;    int     days;    int     p;    if (when == 0) {	/* No time specified -- find out what time it is now. */	time(&when);    }    tmptr = localtime(&when);    /*     * Calculate number of seconds elapsed since last midnight (00:00:00).     */    now = ((tmptr->tm_hour * 60 * 60) + 	   (tmptr->tm_min * 60) + 	    tmptr->tm_sec);    /*     * Is today a FRIDAY or SATURDAY?  Assume there is no primetime on     * weekends, and calculate number of days forward from that.     */    switch (tmptr->tm_wday) {    case 5: /* Friday */	/* 	 * If it's before the start of prime time, then the next prime time	 * is in a matter of hours.  Otherwise, prime time starts on the	 * following Monday (in 2 days).	 */	p = weekdays[WEEKDAY][PRIME];	if (now < p)	    days = 0;	else	    days = 2;	break;    case 6: /* Saturday */	/*	 * Primetime won't start until Monday, so we know we have at least	 * one day to wait (all on Sunday).	 */	days = 1;	break;    default: /* Sunday through Thursday, expect primetime to start "soon" */	days = 0;	break;    }    /*     * 'days' tells us how many days we need to get to a weekday (either     * this day, or the following Monday morning).  This will be the first     * prime time.  This will need a special case if a specific weekday      * does not have a prime time.     */    prime_start = weekdays[WEEKDAY][PRIME];    /*     * If we are already past the start of this prime time, than the *next*     * prime time will begin tomorrow morning.  To get the time until then,     * take the number of seconds in a day, and subtract how far into today     * you've gotten.  XXX is this right in all cases?     */    if (now >= prime_start)	next_prime = MIDNIGHT - (now - prime_start);    else	next_prime = prime_start - now;    /* Add in the time for any full days without primetime. */    next_prime += (days * MIDNIGHT);	    return (next_prime);}/*  * Calculate the number of seconds until the next non-prime time begins. * If the 'when' argument is non-zero, determine how long from the * time given.  Otherwise, determine how long it is from now. */int schd_secs_til_nonprime(time_t when){    struct tm *tmptr;    time_t  now;	/* Number of seconds elapsed since midnight */    int     prime_end;    int     non_prime_start;    if (when == 0) {	/* No time specified -- find out what time it is now. */	time(&when);    }    tmptr = localtime(&when);    /*     * Calculate number of seconds elapsed since last midnight (00:00:00).     */    now = ((tmptr->tm_hour * 60 * 60) + 	   (tmptr->tm_min * 60) + 	    tmptr->tm_sec);    /* Find how many seconds from midnight until the next nonprime time. */    non_prime_start = weekdays[WEEKDAY][NONPRIME];    prime_end = non_prime_start - now;     return (prime_end);}int schd_reset_observed_pt (QueueList *qlist){    QueueList *qptr;    int   nqueues;    nqueues = 0;    for (qptr = qlist; qptr != NULL; qptr = qptr->next) {	qptr->queue->observe_pt = 	  (schd_ENFORCE_PRIME_TIME && schd_TimeNow >= schd_ENFORCE_PRIME_TIME);	++ nqueues;    }    return (nqueues);}

⌨️ 快捷键说明

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