<> <> <> <> <> <> <> <> <> <> <> <> DIRECTORY Basics, ConstArith, YggAccessControl, YggEnvironment, YggIdentity, YggImport, YggInternal, YggTransaction, YggTransMgr, BasicTime, YggClientMap USING [GetName], YggConversationTable, ConvertUnsafe, YggFileControl, YggFilePageMgr, YggLock, YggLockControl, YggLog, YggLogControl, YggLogInline, YggDummyProcess, Rope, YggDummyRPC, YggMonitoringHooks USING [ShouldAbort], YggMonitoringLog USING [LockConflictInfo, notice, TransactionAbortInfo], YggTransactionMap, YggWorker, YggWorkerControl, YggWorkerInternal, VM; YggWorkerImpl: CEDAR MONITOR LOCKS self USING self: Handle IMPORTS ConstArith, YggAccessControl, YggIdentity, YggImport, YggTransaction, BasicTime, YggClientMap, YggConversationTable, ConvertUnsafe, YggFileControl, YggFilePageMgr, YggLock, YggLockControl, YggLog, YggLogControl, YggLogInline, YggDummyProcess, Rope, YggDummyRPC, YggMonitoringLog, YggTransactionMap, YggWorkerInternal, VM EXPORTS YggTransaction, YggTransMgr, YggInternal, YggMonitoringHooks, YggTransactionMap, YggWorkerControl, YggWorkerInternal = BEGIN Conversation: TYPE = YggEnvironment.Conversation; TransID: TYPE = YggEnvironment.TransID; nullTransID: TransID = YggEnvironment.nullTransID; FileStore: TYPE = YggEnvironment.FileStore; RecordID: TYPE = YggLog.RecordID; RecordType: TYPE = YggLog.RecordType; InternalProgrammingError: ERROR = CODE; Handle: TYPE = YggWorker.Handle; nullHandle: Handle = YggWorker.nullHandle; TransObject: PUBLIC TYPE = YggWorker.Object; <> Refused: PUBLIC ERROR [why: YggTransMgr.Refusal] = CODE; <> disableLocalCoordinatorOptimization: BOOL _ FALSE; <> shortWaitOver: CONDITION; <> <> densityFactor: INT _ 64; <> longTimeSinceLastStartWork: INT _ 1000; -- seconds (about 15 minutes) <> logWordsUsableByClient: ConstArith.Const; <> maxLogWordsForFastRestart: ConstArith.Const -- = ConstArith.FromInt[3000*VM.wordsPerPage] -- ; <> maxLogWordsForWorker: ConstArith.Const; <> <> CreateWorker: PUBLIC PROC [ conversation: Conversation, transID: TransID, coordinator: FileStore] = { <> <> <> <> self: Handle; alreadyRegistered: BOOL _ FALSE; registerWorkerResult: YggTransMgr.RegisterWorkerResult; alpineTransMgr: REF _ NIL; <> conversationOut: Conversation; IF YggTransactionMap.GetTransHandle[transID] # nullHandle THEN alreadyRegistered _ TRUE ELSE self _ ConsWorker[transID, YggImport.Register[coordinator]]; IF alreadyRegistered OR YggTransactionMap.Register[self].alreadyRegistered THEN { <> self _ YggTransactionMap.GetTransHandle[transID]; IF self = nullHandle OR WaitUntilNotUnknown[self].workerNotActive THEN ERROR YggTransaction.Unknown[transID]; } ELSE { <> <> conversationOut _ YggConversationTable.Fetch[self.coordinator]; <> IF conversationOut = NIL OR alpineTransMgr = NIL THEN GOTO noCoordinator; <> < CHECKED { whyCallFailed _ why; GOTO callFailed } ];>> EndCreateWorker[self, IF registerWorkerResult = ok THEN create ELSE abort]; EXITS noCoordinator => { EndCreateWorker[self, abort]; ERROR YggTransaction.Unknown[coordinator] }; < {>> <> <