$! ------------------ CUT HERE ----------------------- $ v='f$verify(f$trnlnm("SHARE_UNPACK_VERIFY"))' $! $! This archive created by VMS_SHARE Version 8.3 $! On 12-APR-1993 08:18:01.80 By user GOATHUNTER (@WKUVX1.BITNET) $! $! The VMS_SHARE software that created this archive $! was written by Andy Harper, Kings College London UK $! -- December 1992 $! $! Credit is due to these people for their original ideas: $! James Gray, Michael Bednarek $! $! TO UNPACK THIS SHARE FILE, CONCATENATE ALL PARTS IN ORDER $! AND EXECUTE AS A COMMAND PROCEDURE ( @name ) $! $! THE FOLLOWING FILE(S) WILL BE CREATED AFTER UNPACKING: $! 1. MY_OPT.OPT;1 $! 2. WORK_REC.C;1 $! 3. WORK_REC.CLD;1 $! 4. WORK_REC.EXAMPLE;1 $! 5. WSL.DESC;1 $! $set="set" $set symbol/scope=(nolocal,noglobal) $f=f$parse("SHARE_UNPACK_TEMP","SYS$SCRATCH:."+f$getjpi("","PID")) $e="write sys$error ""%UNPACK"", " $w="write sys$output ""%UNPACK"", " $ if .not. f$trnlnm("SHARE_UNPACK_LOG") then $ w = "!" $ if f$getsyi("CPU") .gt. 127 then $ goto start $ ve=f$getsyi("version") $ if ve-f$extract(0,1,ve) .ges. "4.4" then $ goto start $ e "-E-OLDVER, Must run at least VMS 4.4" $ v=f$verify(v) $ exit 44 $unpack: subroutine ! P1=filename, P2=checksum, P3=attributes $ if f$parse(P1) .nes. "" then $ goto dirok $ dn=f$parse(P1,,,"DIRECTORY") $ w "-I-CREDIR, Creating directory ''dn'" $ create/dir 'dn' $ if $status then $ goto dirok $ e "-E-CREDIRFAIL, Unable to create ''dn' File skipped" $ delete 'f'* $ exit $dirok: $ x=f$search(P1) $ if x .eqs. "" then $ goto file_absent $ e "-W-EXISTS, File ''P1' exists. Skipped" $ delete 'f'* $ exit $file_absent: $ w "-I-UNPACK, Unpacking file ", P1 $ n=P1 $ if P3 .nes. "" then $ n=f $ if .not. f$verify() then $ define/user sys$output nl: $ EDIT/TPU/NOSEC/NODIS/COM=SYS$INPUT 'f'/OUT='n' PROCEDURE GetHex(s,p)LOCAL x1,x2;x1:=INDEX(t,SUBSTR(s,p,1))-1;x2:=INDEX(t, SUBSTR(s,p+1,1))-1;RETURN 16*x1+x2;ENDPROCEDURE; PROCEDURE SkipPartsep LOOP EXITIF MARK(NONE)=END_OF(b);EXITIF INDEX(ERASE_LINE, "-+-+-+-+-+-+-+-+")=1;ENDLOOP;ENDPROCEDURE;PROCEDURE ProcessLine LOCAL c,s,l,b, n,p;c := ERASE_CHARACTER(1);s := ERASE_LINE;IF c = "X" THEN SPLIT_LINE; ENDIF; MOVE_HORIZONTAL(-1);l := LENGTH(s);p := 1;LOOP EXITIF p > l;c := SUBSTR(s,p,1); p := p+1;CASE c FROM ' ' TO '`' ['`']: COPY_TEXT(ASCII(GetHex(s,p))); p:=p+2;[ ' ']: p:=p+1;[INRANGE,OUTRANGE]: COPY_TEXT(c);ENDCASE;ENDLOOP;ENDPROCEDURE; PROCEDURE Decode POSITION(BEGINNING_OF(b));LOOP EXITIF MARK(NONE)=END_OF(b); IF INDEX(CURRENT_LINE,"+-+-+-+-+-+-+-+-")=1 THEN SkipPartSep;ELSE ProcessLine; MOVE_HORIZONTAL(1);ENDIF;ENDLOOP;ENDPROCEDURE;SET(FACILITY_NAME,"UNPACK");SET( SUCCESS,OFF);SET(INFORMATIONAL,OFF);t:="0123456789ABCDEF";f:=GET_INFO( COMMAND_LINE,"file_name");b:=CREATE_BUFFER(f,f);Decode;WRITE_FILE(b,GET_INFO( COMMAND_LINE,"output_file"));QUIT; $ if p3 .eqs. "" then $ goto dl $ open/write fdl &f $ write fdl "RECORD" $ write fdl P3 $ close fdl $ w "-I-CONVRFM, Converting record format to ", P3 $ convert/fdl=&f &f-1 &P1 $dl: delete 'f'* $ checksum 'P1' $ if checksum$checksum .nes. P2 then $ - e "-E-CHKSMFAIL, Checksum of ''P1' failed." $ exit $ endsubroutine $start: $! $ create 'f' Xsys$share:vaxcrtl/share $ call unpack MY_OPT.OPT;1 728066217 "" $! $ create 'f' X/****************************************************************/ X/*`09Program:`09work_rec.c`09`09`09`09*/ X/*`09Author:`09Bruce`20Ellis,`20The`20VASTEK`20Company,`20Incorporated`09*/ X/*`09Function:`09`09`09`09`09`09*/ X/*`09`09Calculates`20recommended`20working`20set`20list`20sizes`09*/ X/*`09`09Based`20on`20configuration`20and`20displays`20them`20and/or`09*/ X/*`09`09creates`20symbols`20with`20the`20values.`09`09*/ X/*`09Date`20written:`091/8/93`09`09`09`09`09*/ X/*`09Associated`20Files:`09`09`09`09`09*/ X/*`09`09work_rec.cld`09`09`09`09`09*/ X/*`09Requirements:`09Must`20include`20the`20command`20definition,`09*/ X/*`09`09`09using:`20$SET`20COMMAND`20WORK_REC`09`09*/ X/*`09Available`20commands:`09`09`09`09`09*/ X/*`09$WORK_RECOMMENDATIONS`20`09!`20Defaults`20to`20/DISPLAY`09`09*/ X/*`09$WORK_RECOMMENDATIONS`20/SYMBOL`09!Generate`20display`20and`09*/ X/*`09`09`09`09`09!`20symbols.`09`09*/ X/*`09$WORK_RECOMMENDATIONS`20/SYMBOL/NODISPLAY`09!Just`20generate`09*/ X/*`09`09`09`09`09`09!`20symbols`09*/ X/****************************************************************/ X X/*`20Include`20files.`20*/ X#include`20 X#include`20 X#include`20 X#include`20 X X/*`20Define`20a`20warning`20message`20for`20invalid`20time.`20*/ X#define`20MY_IVTIME`20SS$_IVTIME`20`26`20`7E`200x06 X#define`20PRESENT`201 X#define`20SUCCESS`201 X/*`20Define`20constants.`20*/ X#define`20HR_PER_DAY`2024 X#define`20MIN_PER_HR`2060 X#define`20SEC_PER_MIN`2060 X#define`20REC_EXT_FACTOR`202 X#define`20MAX_EXT_FACTOR`203`09/*`20May`20want`20to`20increase`20this`20on`20s Vystems`20 X`09`09`09`09`09with`20large`20memory`20and`20variable`20 X`09`09`09`09`09workloads. X`09`09`09`09*/ X#define`20REASONABLE_UP_DAYS`202 X#define`20RESERVE_MEM`20.1 X X/********************************/ X/*`20Main`20function.`20`09`09*/ X/********************************/ Xint`09main(void) X`7B X/*`20Set`20up`20descriptors`20for`20command`20qualifiers.`20*/ X`09$DESCRIPTOR(sym_qual,"SYMBOL");`09 X`09$DESCRIPTOR(disp_qual,"DISPLAY");`09 X/*`20Set`20up`20references`20for`20system`20memory`20locations.`20*/ X`09globalref`20int`20PMS$GL_PROCCNTMAX;`09/*`20Max`20concurrent`20processes X`09`09`09`09`09`09`20`20`20`20since`20last`20boot. X`09`09`09`09`09`09*/ X`09globalref`20int`20PFN$GL_PHYPGCNT;`09`09/*`20Non-VMS`20memory`20size.`20*/ X`09globalref`20int`20EXE$GL_ABSTIM;`09`09/*`20System`20up`20time`20in`20second Vs.*/ X/*`20Declare`20supporting`20functions.`20*/ X`09int`09generate_symbols(int,`20int,`20unsigned`20int); X`09int`09display_info(int,`20int,`20unsigned`20int); X/*`20Return`20status`20value,`20assume`20success.`20*/ X`09int`09ret_val`20=`20SS$_NORMAL; X X/*`20If`20/SYMBOL`20qualifier`20is`20present`20generate`20symbols.`20*/ X`09if(CLI$PRESENT(`26sym_qual)`26PRESENT) X`09`7B X`09`09ret_val`20=`20generate_symbols(PMS$GL_PROCCNTMAX,`20PFN$GL_PHYPGCNT,`20 X`09`09`09`09`09EXE$GL_ABSTIM); X`09`7D X X/*`20If`20/DISPLAY`20qualifier`20is`20present`20or`20defaulted`20display`20inf Vormation.`20*/ X`09if(CLI$PRESENT(`26disp_qual)`26PRESENT) X`09`7B X`09`09ret_val`20=`20display_info(PMS$GL_PROCCNTMAX,`20 X`09`09`09`09`09PFN$GL_PHYPGCNT,`20EXE$GL_ABSTIM); X`09`7D X X/*`20If`20not`20up`20long`20enough,`20say`20so.`20*/ X`09if(!(ret_val`26SUCCESS)) X`09`7B X`20`09`20`20fprintf(stderr,"`5Cn***************************************`5Cn"); V X`09`20`20fprintf(stderr,"Warning`20the`20system`20has`20been`20up`20less`20tha Vn`20%d`20days.`5Cn", X`09`09`09`09`09REASONABLE_UP_DAYS); X`09`20`20fprintf(stderr,"The`20recommendations`20displayed`20here`20may`20not V`20be"); X`09`20`20fprintf(stderr,`20"`20valid`20due`20to`20short`20up`20time.`5Cn"); X`09`20`20fprintf(stderr,"`5Cn***************************************`5Cn"); X`09`7D X/*`20Sayonara.`20*/ X`09return(ret_val); X`7D X X/*`20Constant`20for`20symbol`20max`20size.`20*/ X#define`20SYM_MAX`20255 X/****************************************************************/ X/*`09Function:`20generate_symbols()`09`09`09`09*/ X/*`09Description:`09generates`20symbols,`20WSDEFAULT,`20WSQUOTA,`20`20*/ X/*`09`09`09WSEXTENT,`20and`20WSEXTENT_MAX`20based`20on`09*/ X/*`09`09`09system`20configuration`20and`20workload.`09*/ X/*`09Inputs:`09`09max_proc`20-`20Maximum`20number`20of`20concurrent`20*/ X/*`09`09`09`20`20`20`09`20`20`20since`20last`20boot.`09`09*/ X/*`09`09`09avail_mem`20-`20Non-VMS`20memory.`09`09*/ X/*`09`09`09up_time`20`20-`20Up`20time`20in`20seconds.`09`09*/ X/*`09Returns:`09SS$_NORMAL`20on`20success`09`09`09*/ X/*`09`09`09MY_IVTIME`20if`20up`20time`20less`20than`202`20days.`20`20*/ X/****************************************************************/ X Xint`09generate_symbols(int`20max_proc,`20int`20avail_mem,`20unsigned`20int`20u Vp_time) X`7B X/*`20Set`20up`20symbol`20descriptors.`20*/ X`09$DESCRIPTOR(wsd_s,"WSDEFAULT");`09 X`09$DESCRIPTOR(wsq_s,"WSQUOTA");`09 X`09$DESCRIPTOR(wse_s,"WSEXTENT");`09 X`09$DESCRIPTOR(wse_m_s,"WSEXTENT_MAX");`09 X X`09int`09ret_val`20=`20SS$_NORMAL;`09/*`20Return`20status,`20assume`20success. V`20*/ X`09int`09call_stat;`09`09/*`20Return`20status`20for`20system X`09`09`09`09`09`20`20`20function`20calls.`20 X`09`09`09`09`09*/ X`09int`09up_days;`09`09/*`20Up`20time`20in`20days.`20*/ X/*`20Strings`20containing`20equivalence`20values.`20*/ X`09char`09wsd`5BSYM_MAX`5D; X`09char`09wsq`5BSYM_MAX`5D; X`09char`09wse`5BSYM_MAX`5D; X`09char`09wse_m`5BSYM_MAX`5D; X/*`20Set`20up`20equivalence`20name`20descriptors.`20*/ X`09struct`09dsc$descriptor_s`09 X`09`09`09`09wsd_sym`20=`20`7BSYM_MAX,DSC$K_DTYPE_T, X`09`09`09`09`09`09DSC$K_CLASS_S,`20wsd`7D, X`09`09`09`09wsq_sym`20=`20`7BSYM_MAX,DSC$K_DTYPE_T, X`09`09`09`09`09`09DSC$K_CLASS_S,`20wsq`7D, X`09`09`09`09wse_sym`20=`20`7BSYM_MAX,DSC$K_DTYPE_T, X`09`09`09`09`09`09DSC$K_CLASS_S,`20wse`7D, X`09`09`09`09wse_max`20=`20`7BSYM_MAX,DSC$K_DTYPE_T, X`09`09`09`09`09`09DSC$K_CLASS_S,`20wse_m`7D X`09`09`09`09; X X/*`20Calculate`20up`20time.`20*/`09 X`09up_days`20=`20up_time`20/`20(HR_PER_DAY`20*`20MIN_PER_HR`20*`20SEC_PER_MIN) V; X X/*`20Set`20up`20warning`20if`20system`20has`20not`20been`20up`20long`20enough. V`20*./ X`09if(up_days`20<`20REASONABLE_UP_DAYS) X`09`7B X`09`20`20ret_val`20=`20MY_IVTIME; X`09`7D X X/*`20Compute`20recommended`20WSDEFAULT,`20WSQUOTA,`20WSEXTENT,`20and`20WSEXTEN VT_MAX`20*/ X/*`20and`20create`20equivalence`20strings.`20*/ X`09sprintf(wsd,`20"%d",`20(avail_mem`20-`20(int)(avail_mem`20*`20RESERVE_MEM)) V/ X`09`09`09`09`09(max_proc)); X`09wsd_sym.dsc$w_length`20=`20strlen(wsd); X`09sprintf(wsq,`20"%d",`20(avail_mem`20-`20(int)(avail_mem`20*`20RESERVE_MEM)) V/ X`09`09`09`09`09(max_proc)); X`09wsq_sym.dsc$w_length`20=`20strlen(wsq); X`09sprintf(wse,`20"%d",`20(avail_mem`20-`20(int)(avail_mem`20*`20RESERVE_MEM)) V/ X`09`09`09`09`09(max_proc)`20*`20REC_EXT_FACTOR); X`09wse_sym.dsc$w_length`20=`20strlen(wse); X`09sprintf(wse_m,`20"%d",`20(avail_mem`20-`20(int)(avail_mem`20*`20RESERVE_MEM V))/ X`09`09`09`09`09(max_proc)`20*`20MAX_EXT_FACTOR); X`09wse_max.dsc$w_length`20=`20strlen(wse_m); X X/*`20Create`20symbols`20for`20WSDEFAULT,`20WWSQUOTA,`20WSEXTENT,`20and`20WSEXT VENT_MAX.*/ X`09call_stat`20=`20LIB$SET_SYMBOL(`26wsd_s,`20`26wsd_sym); X`09if(!(call_stat`26SUCCESS))`20LIB$SIGNAL(call_stat); X`09call_stat`20=`20LIB$SET_SYMBOL(`26wsq_s,`20`26wsq_sym); X`09if(!(call_stat`26SUCCESS))`20LIB$SIGNAL(call_stat); X`09call_stat`20=`20LIB$SET_SYMBOL(`26wse_s,`20`26wse_sym); X`09if(!(call_stat`26SUCCESS))`20LIB$SIGNAL(call_stat); X`09call_stat`20=`20LIB$SET_SYMBOL(`26wse_m_s,`20`26wse_max); X`09if(!(call_stat`26SUCCESS))`20LIB$SIGNAL(call_stat); X X/*`20Beat`20it.`20*/ X`09return(ret_val); X`7D X X X/****************************************************************/ X/*`09Function:`20display_info()`09`09`09`09*/ X/*`09Description:`09generates`20a`20display`20containing:`09`09*/ X/*`09`09`09system`20uptime,`20max`20concurrent`20process`09*/ X/*`09`09`09since`20last`20boot,`20Non-VMS`20memory,`20and`09*/ X/*`09`09`09recommended`20values`20for:`09`09`09*/ X/*`09`09`09WSDEFAULT,`20WSQUOTA,`09`09`09*/ X/*`09`09`09WSEXTENT,`20and`20WSEXTENT_MAX`20based`20on`09*/ X/*`09`09`09system`20configuration`20and`20workload.`09*/ X/*`09Inputs:`09`09max_proc`20-`20Maximum`20number`20of`20concurrent`20*/ X/*`09`09`09`20`20`20`09`20`20`20since`20last`20boot.`09`09*/ X/*`09`09`09avail_mem`20-`20Non-VMS`20memory.`09`09*/ X/*`09`09`09up_time`20`20-`20Up`20time`20in`20seconds.`09`09*/ X/*`09Returns:`09SS$_NORMAL`20on`20success`09`09`09*/ X/*`09`09`09MY_IVTIME`20if`20up`20time`20less`20than`202`20days.`20`20*/ X/****************************************************************/ Xint`09display_info(int`20max_proc,`20int`20avail_mem,`20unsigned`20int`20up_ti Vme) X`7B X/*`20Calculated`20recommendations.`20*/ X`09int`09wsd_val; X`09int`09wsq_val; X`09int`09wse_val; X`09int`09wse_m_val; X/*`20Time`20variables.`20*/ X`09int`09up_days; X`09int`09up_hours; X`09int`09up_min; X`09int`09rem_time; X/*`20Return`20value,`20assume`20success.`20*/ X`09int`09ret_val=`20SS$_NORMAL; X`09 X/*`20Calculate`20recommended`20WSDEFAULT`20and`20WSQUOTA.`20*/ X`09wsd_val`20=`20wsq_val`20=`20(avail_mem`20-`20(int)(avail_mem`20*`20RESERVE_ VMEM))/ X`09`09`09`09`09`09max_proc; X/*`20Calculate`20recommended`20WSEXTENT`20and`20maximum`20rec.`20WSEXTENT.`20* V/ X`09wse_val`20=`20wsq_val`20*`20REC_EXT_FACTOR; X`09wse_m_val`20=`20wsq_val`20*`20MAX_EXT_FACTOR; X X/*`20Breakdoen`20up`20time`20into`20days,`20hours,`20and`20minutes.`20*/ X`09up_days`20=`20up_time`20/`20(HR_PER_DAY`20*`20MIN_PER_HR`20*`20SEC_PER_MIN) V; X`09rem_time`20=`20up_time`20%`20(HR_PER_DAY`20*`20MIN_PER_HR`20*`20SEC_PER_MIN V); X`09up_hours`20=`20rem_time`20/`20(MIN_PER_HR`20*`20SEC_PER_MIN); X`09rem_time`20=`20rem_time`20%`20(MIN_PER_HR`20*`20SEC_PER_MIN); X`09up_min`20=`20`20`20rem_time`20/`20SEC_PER_MIN; X X/*`20If`20not`20up`20long`20enough,`20set`20warning.`20*/ X`09if(up_days`20<`20REASONABLE_UP_DAYS) X`09`7B X`09`20`20ret_val`20=`20MY_IVTIME; X`09`7D X X/*`20Display`20info.`20*/ X`09printf("The`20system`20has`20been`20up`20for`20%4d`20%02d:%02d`5Cn", X`09`09`09up_days,`20up_hours,`20up_min); X`09printf("There`20are`20%d`20pages`20of`20available`20memory.`5Cn", X`09`09`09avail_mem); X`09printf("The`20maximum`20number`20of`20concurrent`20processes`20since`20last V`20boot"); X`09printf("`20is`20%d`5Cn",`20max_proc); X`09printf("The`20recommended`20working`20set`20list`20sizes`20are:`5Cn"); X`09printf("WSDEFAULT`20=`20%d`5Cn",`20wsd_val); X`09printf("WSQUOTA`20`20`20=`20%d`5Cn",`20wsq_val); X`09printf("WSEXTENT`20`20=`20%d`5Cn",`20wse_val); X`09printf("The`20maximum`20recommended`20WSEXTENT`20is`20%d.`5Cn",`20wse_m_val V); X X/*`20Beat`20it!`20*/ X`09return(ret_val); X`7D $ call unpack WORK_REC.C;1 775314070 "" $! $ create 'f' Xdefine`20verb`20work_recommendations X!`20Use`20appropriate`20full`20file`20specification`20for`20program`20here X`09image`20USER5:`5BELLISB`5Dwork_rec X`09qualifier`20symbol,`20negatable X`09qualifier`20display,`20default,`20negatable $ call unpack WORK_REC.CLD;1 204486585 "" $! $ create 'f' X$`20 X$`20type`20work_rec.c X$! X$!`20`20Extracted`20to`20WORK_REC.C X$! X$`20 X$`20type`20my_opt.opt X$! X$!`20`20Extracted`20to`20MY_OPT.OPT. X$! X$`20cc`20work_rec X$`20link`20work_rec,my_opt/opt,`20sys$system:sys.stb X$`20 X$`20 X$`20type`20work_rec.cld X$! X$!`20`20Extracted`20to`20WORK_REC.CLD. X$! X$`20 X$`20set`20command`20work_rec X$`20 X$`20 X$`20work_reccommendations XThe`20system`20has`20been`20up`20for`20`20`20`204`2011:12 XThere`20are`20342943`20pages`20of`20available`20memory. XThe`20maximum`20number`20of`20concurrent`20processes`20since`20last`20boot X`20is`20286 XThe`20recommended`20working`20set`20list`20sizes`20are: XWSDEFAULT`20=`201079 XWSQUOTA`20`20`20=`201079 XWSEXTENT`20`20=`202158 XThe`20maximum`20recommended`20WSEXTENT`20is`203237. X$`20 X$`20 X$`20show`20symbol/local/all X$`20 X$`20work/NODISPLAY/SYMBOL X$`20 X$`20 X$`20show`20symbol/local/all X`20`20WSDEFAULT`20=`20"1079" X`20`20WSEXTENT`20=`20"2158" X`20`20WSEXTENT_MAX`20=`20"3237" X`20`20WSQUOTA`20=`20"1079" X$`20 X$`20show`20memory/physical X`20`20`20`20`20`20`20`20`20`20`20`20`20`20System`20Memory`20Resources`20on`20 V`209-JAN-1993`2018:07:14.76 XPhysical`20Memory`20Usage`20(pages):`20`20`20`20`20Total`20`20`20`20`20`20`20 V`20Free`20`20`20`20`20`20In`20Use`20`20`20`20Modified X`20`20Main`20Memory`20(192.00Mb)`20`20`20`20`20`20`20`20`20`20393216`20`20`20 V`20`20`20227852`20`20`20`20`20`20154917`20`20`20`20`20`20`2010447 XOf`20the`20physical`20pages`20in`20use,`2050273`20pages`20are`20permanently V`20allocated`20to`20VMS. X$`20 X$`20 $ call unpack WORK_REC.EXAMPLE;1 521965949 "" $! $ create 'f' XThis`20file`20offers`20a`20program`20originally`20published`20in`20the`20March V/April`201993`20 Xissue`20of`20Digital`20Systems`20Journal.`20It`20was`20first`20run`20as`20part V`20of`20Bruce`20Ellis'`20 Xarticle,`20"OpenVMS`20Internals:`20Sizing`20Working`20Set`20Lists,"`20which V`20ran`20on`20page`20 X46.`20The`20working`20set`20list`20defines`20the`20amount`20of`20memory`20that V`20a`20process`20can`20 Xuse`20at`20any`20given`20time.`20Proper`20assignment`20of`20the`20working`20se Vt`20list`20sizes`20can`20 Xbe`20crucial`20to`20system`20performance,`20but`20sizing`20working`20set`20lis Vts`20has`20 Xtraditionally`20been`20done`20in`20an`20arbitrary`20fashion.`20Bruce`20Ellis' V`20article`20 Xpresents`20a`20method`20for`20calculating`20proper`20working`20set`20sizes. $ call unpack WSL.DESC;1 726213288 "" $ v=f$verify(v) $ exit