static int lock_db(const char *dbpath, const char *dbflags) { struct tdb_context *tdb; int tdb_flags; /* No error checking since CTDB always passes sane values */ tdb_flags = strtol(dbflags, NULL, 0); tdb = tdb_open(dbpath, 0, tdb_flags, O_RDWR, 0600); if (tdb == NULL) { fprintf(stderr, "%s: Error opening database %s\n", progname, dbpath); return 1; } set_priority(); if (tdb_lockall(tdb) < 0) { fprintf(stderr, "%s: Error getting db lock (%s)\n", progname, tdb_errorstr(tdb)); return 1; } reset_priority(); return 0; }
/* * Processing if the wait task is released (For TA_INHERIT only) */ LOCAL void mtx_rel_wai( TCB *tcb ) { MTXCB *mtxcb; TCB *mtxtsk; mtxcb = get_mtxcb(tcb->wid); mtxtsk = mtxcb->mtxtsk; if ( mtxtsk->priority == tcb->priority ) { /* Since the highest priority of the lock wait task might become lower, adjust this priority */ reset_priority(mtxtsk); } }
/* * Processing if the priority of wait task changes */ LOCAL void mtx_chg_pri( TCB *tcb, INT oldpri ) { MTXCB *mtxcb; TCB *mtxtsk; mtxcb = get_mtxcb(tcb->wid); gcb_change_priority((GCB*)mtxcb, tcb); if ( (mtxcb->mtxatr & TA_CEILING) == TA_INHERIT ) { mtxtsk = mtxcb->mtxtsk; if ( mtxtsk->priority > tcb->priority ) { /* Since the highest priority of the lock wait task became higher, raise the lock get task priority higher */ change_task_priority(mtxtsk, tcb->priority); } else if ( mtxtsk->priority == oldpri ) { /* Since the highest priority of the lock wait task might become lower, adjust this priority */ reset_priority(mtxtsk); } } }
static int lock_record(const char *dbpath, const char *dbflags, const char *dbkey) { TDB_DATA key; struct tdb_context *tdb; int tdb_flags; /* No error checking since CTDB always passes sane values */ tdb_flags = strtol(dbflags, NULL, 0); /* Convert hex key to key */ if (strcmp(dbkey, "NULL") == 0) { key.dptr = NULL; key.dsize = 0; } else { key.dptr = hex_decode_talloc(NULL, dbkey, &key.dsize); } tdb = tdb_open(dbpath, 0, tdb_flags, O_RDWR, 0600); if (tdb == NULL) { fprintf(stderr, "%s: Error opening database %s\n", progname, dbpath); return 1; } set_priority(); if (tdb_chainlock(tdb, key) < 0) { fprintf(stderr, "%s: Error getting record lock (%s)\n", progname, tdb_errorstr(tdb)); return 1; } reset_priority(); return 0; }