00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037 static char USMID[] = "@(#) libf/auxarr/c1/auxinit.c 92.0 10/08/98 14:30:10";
00038
00039
00040
00041 #include <stdio.h>
00042 #include <malloc.h>
00043 #include <errno.h>
00044 #include "aux.h"
00045 extern int sys_nerr;
00046 extern char *sys_errlist[];
00047
00048
00049
00050 #define AUXSEM 1
00051
00052 extern info _infoblk;
00053
00054 extern int $pgshift;
00055
00056 extern int *$adartable;
00057
00058
00059
00060 int $stride2buf[]={0,2,4,6,8,10,12,14,16,18,20,22,24,26,28,30,32,
00061 34,36,38,40,42,44,46,48,50,52,54,56,58,60,62,64,66,68,70,
00062 72,74,76,78,80,82,84,86,88,90,92,94,96,98,100,102,104,
00063 106,108,110,112,114,116,118,120,122,124,126,128,130,132,134,
00064 136,138,140,142,144,146,148,150,152,154,156,158,160,162,164,
00065 166,168,170,172,174,176,178,180,182,184,186,188,190,192,194,
00066 196,198,200,202,204,206,208,210,212,214,216,218,220,222,224,
00067 226,228,230,232,234,236,238,240,242,244,246,248,250,252,254};
00068
00069 int $tmparea[2];
00070
00071
00072 static int *adar;
00073 static int pgsize;
00074 static int nbuf;
00075 static int *bufptr;
00076 static int vmsize = 0;
00077 static int adarsize = 0;
00078 static int maxtransize;
00079 static int numtrans = 0;
00080 static trans *transptr;
00081
00082 static int __vainit = 0;
00083
00084 static int replace = 0;
00085 static int pgblks;
00086
00087 static int _sdswrite = 0;
00088 static int _sdsread = 0;
00089
00090
00091
00092
00093
00094 static void _fmtnum(char *bufptr, unsigned num);
00095 static void _auxerr(char *msg, int err);
00096
00097
00098
00099
00100
00101 $auxinit(start)
00102 int start;
00103
00104 {
00105 unsigned vmlen;
00106 char *envptr;
00107 char *getenv();
00108 info *infoblk;
00109 int sds_static_ptr;
00110 int err;
00111
00112
00113 if ((envptr = getenv("AUXBUF")) != NULL){
00114 nbuf = atoi(envptr);
00115 }
00116 else
00117 nbuf = 64;
00118
00119
00120
00121
00122
00123 if ((envptr = getenv("AUXPAGE")) != NULL){
00124 pgsize = atoi(envptr);
00125 pgblks = 64-_leadz(pgsize)-1;
00126 pgsize = 1<<pgblks;
00127 $pgshift = pgblks+9;
00128 }
00129 else{
00130 pgblks = 1;
00131 $pgshift = 10;
00132 pgsize = 2;
00133 }
00134
00135 maxtransize = 10;
00136 if((transptr =
00137 (trans *)malloc(sizeof(trans)*maxtransize)) == (trans *)0){
00138 _auxerr(MSG1,0);
00139 }
00140
00141
00142
00143 if (start == 0){
00144 infoblk = &_infoblk;
00145 vmlen = infoblk->vmlen;
00146
00147
00148
00149
00150
00151
00152 vmsize = (((vmlen+511)/512)+(pgsize-1))/pgsize * pgsize;
00153 adarsize = vmsize;
00154 if (vmlen != 0){
00155 if ((sds_static_ptr = sdsalloc(vmsize,&err)) == -1){
00156 _auxerr(MSG2,err);
00157 }
00158
00159
00160
00161 if (($adartable = (int *)malloc(vmsize/pgsize *8))==NULL){
00162 _auxerr(MSG1,0);
00163 }
00164
00165 (void) _memwset($adartable,-1,vmsize/pgsize);
00166
00167
00168
00169 transptr->begcompadr = 0;
00170 transptr->endcompadr = vmsize*512 -1;
00171 transptr->ssdadr = sds_static_ptr;
00172 numtrans=1;
00173 }
00174 }
00175
00176
00177 if ((bufptr = (int *)calloc(nbuf * 512 * 8 * pgsize+nbuf*8,1)) == NULL){
00178 _auxerr(MSG1,0);
00179 }
00180
00181
00182
00183 if ((adar = (int *)malloc(nbuf*8)) == NULL){
00184 _auxerr(MSG1,0);
00185 }
00186
00187 (void) _memwset(adar,-1,nbuf);
00188 __vainit = 1;
00189 }
00190
00191
00192
00193
00194
00195 $auxread(adr)
00196 int adr;
00197 {
00198 int offset;
00199 int i;
00200 int newpage;
00201 int sdsadr;
00202 int sdsword;
00203 int found;
00204 trans *tptr;
00205 int adarrep;
00206
00207 sdsadr = adr<<(pgblks);
00208
00209
00210
00211 adarrep = *(adar+replace);
00212
00213 sdsword = sdsadr*512;
00214
00215
00216 if (adarrep != -1) {
00217 *($adartable+(adarrep>>pgblks)) = -1;
00218 }
00219
00220
00221
00222
00223
00224
00225
00226 if (*((int *)bufptr + (replace<<$pgshift) + replace)!=0){
00227 *((int *)bufptr + (replace<<$pgshift) + replace)=0;
00228
00229
00230 tptr = transptr;
00231 found = FALSE;
00232 for (i = 0; i < numtrans; i++){
00233 if ((adarrep>=tptr->begcompadr/512) &&
00234 (adarrep<= tptr->endcompadr/512)){
00235 offset = tptr->ssdadr+adarrep-(tptr->begcompadr)/512;
00236 found = TRUE;
00237 break;
00238 }
00239 tptr++;
00240 }
00241 if (found){
00242
00243 if(sswrite((int *)bufptr + (replace<<($pgshift))+(replace+1),
00244 offset,pgsize) == -1) {
00245 _auxerr(MSG4,errno);
00246 }
00247 _sdswrite++;
00248 }
00249 }
00250
00251 tptr = transptr;
00252 found = FALSE;
00253
00254
00255 for (i = 0; i < numtrans; i++){
00256 if (((sdsword)>=tptr->begcompadr) &&
00257 ((sdsword)<= tptr->endcompadr)){
00258 offset = tptr->ssdadr+sdsadr - tptr->begcompadr/512;
00259 found = TRUE;
00260 break;
00261 }
00262 tptr++;
00263 }
00264 if (!found){
00265 _auxerr(MSG9,0);
00266 }
00267
00268
00269 newpage = replace*512*pgsize;
00270 if(ssread((int *)bufptr + newpage+(replace+1),offset,pgsize) == -1)
00271 {
00272 _auxerr(MSG5,errno);
00273 }
00274 _sdsread++;
00275
00276
00277
00278
00279 *(adar+replace) = sdsadr;
00280
00281
00282 newpage += replace;
00283 *($adartable+adr)=(int)(bufptr+newpage);
00284
00285
00286 replace++;
00287 if (replace>=nbuf)
00288 replace=0;
00289 return((int)(bufptr+newpage));
00290 }
00291
00292 AUXSTAT(){
00293 char buf[100];
00294
00295 (void) strcpy(buf,"Sds written to ");
00296 _fmtnum(&buf[strlen(buf)],_sdswrite);
00297 strcat(buf," times \n");
00298 write(2,buf,strlen(buf));
00299 (void) strcpy(buf,"Sds read from ");
00300 _fmtnum(&buf[strlen(buf)],_sdsread);
00301 strcat(buf," times \n");
00302 write(2,buf,strlen(buf));
00303 }
00304 static void
00305 _fmtnum(char *bufptr, unsigned num)
00306 {
00307 int i, pr, d;
00308
00309 pr = 0;
00310 for (i = 10000000000000; i != 1; i /=10)
00311 {
00312 if ((pr |= (d = num/i)))
00313 *bufptr++ = d + '0';
00314 num %= i;
00315 }
00316 *bufptr++ = num + '0';
00317 *bufptr++ = ' ';
00318 *bufptr = '\0';
00319 }
00320 static void
00321 _auxerr(char *msg, int err)
00322 {
00323 char buf[50];
00324 write(2,msg,strlen(msg));
00325 if (err != 0){
00326 _fmtnum(buf,err);
00327 write(2,buf,strlen(buf));
00328 if (err < sys_nerr && sys_errlist[err] != 0){
00329 write(2,sys_errlist[err],strlen(sys_errlist[err]));
00330 }
00331 write(2,"\n",1);
00332 }
00333 _semclr(AUXSEM);
00334 abort();
00335 }
00336
00337
00338
00339 #define TINC 1000
00340 #define BIGNUM 10000
00341
00342 $ssdallc(nwords,abflag,status)
00343 int nwords;
00344 int abflag;
00345 long *status;
00346 {
00347 int nblk;
00348 int sdsptr;
00349 int i,j,x;
00350 trans *tptr;
00351 trans *xptr;
00352 int err;
00353 char *msg;
00354 #define ERREX(x,y) msg = x; err = y; goto errexit;
00355
00356 if (!__vainit){
00357 $auxinit(1);
00358 }
00359
00360 nblk = ((((nwords+511)/512)+(pgsize-1))/pgsize) * pgsize;
00361
00362 nwords = nblk*512;
00363 *status = 0;
00364
00365
00366 if((sdsptr = sdsalloc(nblk,&err)) == -1){
00367 ERREX(MSG2,err);
00368 }
00369
00370
00371
00372
00373
00374
00375
00376 tptr = transptr;
00377 for (i = 0; i < numtrans-1; i++){
00378 x = tptr->endcompadr;
00379 tptr++;
00380 if ((tptr->begcompadr-x)>= nwords){
00381
00382
00383
00384
00385 if (numtrans < maxtransize){
00386
00387
00388
00389 }
00390 else {
00391
00392
00393
00394 if((transptr = (trans *)realloc(transptr,
00395 sizeof(trans)*(maxtransize+TINC))) == (trans *)0){
00396 ERREX(MSG6,0);
00397 }
00398 maxtransize+=TINC;
00399 }
00400
00401 tptr = transptr+numtrans;
00402 for (j = numtrans; j > i; j--){
00403 xptr = tptr-1;
00404 tptr->begcompadr = xptr->begcompadr;
00405 tptr->endcompadr = xptr->endcompadr;
00406 tptr->ssdadr = xptr->ssdadr;
00407 tptr = xptr;
00408 }
00409
00410 tptr->begcompadr = x+1;
00411 tptr->endcompadr = x+nwords;
00412 tptr->ssdadr = sdsptr;
00413 numtrans++;
00414 return(tptr->begcompadr);
00415 }
00416 }
00417
00418
00419 if (numtrans < maxtransize){
00420 tptr = transptr+numtrans;
00421 if (numtrans != 0){
00422 xptr = tptr-1;
00423 x = xptr->endcompadr;
00424 tptr->begcompadr = x+1;
00425 tptr->endcompadr = x+nwords;
00426 }
00427 else {
00428 tptr->begcompadr = 0;
00429 tptr->endcompadr = nwords;
00430
00431 }
00432 tptr->ssdadr = sdsptr;
00433 numtrans++;
00434 }
00435 else{
00436 if((transptr = (trans *)realloc(transptr,
00437 sizeof(trans)*(maxtransize+TINC))) == (trans *)0){
00438 ERREX(MSG6,0);
00439 }
00440 maxtransize+=TINC;
00441 tptr = transptr+numtrans;
00442 xptr = tptr-1;
00443 x = xptr->endcompadr;
00444 tptr->begcompadr = x+1;
00445 tptr->endcompadr = x+nwords;
00446 tptr->ssdadr = sdsptr;
00447 numtrans++;
00448 }
00449
00450 if (adarsize+nblk > vmsize){
00451
00452 if (adarsize == 0){
00453 if (($adartable = (int *)malloc(nblk/pgsize *8))==NULL){
00454 ERREX(MSG6,0);
00455 }
00456 }
00457 else if(($adartable = (int *)realloc($adartable,
00458 (adarsize+nblk)/pgsize *8))==(int *)0){
00459 ERREX(MSG6,0);
00460 }
00461
00462 (void) _memwset($adartable+adarsize/pgsize,-1,nblk/pgsize);
00463 adarsize+=nblk;
00464 vmsize=adarsize;
00465 }
00466 else
00467 adarsize+=nblk;
00468 return(tptr->begcompadr);
00469 errexit:
00470 if (abflag!= 0)
00471 _auxerr(msg,err);
00472 else
00473 *status = err;
00474 return((long)-1);
00475 }
00476
00477 $ssdfree(adr,abflag)
00478 long adr;
00479 long abflag;
00480
00481 {
00482 trans *tptr;
00483 trans *xptr;
00484 int i,j;
00485 int *aptr;
00486 int *ptr;
00487 int err;
00488 char *msg;
00489 #define ERREX(x,y) msg = x; err = y; goto errexit;
00490
00491
00492 tptr = transptr;
00493 for (i=0; i < numtrans; i++){
00494 if (tptr->begcompadr == adr){
00495
00496 if (sdsfree(tptr->ssdadr,&err)!=0){
00497 ERREX(MSG7,err);
00498 }
00499 ptr = adar;
00500 for (j = 0; j < nbuf; j++){
00501
00502 if (*ptr >= tptr->begcompadr/512 && *ptr <=
00503 tptr->endcompadr/512){
00504 *ptr = -1;
00505 }
00506 ptr++;
00507 }
00508
00509
00510 if (i+1 == numtrans){
00511
00512
00513
00514
00515 if ((vmsize - (adarsize-
00516 (tptr->endcompadr - tptr->begcompadr+1)/512)) > BIGNUM){
00517 if (adarsize - (tptr->endcompadr - tptr->begcompadr + 1)/512 == 0)
00518 free($adartable);
00519 else if(($adartable = (int *)realloc($adartable,
00520 (adarsize-(tptr->endcompadr - tptr->begcompadr
00521 +1)/512)/pgsize * 8)) == (int *)0){
00522 ERREX(MSG6,0);
00523 }
00524 vmsize = (adarsize - (tptr->endcompadr -
00525 tptr->begcompadr + 1)/512);
00526 adarsize = vmsize;
00527 }
00528 else {
00529 aptr= $adartable+tptr->begcompadr/(512*pgsize);
00530 (void) _memwset(aptr ,-1,
00531 (tptr->endcompadr - tptr->begcompadr+1)/(512*pgsize));
00532 adarsize = (adarsize - (tptr->endcompadr -
00533 tptr->begcompadr + 1)/512);
00534 }
00535 if (maxtransize - numtrans > TINC){
00536 if ((transptr = (trans *)realloc(transptr,
00537 sizeof(trans)*(maxtransize-TINC))) == (trans *)0){
00538 ERREX(MSG6,0);
00539 }
00540 maxtransize-=TINC;
00541 }
00542 }
00543 else{
00544
00545
00546
00547 aptr= $adartable+tptr->begcompadr/(512*pgsize);
00548 (void) _memwset(aptr ,-1,
00549 (tptr->endcompadr - tptr->begcompadr+1)/(512*pgsize));
00550 for (j = i+1; j < numtrans; j++){
00551 xptr = tptr+1;
00552 tptr->begcompadr = xptr->begcompadr;
00553 tptr->endcompadr = xptr->endcompadr;
00554 tptr->ssdadr = xptr->ssdadr;
00555 tptr++;
00556 }
00557 }
00558 numtrans--;
00559 replace = 0;
00560 return(0);
00561 }
00562 tptr++;
00563 }
00564 ERREX(MSG8,0);
00565
00566 errexit:
00567 if (abflag!= 0)
00568 _auxerr(msg,err);
00569 else
00570 return((long)err);
00571 }