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

📄 prime.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.*/#include <stdio.h>#include <stdlib.h>#include <time.h>#include <string.h>#include <ctype.h>#include <pbs_ifl.h>#include <log.h>#include "constant.h"#include "globals.h"#include "prime.h"#include "misc.h"static char *ident = "$Id: prime.c,v 2.2.2.1.2.4 2000/08/09 00:19:02 hender Exp $";/* * *	is_prime_time - will return the status of primetime * *	returns true if prime time false if non_prime * *	NOTE: Holidays are considered non-prime * */enum prime_time is_prime_time( ){  /* last_day is used to hold the day during the previous cycle.  It is used so   * holidays only need to be checked once a day instead of every cycle    */  static int last_day = -1;  enum prime_time ret = PRIME;		/* return code */  struct tm  *tmptr;			/* current time in a struct tm */  tmptr = localtime( &(cstat.current_time) );  /* check for holiday: Holiday == non_prime */  if( conf.holiday_year != 0 ) /* year == 0: no prime-time */  {    if( tmptr -> tm_year > conf.holiday_year )      log(PBSEVENT_ADMIN, PBS_EVENTCLASS_FILE, "", "The holday file is out of date, please update it.");    else if( tmptr -> tm_yday > last_day )    {      last_day = tmptr -> tm_yday;      /* tm_yday starts at 0, and julien date starts at 1 */      if( is_holiday( tmptr -> tm_yday + 1 ) ) 	ret = NON_PRIME;    }    /* if ret still equals PRIME then it is not a holidy, we need to check      * and see if we are in non-prime or prime      */    if( ret == PRIME )    {      if( tmptr -> tm_wday == 0 )	ret = check_prime( SUNDAY, tmptr );      else if( tmptr -> tm_wday == 6 )	ret = check_prime( SATURDAY, tmptr );      else	ret = check_prime( WEEKDAY, tmptr );    }  }  return ret;}/* * *	check_prime - check if it is prime time for a particular day * *	returns PRIME if it is in primetime or NON_PRIME if not */enum prime_time check_prime( enum days d, struct tm *t ){  enum prime_time prime;		/* return code */  /* Case 1: all primetime today */  if( conf.prime[d][PRIME].all )    prime = PRIME;  /* Case 2: all nonprime time today */  else if( conf.prime[d][NON_PRIME].all )    prime = NON_PRIME;  /* case 3: no primetime today */  else if( conf.prime[d][PRIME].none )    prime = NON_PRIME;  /* case 4: no nonprime time today */  else if( conf.prime[d][NON_PRIME].none )    prime = PRIME;    /* primetime does not cross the day boundry   * i.e. 4:00AM - 6:00 PM   */  if((int) conf.prime[d][NON_PRIME].hour - (int) conf.prime[d][PRIME].hour >= 0)  {    /* Case 5: primetime doesn't cross day boundry and      * the current hour is between the start hour of primetime and the start      * hour of non-primetime      */    if( t -> tm_hour > conf.prime[d][PRIME].hour && 	t -> tm_hour < conf.prime[d][NON_PRIME].hour )      prime  = PRIME;    else if( t -> tm_hour == conf.prime[d][PRIME].hour )    {      /* prime time is less then 1 hour */      if( conf.prime[d][PRIME].hour == conf.prime[d][NON_PRIME].hour )      {	/* case 6: the current hour is equal to the start of primetime hour 	 * and primetime is less then one hour in length.  Current minute is 	 * between the start of primetime and the start of nonprimetime 	 */	if( t -> tm_min >= conf.prime[d][PRIME].min && 	    t -> tm_min < conf.prime[d][NON_PRIME].min )          prime = PRIME;        else /* Case 7: !case 6 */	  prime = NON_PRIME;      }      /* Case 8: The current hour is equal to the start of primetime hour.         * The current minute is after the start of primetime minute        */      else if( t -> tm_min > conf.prime[d][PRIME].min )	prime = PRIME;      else /* Case 9: !case 8 */	prime = NON_PRIME;    }    else      /* case 10: primetime doesn't cross a day boundry, and the current hour        * is not between the start of primetime and the start of nonprimetime       */      prime = NON_PRIME;  }  else /* prime time crosses day boundry i.e. 10:00PM - 2:00AM  */  {    /* Case 11: primetime crosses a day boundry and the current hour is after     * the start of primetime i.e. 11:00PM or less start of nonprime time     * i.e. 1AM     */    if( t -> tm_hour > conf.prime[d][PRIME].hour || 	t -> tm_hour < conf.prime[d][NON_PRIME].hour )      prime = PRIME;    else /* Case 12: !case 11 */      prime = NON_PRIME;  }  return prime;}/* * *	is_holiday - returns true if today is a holiday * *	 jdate - amount of days since the beginning of the year *		 starting with Jan 1 == 1. * *	returns true if today is a holiday, false if not * */int is_holiday( int jdate ){  int i;  for( i = 0; i < conf.num_holidays && conf.holidays[i] != jdate; i++ )      ;   if( i == conf.num_holidays )    return 0;    return 1;}/* * *	parse_holidays - parse the holidays file.  It should be in UNICOS 8  *			 format. * *	  fname - name of holidays file * *	returns success/failure * */int parse_holidays( char *fname ){  FILE *fp;		/* file pointer to holidays file */  char buf[256];	/* buffer to read lines of the file into */  char *config_name;	/* the first word of the line */  char *tok;		/* used with strtok() to parse the rest of the line */  char *endp;		/* used with strtol() */  int num;		/* used to convert string -> integer */  char error = 0;	/* boolean: is there an error ? */  int linenum = 0;	/* the current line number */  int hol_index = 0;	/* index into the holidays array in global var conf */  if( ( fp = fopen(fname, "r") ) == NULL )  {    perror("Warning: can not open holidays file, assuming 24hr primetime");    return 0;  }  while( fgets(buf, 256, fp) != NULL )  {    linenum++;    if( buf[strlen(buf)-1] == '\n' )      buf[strlen(buf)-1] = '\0';    if(!skip_line( buf ) )    {      config_name = strtok(buf, "	 ");      /* if there is a 4 digit number, it describes the year and the        * prime/non-prime times       *       *  FORMAT EXAMPLE       *       *      YEAR      PRIME START	NONPRIME START       *      1998	0400		1530       */      if( strlen(config_name) == 4 && isdigit( (int) config_name[0]) &&           isdigit( (int) config_name[1]) && isdigit( (int) config_name[2]) &&           isdigit( (int) config_name[3]) )      {	tok = strtok(NULL, " 	");	if( load_day(WEEKDAY, PRIME, tok) < 0 )	  error = 1;	if( !error )	{	  tok = strtok(NULL, "	 ");	  if( load_day(WEEKDAY, NON_PRIME, tok) < 0 )	    error = 1;	}      }      /* this tells us if we have the correct file format.  Its ignored since       * lots of error messages will be printed if the file format is wrong        * and if the file format is correct but just not this, we really        * shouldn't complain       */      if( !strcmp( config_name, "HOLIDAYFILE_VERSION1") )	  ;      /* the current year - if the file is old, we want to know to log errors       * later about it       *       * FORMAT EXAMPLE       *       * YEAR 1998       */      else if( !strcmp( config_name, "YEAR" ) )      {	tok = strtok(NULL, "	 ");	if( tok == NULL )	  error = 1;	else	{	  num = strtol(tok, &endp, 10);	  if( *endp != '\0' )	    error = 1;	  else	    conf.holiday_year = num;	}      }      /* primetime hours for saturday       * first number is primetime start, second is nonprime start       *       * FORMAT EXAMPLE       *       *  saturday 	0400	1700       */      else if( !strcmp(config_name, "saturday") )      {	tok = strtok(NULL, " 	");	if( load_day(SATURDAY, PRIME, tok) < 0 )	  error = 1;	if( !error )	{	  tok = strtok(NULL, " 	");	  if( load_day(SATURDAY, NON_PRIME, tok) < 0 )	    error = 1;	}      }      /* primetime hours for sunday  - same format as saturday */      else if( !strcmp(config_name, "sunday") )      {	tok = strtok(NULL, " 	");	if( load_day(SUNDAY, PRIME, tok ) < 0 )	  error = 1;		if( !error )	{	  tok = strtok(NULL, "	 ");	  if( load_day(SUNDAY, NON_PRIME, tok) < 0 )	    error = 1;	}      }      /* primetime for weekday - same format as saturday */      else if( !strcmp(config_name, "weekday") )      {	tok = strtok(NULL, " 	");	if( load_day(WEEKDAY, PRIME, tok) < 0 )	  error = 1;	if( !error )	{	  tok = strtok(NULL, "	 ");	  if( load_day(WEEKDAY, NON_PRIME, tok) < 0 )	    error = 1;	}      }      /*       * holidays       * We only care about the julien date of the holiday.  It is enough        * information to find out if it is a holiday or not       *       * FORMAT EXAMPLE       *       *  julien date	Calendar date	holiday name       *    1		Jan 1		New Year's Day       */      else       {	num = strtol(config_name, &endp, 10);	conf.holidays[hol_index] = num;	hol_index++;      }      if( error )        fprintf(stderr, "Error on line %d, line started with: %s\n", linenum, config_name);    }    error = 0;  }  conf.num_holidays = hol_index + 1;  fclose(fp);  return 0;}/* * *	load_day - fill in the prime time part of the config structure * *	  d  - enum days: can be WEEKDAY, SATURDAY, or SUNDAY *	  pr - enum prime_time: can be PRIME or NON_PRIME * *	returns 0 on success -1 on error * */int load_day( enum days d, enum prime_time pr, char *tok ){  int num;		/* used to convert string -> integer */  int hours;		/* used to convert 4 digit HHMM into hours */  int mins;		/* used to convert 4 digit HHMM into minutes */  char *endp;		/* used wtih strtol() */  if( tok != NULL )  {    if( !strcmp(tok, "all") || !strcmp(tok, "ALL") )    {      conf.prime[d][pr].all = TRUE;      conf.prime[d][pr].hour = UNSPECIFIED;      conf.prime[d][pr].min = UNSPECIFIED;    }    else if( !strcmp(tok, "none") || !strcmp(tok, "NONE") )    {      conf.prime[d][pr].none = TRUE;      conf.prime[d][pr].hour = UNSPECIFIED;      conf.prime[d][pr].min = UNSPECIFIED;    }    else    {      num = strtol(tok, &endp, 10);      if( *endp == '\0' )      {	/* num is a 4 digit number of the time HHMM */	 mins = num % 100;	 hours = num / 100;	 conf.prime[d][pr].hour = hours;	 conf.prime[d][pr].min = mins;      }      else	return -1;    }  }  else    return -1;  return 0;}/* * *	init_prime_time - do any initializations that need to happen at the  *			  start of prime time * *	returns nothing * */void init_prime_time(){  cstat.is_prime = 1;  cstat.round_robin = conf.prime_rr;  cstat.by_queue = conf.prime_bq;  cstat.strict_fifo = conf.prime_sf;  cstat.sort_by = conf.prime_sort;  cstat.fair_share = conf.prime_fs;  cstat.load_balancing = conf.prime_lb;  cstat.help_starving_jobs = conf.prime_hsv;  cstat.sort_queues = conf.prime_sq;  cstat.load_balancing_rr = conf.prime_lbrr;}/* * *	init_non_prime_time - do any initializations that need to happen at *			      the beginning of non prime time * *	returns nothing * */void init_non_prime_time(){  cstat.is_prime = 0;  cstat.round_robin = conf.non_prime_rr;  cstat.by_queue = conf.non_prime_bq;  cstat.strict_fifo = conf.non_prime_sf;  cstat.sort_by = conf.non_prime_sort;  cstat.fair_share = conf.non_prime_fs;  cstat.load_balancing = conf.non_prime_lb;  cstat.help_starving_jobs = conf.non_prime_hsv;  cstat.sort_queues = conf.non_prime_sq;  cstat.load_balancing_rr = conf.non_prime_lbrr;}

⌨️ 快捷键说明

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