|
|
1.1 root 1: static char ID[] = "@(#) use.c: 1.1 3/16/82";
2: #include <stdio.h>
3: #include "sdp.h"
4: #include "define3.h"
5:
6: #ifdef SHORT
7: #define US01 "US01 "
8: #define US02 "US02 "
9: #define US03 "US03 "
10: #define US04 "US04 "
11: #define US05 "US05 "
12: #define US06 "US06 "
13: #define US07 "US07 "
14: #define USAU "USAU "
15: #else
16: #define US01 "US01 -- space not connected\n%o\n",sp
17: #define US02 "US02 -- no permissions for WRTN\n%o\n",sp
18: #define US03 "US03 -- unknown permissions\n%o\t%d\n",sp,permissions
19: #define US04 "US04 -- id out of range\n%o\t%lo\t%lo\n",sp,id,sp->maxpage
20: #define US05 "US05 -- id not aligned to %d-byte boundary\n%o\t%lo\n",sizeof(BOUNDARY),sp,id
21: #define US06 "US06 -- framesearch returns impossible value\n%o\t%d\t%d\n",sp,whichframe,(sp->environ)->num_frames
22: #define US07 "US07 -- fail to place item in frame\n%o\t%lo\n",sp,id
23: #define USAU "%s","USAU -- audit failed in sdp_use\n"
24: #endif
25:
26: #ifdef SWEET
27: #define PROLOG
28: #define EPILOG
29: #else
30: #define PROLOG if( (aud_flag == AUDITON) && (aud_check() == ERROR) )\
31: ERR_RET(USAU,NULL)
32: #define EPILOG if(aud_flag == AUDITON)\
33: aud_set() ;\
34: if(hist_fp != NULL)\
35: fprintf(hist_fp,"US\t%o\t%ld\t%d\t%o\n",sp,id,permissions,manager[whichframe].frame_pntr+byte_offset) ;
36: #endif
37:
38: extern int aud_flag ;
39: extern struct LIBFILE *Glib_file ;
40: extern FILE *hist_fp ;
41:
42: extern int aud_check() ;
43: extern aud_set() ;
44: extern FATAL() ;
45: extern fault() ;
46: extern framesearch() ;
47: extern spearch() ;
48:
49: BOUNDARY * /* pointer to item or NULL */
50: sdp_use(sp,id,permissions)
51: register struct SPACE *sp ;
52: ITEMID id ;
53: int permissions ;
54: {
55: register struct MANAGER *manager ;
56: register int whichframe ;
57: register int byte_offset ;
58:
59: PROLOG
60: if(spsearch(sp) == NOTFOUND)
61: ERR_RET(US01,NULL)
62:
63: switch(permissions)
64: {
65: case WRTN:
66: if(sp->perms != WRTN)
67: ERR_RET(US02,NULL)
68:
69: case RNLY:
70: break ;
71:
72: default:
73: ERR_RET(US03,NULL)
74: }
75:
76: if(INVALID(sp,id))
77: ERR_RET(US04,NULL)
78: if(id != ALIGNID(id))
79: ERR_RET(US05,NULL)
80:
81: Glib_file = sp->lib_file ;
82:
83: manager = (sp->environ)->manp ;
84: switch(whichframe = framesearch(sp,id))
85: {
86: case NOTFOUND:
87: whichframe = fault(sp,id) ;
88: default:
89: if( (whichframe<0) || (whichframe >= (sp->environ)->num_frames) )
90: ERR_RET(US06,NULL)
91: break ;
92:
93: case ERROR:
94: ERR_RET(US07,NULL)
95: break ;
96: }
97:
98: if( (manager[whichframe].ref_chng == RCNULL) || (permissions == WRTN) )
99: manager[whichframe].ref_chng = permissions ;
100: if(manager[whichframe].usecount == 0)
101: {
102: (sp->environ)->stats.curuse++ ;
103: if( (sp->environ)->stats.curuse > (sp->environ)->stats.maxuse )
104: (sp->environ)->stats.maxuse = (sp->environ)->stats.curuse ;
105: }
106: manager[whichframe].usecount++ ;
107: (sp->environ)->stats.uses++ ;
108: byte_offset = id % (sp->environ)->frame_size ;
109:
110: EPILOG
111: return((BOUNDARY *)(manager[whichframe].frame_pntr + byte_offset)) ;
112: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.