|
|
1.1 root 1: /*
2: ** Copyright (c) 1983 Relational Technology Inc.
3: **
4: ** IIDR.H - structures for the INGRES lock driver
5: **
6: ** Description:
7: ** Defines the constants and the structures used by the lock device.
8: */
9: #ifdef vax
10: #undef BYTE_SWAP
11: #undef NOTVAX
12: #else
13: #define BYTE_SWAP
14: #define NOTVAX
15: #endif
16:
17: /* The request codes to the lock device. */
18:
19: # define KN_R_LOCK 1
20: # define KN_R_UNLOCK 2
21: # define KN_R_CONVERT 3
22: # define KN_R_RELEASE 4
23: # define KN_R_UNIQ 5
24: # define KN_R_STAT 6
25:
26: /* The lock modes that the device supports */
27:
28: # define KN_M_NL 0
29: # define KN_M_CR 1
30: # define KN_M_CW 2
31: # define KN_M_PR 3
32: # define KN_M_PW 4
33: # define KN_M_EX 5
34:
35: /* Possible extra return values from the lock device */
36:
37: # define EDEADLOCK -1
38: # define ECHILDREN -2
39: # define ELOCKID -3
40: # define ENOTQUEUED -4
41: # define ERESOURCE -5
42: # define EBUG -6
43:
44: /* The structure used by the user to pass lock key information to the lock device. */
45:
46: typedef struct
47: {
48: short lk_parent; /* parentid when setting a lock */
49: short lk_type; /* the type of lock */
50: long lk_key; /* the key when setting a lock */
51: } LOCK_KEY;
52:
53: /* Collect performance numbers about the lock device in this structure. */
54:
55: typedef struct
56: {
57: long ii_locks; /* number of lock requests */
58: long ii_unlocks; /* number of unlocks requests */
59: long ii_converts; /* number of conversion requests */
60: long ii_lockwaits; /* number of lock requests that waited */
61: long ii_waitconverts; /* number of convert requests that waited */
62: long ii_deadconverts; /* number of conversion deadlocks */
63: long ii_deadsearchs; /* number of deadlock searches performed */
64: long ii_deadlocks; /* number of resource deadlocks found */
65: } STAT;
66:
67: /*
68: The format of a request code to the lock device.
69:
70: BYTE_SWAP must be defined for processors such as
71: the 3B5 and 68K where the byte order is
72: the opposite of the vax.
73: */
74:
75: typedef struct
76: {
77: # ifndef BYTE_SWAP
78: unsigned cmd_opcode:3; /* function code */
79: unsigned cmd_lock_mode:3; /* lock mode */
80: unsigned cmd_no_queue:1; /* don't wait modifier */
81: # else
82: unsigned cmd_pad:25; /* count on bit order */
83: unsigned cmd_no_queue:1; /* don't wait modifier */
84: unsigned cmd_lock_mode:3; /* lock mode */
85: unsigned cmd_opcode:3; /* function code */
86: # endif
87: } CMD;
88:
89: typedef struct _QUEUE QUEUE;
90:
91: struct _QUEUE
92: {
93: QUEUE *q_next;
94: QUEUE *q_prev;
95: };
96:
97: QUEUE *remque();
98: QUEUE *insque();
99:
100: typedef struct _LKB LKB;
101: typedef struct _RSB RSB;
102:
103: /*
104: ** A Resource Block.
105: ** An RSB is allocated for each unique key that is locked.
106: ** It contains information about that states of locks queued against this resource.
107: */
108:
109: struct _RSB
110: {
111: QUEUE rsb_next; /* next of hash chain */
112: QUEUE rsb_wait_lkb; /* queue of waiting locks */
113: QUEUE rsb_grant_lkb; /* queue of granted locks followed by conversion requests */
114: RSB *rsb_parent; /* parent resource */
115: LKB *rsb_deadlock_next; /* used to save next on recursion in deadlock tree */
116: LKB *rsb_deadlock_curr; /* used to save curr on recursion in deadlock tree */
117: int rsb_pad; /* for future use */
118: union
119: {
120: LOCK_KEY rsb_lk; /* used to save lock from user */
121: struct
122: {
123: unsigned char rsb_xgrant_mode; /* granted mode of locked */
124: unsigned char rsb_xconvert_mode; /* effective convert mode */
125: short rsb_xtype; /* first part of the key */
126: long rsb_xrkey; /* second part of the key */
127: } rsb_actual;
128: } rsb_key;
129: };
130:
131: # define rsb_grant_mode rsb_key.rsb_actual.rsb_xgrant_mode
132: # define rsb_convert_mode rsb_key.rsb_actual.rsb_xconvert_mode
133: # define rsb_depth rsb_key.rsb_actual.rsb_xdepth
134: # define rsb_type rsb_key.rsb_actual.rsb_xtype
135: # define rsb_rkey rsb_key.rsb_actual.rsb_xrkey
136:
137: /*
138: ** The User structure.
139: ** Contains information about processes that currently have the lock device open.
140: ** Used to store information that can't be put in the 'u' struct.
141: */
142:
143: typedef struct
144: {
145: short usr_pid; /* something to identify this process */
146: char usr_state; /* miscellaneous status info */
147: char usr_visited; /* noded visited marke for deadlock search */
148: LKB *usr_wait; /* lock that we are waiting on */
149: } USR;
150:
151: # define USR_NULLSTATE 00
152: # define USR_WAIT 01
153: # define USR_VISITED 01
154: # define USR_NOTVISITED 00
155:
156: /*
157: ** The Lock Block.
158: ** Contains information about a given processes lock request against a resource.
159: */
160:
161: struct _LKB
162: {
163: QUEUE lkb_next; /* next LBK of the same type */
164: LKB *lkb_parent; /* parent lock block */
165: RSB *lkb_rsb; /* associated resource block */
166: USR *lkb_usr; /* owning process */
167: unsigned char lkb_grant_mode; /* granted mode */
168: unsigned char lkb_request_mode; /* requested lock mode */
169: unsigned char lkb_state; /* current lock state */
170: unsigned char lkb_children; /* number of child locks */
171: };
172:
173: # define LKB_FREE 0
174: # define LKB_GRANT 1
175: # define LKB_CONVERT 2
176: # define LKB_WAIT 3
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.