# include "AA_liba.h" static int AA_2_TA; AAlock(d, rel, mod) register DESCXX *d; register char *rel; register int mod; { # ifdef AMX_TRACE AAtTfp(14, 0, # ifdef MSDOS "use\t\t`%.10s' (%d) mod %d\n", # else "use\t\t`%.14s' (%d) mod %d\n", # endif rel, d->xx_locks, mod); # endif errno = 0; if (!d) if (AA_NOLOCKS) return; if (AA_LOCKS) AAerror(107, "TA-begin"); if (mod < 0) { if (AA_2_TA) goto concur; mod = -mod; AA_2_TA++; } else if (!AA_2_TA) { concur: AAerror(107, "second TA"); } do AArel_lock(d, mod); while (d = d->xx_index); } static AArel_lock(d, mod) register DESCXX *d; register int mod; { # ifdef AMX_TRACE AAtTfp(31, 0, # ifdef MSDOS "lock\t\t`%.10s' (%d) mod %d\n", # else "lock\t\t`%.14s' (%d) mod %d\n", # endif d->xx_desc.reldum.relid, d->xx_locks, mod); # endif AA = errno = 0; if (d->xx_ta) AAerror(17, d->xx_desc.reldum.relid); if ((d->xx_excl = mod) == M_EXCL) { /* restore relation of descriptor d to read/write mode */ d->xx_desc.relopn = RELWOPEN(d->xx_desc.relfp); } if (AA_TA) { d->xx_ta = AA_TA->xx_ta; AA_TA->xx_ta = d; } else d->xx_ta = d; AA_TA = d->xx_ta; do { # ifdef AMX_TRACE AAtTfp(31, 1, # ifdef MSDOS ".... rtn (%d)\t`%.10s'\n", # else ".... rtn (%d)\t`%.14s'\n", # endif d->xx_excl, d->xx_desc.reldum.relid); # endif if (AAsetrll(A_RTN, d->xx_desc.reltid, d->xx_excl) < 0) { /* the lock request fails */ AAunlock(0); /* wait on problem lock */ # ifdef AMX_TRACE AAtTfp(31, 2, # ifdef MSDOS ".... slp (%d)\t`%.10s'\n", # else ".... slp (%d)\t`%.14s'\n", # endif d->xx_excl, d->xx_desc.reldum.relid); # endif if (AAsetrll(A_SLP, d->xx_desc.reltid, AA = d->xx_excl) < 0) AAerror(17, d->xx_desc.reldum.relid); AA_TA = d; } d->xx_locks++; } while ((d = d->xx_ta) != AA_TA); } AAunlock(really) register int really; { register DESCXX *next; register DESCXX *d; # ifdef AMX_TRACE AAtTfp(15, 0, "commit\t\t(%d)\n", really); # endif if (AA_NOLOCKS) return; if (!(next = AA_TA)) AAerror(107, "TA-end"); do { d = next; next = d->xx_ta; if (really) { d->xx_excl = 0; d->xx_ta = (DESCXX *) 0; AAnoclose(d); /* make believe relation is read only */ /* for concurrency that means, */ /* readed pages are not locked */ if (!bitset(S_CATALOG, d->xx_desc.reldum.relstat)) d->xx_desc.relopn = RELROPEN(d->xx_desc.relfp); } if ((AA = d->xx_locks) && AAunlrl(d->xx_desc.reltid) < 0) AAerror(18, d->xx_desc.reldum.relid); d->xx_locks = 0; } while (next != AA_TA); if (really) { AA_TA = (DESCXX *) 0; AA_2_TA = 0; AAdaemon = 0; } }