/* * ewd123b.go * * A program to represent the second mutex strategy, as described in EWD123. * * Copyright (c) 2019-2019 HS Emden/Leer * All Rights Reserved. * * version 1.00 - 21 Oct 2019 - GJV - initial version * * author: Gert Veltink, gert.veltink@hs-emden-leer.de (GJV) */ package ewd123b import ( "../controller" "log" "time" ) // global synchronization variables var c1, c2 = 1, 1 // Start starts the execution of EWD123b. func Start() { go process1() go process2() /** */ } // process1 simulates the behaviour of the first process func process1() { L1: //wait till c2 = 0 (other process no longer inside critical section) if c2 == 0 { goto L1 } //if the other process inspects c1 at this moment both will enter the critical section //we can force this behaviour if we wait for a moment time.Sleep(100 * time.Millisecond) c1 = 0 controller.EnterCriticalSection(1) controller.InsideCriticalSection(1, 50) controller.LeaveCriticalSection(1) c1 = 1 controller.OutsideCriticalSection(1, 100) if controller.ProcessCrashed(0.1) { log.Println("Process 1 crashed") return } goto L1 } // process2 simulates the behaviour of the second process func process2() { L2: if c1 == 0 { goto L2 } c2 = 0 controller.EnterCriticalSection(2) controller.InsideCriticalSection(2, 50) controller.LeaveCriticalSection(2) c2 = 1 controller.OutsideCriticalSection(2, 100) if controller.ProcessCrashed(0.1) { log.Println("Process 2 crashed") return } goto L2 }