Annotation of cci/sys/h/iidr.h.3.0, revision 1.1.1.1

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: 
                     10: /*     The request codes to the lock device.           */
                     11: 
                     12: /* These are opcodes used by the lock driver when it is called as
                     13: ** a minor device.
                     14: */
                     15: # define       KN_O_LOCK       1
                     16: # define       KN_O_UNLOCK     2
                     17: # define       KN_O_CONVERT    3
                     18: # define       KN_O_RELEASE    4
                     19: # define       KN_O_UNIQ       5
                     20: # define       KN_O_DBCONSIST  6
                     21: 
                     22: /* These are codes used by the lock driver when it is called as
                     23: ** a major device.
                     24: */
                     25: # define       KN_O_USERSLOT           1
                     26: # define       KN_O_PRINT_STRUCTURES   2
                     27: # define       KN_O_DEBUGLEVEL         3
                     28: # define       KN_O_RESET_LOCKDRIVER   4
                     29: 
                     30: /*
                     31: ** Ioctl's have the command encoded in the lower word,
                     32: ** and the size of any in or out parameters in the upper
                     33: ** word.  The high 2 bits of the upper word are used
                     34: ** to encode the in/out status of the parameter; for now
                     35: ** we restrict parameters to at most 128 bytes.
                     36: **
                     37: ** For some reason bit 29 is always set.
                     38: **
                     39: ** The high two bits (31 and 30) mean:
                     40: **             00      (2)     - Void - no parameters
                     41: **             10      (a)     - In parameter
                     42: **             01      (6)     - Out parameter
                     43: **             11      (e)     - in/out parameter
                     44: */
                     45: 
                     46: /* Command qualification for OS, currently unused by INGRES */
                     47: # define       KN_QUAL         ('i' << 8)
                     48: 
                     49: /* bits to shift for parameter type */
                     50: # define       KN_P_TSHIFT     28
                     51: 
                     52: /* descriptions of parameters */
                     53: # define       KN_P_VOID       (0x2 << KN_P_TSHIFT)
                     54: # define       KN_P_OUT        (0x6 << KN_P_TSHIFT)
                     55: # define       KN_P_IN         (0xa << KN_P_TSHIFT)
                     56: # define       KN_P_INOUT      (0xe << KN_P_TSHIFT)
                     57: 
                     58: /* bits to shift parameter size */
                     59: # define       KN_P_SSHIFT     16
                     60: 
                     61: /* size of minor device parameters, in sizoef quantities  */
                     62: # define       KN_SZ_LOCK              (sizeof(LOCK_KEY) << KN_P_SSHIFT)
                     63: # define       KN_SZ_UNLOCK            (sizeof(short) << KN_P_SSHIFT)
                     64: # define       KN_SZ_CONVERT           (sizeof(short) << KN_P_SSHIFT)
                     65: # define       KN_SZ_RELEASE           0
                     66: # define       KN_SZ_UNIQ              (2 * sizeof(int) << KN_P_SSHIFT)
                     67: # define       KN_SZ_DBCONSIST         (sizeof(int) << KN_P_SSHIFT)
                     68: 
                     69: /* size of major device parameters, in sizeof() quantities */
                     70: # define       KN_SZ_USERSLOT          (sizeof(int) << KN_P_SSHIFT)
                     71: # define       KN_SZ_PRINT_STRUCTURES  (sizeof(int) << KN_P_SSHIFT)
                     72: # define       KN_SZ_DEBUGLEVEL        (sizeof(int) << KN_P_SSHIFT)
                     73: # define       KN_SZ_RESET_LOCKDRIVER  0
                     74: 
                     75: # define       KN_R_LOCK               (KN_QUAL | KN_P_IN   | KN_O_LOCK      | KN_SZ_LOCK)
                     76: # define       KN_R_UNLOCK             (KN_QUAL | KN_P_IN   | KN_O_UNLOCK    | KN_SZ_UNLOCK)
                     77: # define       KN_R_CONVERT            (KN_QUAL | KN_P_IN   | KN_O_CONVERT   | KN_SZ_CONVERT)
                     78: # define       KN_R_RELEASE            (KN_QUAL | KN_P_VOID | KN_O_RELEASE   | KN_SZ_RELEASE)
                     79: # define       KN_R_UNIQ               (KN_QUAL | KN_P_OUT  | KN_O_UNIQ      | KN_SZ_UNIQ)
                     80: # define       KN_R_DBCONSIST          (KN_QUAL | KN_P_IN   | KN_O_DBCONSIST | KN_SZ_DBCONSIST)
                     81: 
                     82: /* These are opcodes to be used when connected to the major device */
                     83: # define       KN_R_USERSLOT           (KN_QUAL | KN_P_OUT  | KN_SZ_USERSLOT         | KN_O_USERSLOT)
                     84: # define       KN_R_PRINT_STRUCTURES   (KN_QUAL | KN_P_IN   | KN_SZ_PRINT_STRUCTURES | KN_O_PRINT_STRUCTURES)
                     85: # define       KN_R_DEBUGLEVEL         (KN_QUAL | KN_P_IN   | KN_SZ_DEBUGLEVEL       | KN_O_DEBUGLEVEL)
                     86: # define       KN_R_RESET_LOCKDRIVER   (KN_QUAL | KN_P_VOID | KN_SZ_RESET_LOCKDRIVER | KN_O_RESET_LOCKDRIVER)
                     87: 
                     88: /*
                     89: ** These are the parameters to be passed in "addr" on a
                     90: ** KN_R_PRINT_STRUCTURES call.
                     91: */
                     92: # define       KN_P_USERS      1
                     93: # define       KN_P_LKB        2
                     94: # define       KN_P_HASH       3
                     95: # define       KN_P_STAT       4
                     96: # define       KN_P_RSB        5
                     97: 
                     98: /*     The lock modes that the device supports          */
                     99: 
                    100: # define       KN_M_NL         0
                    101: # define       KN_M_CR         1
                    102: # define       KN_M_CW         2
                    103: # define       KN_M_PR         3
                    104: # define       KN_M_PW         4
                    105: # define       KN_M_EX         5
                    106: 
                    107: /*     Possible extra return values from the lock device       */
                    108: 
                    109: # define       EDEADLOCK       60
                    110: # define       ECHILDREN       61
                    111: # define       ELOCKID         62
                    112: # define       ENOTQUEUED      63
                    113: # define       ERESOURCE       64
                    114: # define       EBUG            65
                    115: # define       ECONSIST        66 /* Couldn't grant lock - data base has gone
                    116:                                   ** inconsistent
                    117:                                   */
                    118: # define       EFLAG_SAME      67 /* Call to KN_R_CONSIST resulted in state
                    119:                                   ** remaining the same.
                    120:                                   */
                    121: # define       ELOCKMODE_INVALID       68
                    122: # define       EOPCODE_INVALID         69
                    123: # define       EWAIT_INTR              70
                    124: # define       EPANIC                  71      /* lock driver is in a panic
                    125:                                                ** state. Rather than crashing
                    126:                                                ** the machine, disallow all
                    127:                                                ** ioctl requests by minor de-
                    128:                                                ** vices.
                    129:                                                */
                    130: 
                    131: /* Types of locks that the lock driver knows about */
                    132: # define       LCK_DATABASE    0x4949          /* 'II' */
                    133: 
                    134: /*     The structure used by the user to pass lock key information to the lock device. */
                    135: 
                    136: typedef struct
                    137: {
                    138:        short           lk_parent;              /*      parentid when setting a lock    */
                    139:        unsigned short  lk_type;                /*      the type of lock                */
                    140:        long            lk_key;                 /*      the key when setting a lock     */
                    141:        short           lk_installation;        /*      installation constant   */
                    142: }      LOCK_KEY;
                    143: 
                    144: /*     Collect performance numbers about the lock device in this structure.    */
                    145: 
                    146: typedef struct
                    147: {
                    148:        long    ii_locks;               /*      number of lock requests                 */
                    149:        long    ii_unlocks;             /*      number of unlocks requests              */
                    150:        long    ii_converts;            /*      number of conversion requests           */
                    151:        long    ii_lockwaits;           /*      number of lock requests that waited     */
                    152:        long    ii_waitconverts;        /*      number of convert requests that waited  */
                    153:        long    ii_deadconverts;        /*      number of conversion deadlocks          */
                    154:        long    ii_deadsearchs;         /*      number of deadlock searches performed   */
                    155:        long    ii_deadlocks;           /*      number of resource deadlocks found      */
                    156: }      STAT;
                    157: 
                    158: /*
                    159: ** CMD
                    160: **
                    161: **     This structure really wants to be a bitfield, but this format
                    162: **     does not work on different architectures.  On machines with
                    163: **     BYTE_SWAP the structure needs to defined differently than on
                    164: **     a VAX.
                    165: **
                    166: **     Finally on the Pyramid BITFIELDS are not pushed and popped as
                    167: **     if they were ints.  Since ioctl expects the cmd argument to be
                    168: **     an int we must define CMD as an int and use bit-masking, and
                    169: **     shifting to get the values out.
                    170: **
                    171: **     The format of a request code to the lock device.
                    172: **
                    173: **         typedef struct
                    174: **         {
                    175: **             unsigned cmd_opcode:3;          ** function code
                    176: **
                    177: **             unsigned cmd_lock_mode:3;       ** lock mode
                    178: **
                    179: **             unsigned cmd_no_queue:1;        **  don't wait modifier
                    180: **
                    181: **             unsigned cmd_ignore_econsist:1; ** modifier tells lock driver
                    182: **                                             ** to ignore the fact that the
                    183: **                                             ** data base may be
                    184: **                                             ** inconsistent
                    185: **                                             **
                    186: **         }   CMD;
                    187: **
                    188: **
                    189: **     bits of the command:
                    190: **                     bits 0-2: opcode.
                    191: **                     bits 3-5: lock_mode.
                    192: **                     bit  6  : wait/nowait modifier
                    193: **                     bit  7  : ignore consistent database modifyer
                    194: **                     bits 8-15: qualifier to operating system.
                    195: **                                this is usually a single character.
                    196: **                                we use 'i', which is not used currently
                    197: **                                for anything.
                    198: **                     bits 16-23:size of the parameter being passed through
                    199: **                                "addr" the third argument of the ioctl call.
                    200: **                     bits 24-28: ?
                    201: **                     bits 29-31: used to encode whether the parameter is
                    202: **                                 in, out, in/out, or not used. (see above
                    203: **                                 for description.)
                    204: */
                    205: # define CMD_OPCODE(cmd)               (0x00000007 & (cmd))
                    206: # define CMD_LOCK_MODE(cmd)            (0x00000007 & ((cmd) >> 3))
                    207: # define CMD_NO_QUEUE(cmd)             (0x00000001 & ((cmd) >> 6))
                    208: # define CMD_IGNORE_ECONSIST(cmd)      (0x00000001 & ((cmd) >> 7))
                    209: 
                    210: 
                    211: # ifndef       QUE_DEF
                    212: # define       QUE_DEF 1
                    213: typedef struct _QUEUE  QUEUE;
                    214: 
                    215: struct _QUEUE
                    216: {
                    217:        QUEUE   *q_next;
                    218:        QUEUE   *q_prev;
                    219: };
                    220: 
                    221: # endif                QUE_DEF
                    222: 
                    223: QUEUE  *remque();
                    224: QUEUE  *insque();
                    225: 
                    226: typedef struct _LKB LKB;
                    227: typedef struct _RSB RSB;
                    228: 
                    229: /*
                    230: **     A Resource Block.
                    231: **             An RSB is allocated for each unique key that is locked.
                    232: **             It contains information about that states of locks queued against this resource.
                    233: */
                    234: 
                    235: struct _RSB
                    236: {
                    237:        QUEUE           rsb_next;                       /*      next of hash chain                                      */
                    238:        QUEUE           rsb_wait_lkb;                   /*      queue of waiting locks                                  */
                    239:        QUEUE           rsb_grant_lkb;                  /*      queue of granted locks followed by conversion requests  */
                    240:        RSB             *rsb_parent;                    /*      parent resource                                         */
                    241:        LKB             *rsb_deadlock_next;             /*      used to save next on recursion in deadlock tree         */
                    242:        LKB             *rsb_deadlock_curr;             /*      used to save curr on recursion in deadlock tree         */
                    243:        int             rsb_pad;                        /*      for future use                                          */
                    244:        union
                    245:        {
                    246:                LOCK_KEY        rsb_lk;                 /*      used to save lock from user     */
                    247:                struct
                    248:                {
                    249:                        unsigned char   rsb_xgrant_mode;        /*      granted mode of locked          */
                    250:                        unsigned char   rsb_xconvert_mode;      /*      effective convert mode          */
                    251:                        short           rsb_xtype;              /*      first part of the key           */
                    252:                        long            rsb_xrkey;              /*      second part of the key          */
                    253:                        short           rsb_xrinstallation;     /*      installation key                */
                    254:                }               rsb_actual;
                    255:        }               rsb_key;
                    256: };
                    257: 
                    258: # define       rsb_grant_mode          rsb_key.rsb_actual.rsb_xgrant_mode
                    259: # define       rsb_convert_mode        rsb_key.rsb_actual.rsb_xconvert_mode
                    260: # define       rsb_depth               rsb_key.rsb_actual.rsb_xdepth
                    261: # define       rsb_type                rsb_key.rsb_actual.rsb_xtype
                    262: # define       rsb_rkey                rsb_key.rsb_actual.rsb_xrkey
                    263: # define       rsb_rinstallation       rsb_key.rsb_actual.rsb_xrinstallation
                    264: 
                    265: /*
                    266: **     The User structure.
                    267: **             Contains information about processes that currently have the lock device open.
                    268: **             Used to store information that can't be put in the 'u' struct.
                    269: */
                    270: 
                    271: typedef struct
                    272: {
                    273:        short           usr_minor_dev_number;   /* This will be the minor
                    274:                                                ** device number of the driver
                    275:                                                ** that the user is connected
                    276:                                                ** to.
                    277:                                                ** In the case of the major
                    278:                                                ** device this number will be
                    279:                                                ** 0.  This number will not
                    280:                                                ** be unique for users con-
                    281:                                                ** nected to the major device.
                    282:                                                ** All opcodes implemented for
                    283:                                                ** the major device should not
                    284:                                                ** need this number to be unique
                    285:                                                ** (ie. they should not need
                    286:                                                ** context saved between calls).
                    287:                                                */
                    288: 
                    289:        char            usr_state;              /* miscellaneous status info */
                    290: 
                    291:        char            usr_visited;            /* noded visited marked for
                    292:                                                ** deadlock search
                    293:                                                */
                    294: 
                    295:        char            usr_inconsistent_flag;  /* This is the flag twiddled by
                    296:                                                ** the user by using
                    297:                                                ** KN_R_CONSIST.  If this flag
                    298:                                                ** is set when the user exits
                    299:                                                ** then the database is
                    300:                                                ** inconsistent.
                    301:                                                */
                    302: 
                    303:        char            usr_db_inconsistent;    /* if this flag is set then the
                    304:                                                ** the database is inconsistent
                    305:                                                */
                    306: 
                    307:        char            usr_made_db_inconsistent; /* if this flag is set then
                    308:                                                  ** this user was the one that
                    309:                                                  ** made the db inconsistent.
                    310:                                                  */
                    311: 
                    312:        char            usr_not_used;           /* keep structure 16 byte
                    313:                                                ** alligned.
                    314:                                                */
                    315: 
                    316:        RSB             *usr_db_resource;       /* This is a pointer to the
                    317:                                                ** database lock held by the
                    318:                                                ** user.  This is the only case
                    319:                                                ** where the lockdriver "knows"
                    320:                                                ** about types of locks.
                    321:                                                */
                    322: 
                    323:        LKB             *usr_wait;              /* lock that we are waiting
                    324:                                                ** on
                    325:                                                */
                    326: 
                    327: }      USR;
                    328: 
                    329: # define       USR_NULLSTATE   00
                    330: # define       USR_WAIT        01
                    331: # define       USR_VISITED     01
                    332: # define       USR_NOTVISITED  00
                    333: 
                    334: /* used for usr_made_db_inconsistent */
                    335: # define       USR_USR_INCONSISTENT    01
                    336: 
                    337: /* used for usr_db_inconsistent */
                    338: # define       USR_DB_INCONSISTENT     01
                    339: 
                    340: /*
                    341: **     The Lock Block.
                    342: **             Contains information about a given processes lock request against a resource.
                    343: */
                    344: 
                    345: struct _LKB
                    346: {
                    347:        QUEUE           lkb_next;                       /*      next LBK of the same type       */
                    348:        LKB             *lkb_parent;                    /*      parent lock block               */
                    349:        RSB             *lkb_rsb;                       /*      associated resource block       */
                    350:        USR             *lkb_usr;                       /*      owning process                  */
                    351:        unsigned char   lkb_grant_mode;                 /*      granted mode                    */
                    352:        unsigned char   lkb_request_mode;               /*      requested lock mode             */
                    353:        unsigned char   lkb_state;                      /*      current lock state              */
                    354:        unsigned char   lkb_children;                   /*      number of child locks           */
                    355: };
                    356: 
                    357: # define       LKB_FREE                0
                    358: # define       LKB_GRANT               1
                    359: # define       LKB_CONVERT             2
                    360: # define       LKB_WAIT                3
                    361: # define       LKB_E_WAIT_ECONSIST     4       /* lock wait was aborted due to the db going inconsistent */
                    362: # define       LKB_E_CONVERT_ECONSIST  5       /* lock wait on a convert was aborted due to the db going
                    363:                                                ** inconsistent.
                    364:                                                */
                    365: 
                    366: /* The following macro is used because SV lock drivers set errno by
                    367: ** setting u.u_error, while 4.2 lock drivers do it by returning a value.
                    368: */
                    369: #define        BSD     1               /* Power6/32 is a bsd site      */
                    370: # ifdef        BSD
                    371: # define       SET_ERRNO(a)
                    372: # endif        BSD
                    373: 
                    374: # ifdef        WECO
                    375: # define       SET_ERRNO(a)    set_errno(a)
                    376: # endif        WECO
                    377: 
                    378: /* UPRINTF
                    379: **     On BSD systems uprintf prints to the user's terminal.  This feature
                    380: **     is not availiable to SV systems so we use printf instead.
                    381: */
                    382: # ifdef        BSD
                    383: # define       UPRINTF         uprintf
                    384: # endif        BSD
                    385: 
                    386: # ifdef        WECO
                    387: # define       UPRINTF         printf
                    388: # endif WECO

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.