def parse(self, op, timeStamp): ''' Parse the inputdate from user. ''' self.detDeadlock() self.run() op = self.formalize(op) # print(op) if op.startswith('beginro'): transId = int(op[op.find('(') + 2:op.find(')')]) trans = Transaction(transId, timeStamp, readOnly=True) trans.makeVarsCopy(self.sites) self.curTrans[transId] = trans elif op.startswith('begin'): transId = int(op[op.find('(') + 2:op.find(')')]) trans = Transaction(transId, timeStamp) self.curTrans[transId] = trans elif op.startswith('recover'): siteId = int(op[op.find('(') + 1:op.find(')')]) site = self.sites[siteId] site.recover(self.sites) elif op.startswith('r'): args = op[op.find('(') + 1:op.find(')')].split(',') transId, varId = int(args[0][1:]), int(args[1][1:]) trans = self.curTrans[transId] if trans.readOnly: if trans.varsCopy[varId] is not None: print('x{}: {}'.format(varId, trans.varsCopy[varId])) else: print('T{} cannot read x{} at this time'.format( transId, varId)) else: if not trans.abort: trans.acquireReadLock(self.sites, varId) self.ops.append(['r', trans, varId]) elif op.startswith('w'): args = op[op.find('(') + 1:op.find(')')].split(',') transId, varId, value = int(args[0][1:]), int(args[1][1:]), int( args[2]) trans = self.curTrans[transId] if not trans.abort: trans.acquireWriteLock(self.sites, varId) self.ops.append(['w', trans, varId, value]) elif op.startswith('dump'): arg = op[op.find('(') + 1:op.find(')')] if arg == '': print(self.dumpAll()) elif arg.startswith('x'): varId = int(arg[1:]) print('\n'.join(self.dumpBySite(varId))) else: siteId = int(arg) print(self.sites[siteId].dump()) elif op.startswith('end'): transId = int(op[op.find('(') + 2:op.find(')')]) trans = self.curTrans[transId] if trans.abort: print('T{} aborts ({})'.format(transId, trans.reason)) else: log = trans.commit(self.sites) if log: print(log) print('T{} commits'.format(transId)) elif op.startswith('fail'): siteId = int(op[op.find('(') + 1:op.find(')')]) site = self.sites[siteId] abortSet = site.fail() for transId in abortSet: if transId in self.curTrans: self.curTrans[transId].setAbort(self.sites, self.ops, 'site down') # print('-----before------') # print(self.ops) # print('----------------') # print('input: {}, locks: {}'.format(op, self.sites[1].vars[2].locks.keys())) self.run()