From 7e0f021a9aec35fd8e6725e87e3313b101d26f5e Mon Sep 17 00:00:00 2001 From: Tobias Klauser Date: Sun, 27 Jan 2008 11:37:44 +0100 Subject: Initial import (2.0.2-6) --- reference/C/CONTRIB/SNIP/strat.c | 170 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 170 insertions(+) create mode 100755 reference/C/CONTRIB/SNIP/strat.c (limited to 'reference/C/CONTRIB/SNIP/strat.c') diff --git a/reference/C/CONTRIB/SNIP/strat.c b/reference/C/CONTRIB/SNIP/strat.c new file mode 100755 index 0000000..fb00d5b --- /dev/null +++ b/reference/C/CONTRIB/SNIP/strat.c @@ -0,0 +1,170 @@ +/* +** strat.c 10-5-91 Robert Mashlan, public domain +** +** Interface functions to DOS 3.0+ set allocation strategy +** and get allocation strategy functions via int 21h, +** function 58h. +** +** By setting the dos allocation strategy to LAST_FIT_LOW +** before using DOS the set handle count function int 21h, +** function 67h, DOS will allocate memory for the extended +** file handle table at the end of free memory instead of +** after the last heap allocation, with the benefit of +** allowing the heap manager make further contiguous +** allocations from the operating system. +** +*/ + +#include +#include +#include "strat.h" + +/* +** Gets dos memory allocation strategy via function 0x58. +** Returns allocation strategy, else returns -1 and sets +** _doserrno on error. +*/ + +int get_alloc_strat(void) +{ + union REGS r; + + r.x.ax = 0x5800; /* DOS "get allocation strategy" */ + int86(0x21,&r,&r); + if (r.x.cflag) /* error? */ + { + _doserrno = r.x.ax; /* save error code */ + return -1; + } + else return r.x.ax; +} + +/* +** Sets DOS memory allocation strategy +** returns allocation strategy on success, +** else returns -1 and sets _doserrno on error +*/ + +int set_alloc_strat( int strat ) +{ + union REGS r; + + r.x.ax = 0x5801; /* DOS "set allocation strategy" */ + r.x.bx = strat; + int86(0x21,&r,&r); + if (r.x.cflag) /* error? */ + { + _doserrno = r.x.ax; /* save error code */ + return -1; + } + _doserrno = 0; + return strat; +} + +/* +** Uses dos function 67h to increase open file handle count. +** Returns -1 and sets _doserrno on error, 0 otherwise. +*/ + +int set_handle_count( unsigned nhandles ) +{ + union REGS r; + + r.x.ax = 0x6700; + r.x.bx = nhandles; + int86(0x21,&r,&r); + if(r.x.cflag) + { + _doserrno = r.x.ax; + return -1; + } + _doserrno = 0; + return 0; +} + +#ifdef DEMO + +#include +#include +#include +#include + +/* +** returns maximum number of files that can be open +*/ + +int handle_count(void) +{ + int handles[500]; + int i, result; + + /* try allocating as many file handles as possible */ + + for (i = 0; i < 500; i++) + { + if( (handles[i]=open("NUL",O_WRONLY)) == -1 ) + break; + } + result = i; + + /* close all files opened */ + + for (i--; i >= 0; i--) + close(handles[i]); + return result; +} + + +/* +** Memory test, returns number of kilobytes that +** can be allocated before failure. +*/ + +int memtest(void) +{ + static void *mem[1024]; + int i,result; + + /* try allocating as many 1K blocks as possible */ + + for(i=0;i<1024;i++) + { + if( (mem[i]=malloc(1024)) == NULL ) + break; + } + result = i; /* save result */ + + /* free memory allocated */ + + for(i--; i >= 0; i--) + free(mem[i]); + return result; +} + +#define checkdoserror(f) \ + ((f==-1)?printf("%s failed, doserror = %#02x\n",#f,_doserrno):(void)0) + +int main(void) +{ + int strat; + + /* do pre-test diagnostics */ + + printf("allocated %d Kbytes before failure\n",memtest()); + printf("opened %d files\n",handle_count()); + + strat = get_alloc_strat(); /* save current allocation strategy */ + checkdoserror(set_alloc_strat(LAST_FIT_LOW)); + puts("setting handle count to 50, with changed allocation strategy"); + checkdoserror(set_handle_count(50)); + checkdoserror(set_alloc_strat(strat)); /* restore strategy */ + + /* do post-test diagnostics */ + + printf("allocated %d Kbytes before failure\n",memtest()); + printf("opened %d files\n",handle_count()); + + return 0; +} + +#endif -- cgit v1.2.3-54-g00ecf