|  |  | @ -76,7 +76,7 @@ func (ext *LockableExt) HandleErrorSignal(ctx *Context, node *Node, source NodeI | 
			
		
	
		
		
			
				
					
					|  |  |  |   if info_found { |  |  |  |   if info_found { | 
			
		
	
		
		
			
				
					
					|  |  |  |     state, found := ext.Requirements[info.Destination] |  |  |  |     state, found := ext.Requirements[info.Destination] | 
			
		
	
		
		
			
				
					
					|  |  |  |     if found == true { |  |  |  |     if found == true { | 
			
		
	
		
		
			
				
					
					|  |  |  |       changes.Add("wait_infos") |  |  |  |       changes = append(changes, "wait_infos") | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  |       ctx.Log.Logf("lockable", "got mapped response %+v for %+v in state %s while in %s", signal, info, ReqStateStrings[state], ReqStateStrings[ext.State]) |  |  |  |       ctx.Log.Logf("lockable", "got mapped response %+v for %+v in state %s while in %s", signal, info, ReqStateStrings[state], ReqStateStrings[ext.State]) | 
			
		
	
		
		
			
				
					
					|  |  |  |       switch ext.State { |  |  |  |       switch ext.State { | 
			
		
	
		
		
			
				
					
					|  |  |  |       case AbortingLock: |  |  |  |       case AbortingLock: | 
			
		
	
	
		
		
			
				
					|  |  | @ -89,11 +89,11 @@ func (ext *LockableExt) HandleErrorSignal(ctx *Context, node *Node, source NodeI | 
			
		
	
		
		
			
				
					
					|  |  |  |           } |  |  |  |           } | 
			
		
	
		
		
			
				
					
					|  |  |  |         } |  |  |  |         } | 
			
		
	
		
		
			
				
					
					|  |  |  |         if all_unlocked == true { |  |  |  |         if all_unlocked == true { | 
			
		
	
		
		
			
				
					
					|  |  |  |           changes.Add("state") |  |  |  |           changes = append(changes, "state") | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  |           ext.State = Unlocked |  |  |  |           ext.State = Unlocked | 
			
		
	
		
		
			
				
					
					|  |  |  |         } |  |  |  |         } | 
			
		
	
		
		
			
				
					
					|  |  |  |       case Locking: |  |  |  |       case Locking: | 
			
		
	
		
		
			
				
					
					|  |  |  |         changes.Add("state") |  |  |  |         changes = append(changes, "state") | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  |         ext.Requirements[info.Destination] = Unlocked |  |  |  |         ext.Requirements[info.Destination] = Unlocked | 
			
		
	
		
		
			
				
					
					|  |  |  |         unlocked := 0 |  |  |  |         unlocked := 0 | 
			
		
	
		
		
			
				
					
					|  |  |  |         for _, state := range(ext.Requirements) { |  |  |  |         for _, state := range(ext.Requirements) { | 
			
		
	
	
		
		
			
				
					|  |  | @ -153,7 +153,7 @@ func (ext *LockableExt) HandleLinkSignal(ctx *Context, node *Node, source NodeID | 
			
		
	
		
		
			
				
					
					|  |  |  |           ext.Requirements = map[NodeID]ReqState{} |  |  |  |           ext.Requirements = map[NodeID]ReqState{} | 
			
		
	
		
		
			
				
					
					|  |  |  |         } |  |  |  |         } | 
			
		
	
		
		
			
				
					
					|  |  |  |         ext.Requirements[signal.NodeID] = Unlocked |  |  |  |         ext.Requirements[signal.NodeID] = Unlocked | 
			
		
	
		
		
			
				
					
					|  |  |  |         changes.Add("requirements") |  |  |  |         changes = append(changes, "requirements") | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  |         messages = append(messages, SendMsg{source, NewSuccessSignal(signal.ID())}) |  |  |  |         messages = append(messages, SendMsg{source, NewSuccessSignal(signal.ID())}) | 
			
		
	
		
		
			
				
					
					|  |  |  |       } |  |  |  |       } | 
			
		
	
		
		
			
				
					
					|  |  |  |     case "remove": |  |  |  |     case "remove": | 
			
		
	
	
		
		
			
				
					|  |  | @ -162,7 +162,7 @@ func (ext *LockableExt) HandleLinkSignal(ctx *Context, node *Node, source NodeID | 
			
		
	
		
		
			
				
					
					|  |  |  |         messages = append(messages, SendMsg{source, NewErrorSignal(signal.ID(), "can't link: not_requirement")}) |  |  |  |         messages = append(messages, SendMsg{source, NewErrorSignal(signal.ID(), "can't link: not_requirement")}) | 
			
		
	
		
		
			
				
					
					|  |  |  |       } else { |  |  |  |       } else { | 
			
		
	
		
		
			
				
					
					|  |  |  |         delete(ext.Requirements, signal.NodeID) |  |  |  |         delete(ext.Requirements, signal.NodeID) | 
			
		
	
		
		
			
				
					
					|  |  |  |         changes.Add("requirements") |  |  |  |         changes = append(changes, "requirements") | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  |         messages = append(messages, SendMsg{source, NewSuccessSignal(signal.ID())}) |  |  |  |         messages = append(messages, SendMsg{source, NewSuccessSignal(signal.ID())}) | 
			
		
	
		
		
			
				
					
					|  |  |  |       } |  |  |  |       } | 
			
		
	
		
		
			
				
					
					|  |  |  |     default: |  |  |  |     default: | 
			
		
	
	
		
		
			
				
					|  |  | @ -203,10 +203,10 @@ func (ext *LockableExt) HandleSuccessSignal(ctx *Context, node *Node, source Nod | 
			
		
	
		
		
			
				
					
					|  |  |  |             ctx.Log.Logf("lockable", "WHOLE LOCK: %s - %s - %+v", node.ID, ext.PendingID, ext.PendingOwner) |  |  |  |             ctx.Log.Logf("lockable", "WHOLE LOCK: %s - %s - %+v", node.ID, ext.PendingID, ext.PendingOwner) | 
			
		
	
		
		
			
				
					
					|  |  |  |             ext.State = Locked |  |  |  |             ext.State = Locked | 
			
		
	
		
		
			
				
					
					|  |  |  |             ext.Owner = ext.PendingOwner |  |  |  |             ext.Owner = ext.PendingOwner | 
			
		
	
		
		
			
				
					
					|  |  |  |             changes.Add("state", "owner", "requirements") |  |  |  |             changes = append(changes, "state", "owner", "requirements") | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  |             messages = append(messages, SendMsg{*ext.Owner, NewSuccessSignal(ext.PendingID)}) |  |  |  |             messages = append(messages, SendMsg{*ext.Owner, NewSuccessSignal(ext.PendingID)}) | 
			
		
	
		
		
			
				
					
					|  |  |  |           } else { |  |  |  |           } else { | 
			
		
	
		
		
			
				
					
					|  |  |  |             changes.Add("requirements") |  |  |  |             changes = append(changes, "requirements") | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  |             ctx.Log.Logf("lockable", "PARTIAL LOCK: %s - %d/%d", node.ID, locked, len(ext.Requirements)) |  |  |  |             ctx.Log.Logf("lockable", "PARTIAL LOCK: %s - %d/%d", node.ID, locked, len(ext.Requirements)) | 
			
		
	
		
		
			
				
					
					|  |  |  |           } |  |  |  |           } | 
			
		
	
		
		
			
				
					
					|  |  |  |         case AbortingLock: |  |  |  |         case AbortingLock: | 
			
		
	
	
		
		
			
				
					|  |  | @ -239,15 +239,15 @@ func (ext *LockableExt) HandleSuccessSignal(ctx *Context, node *Node, source Nod | 
			
		
	
		
		
			
				
					
					|  |  |  |             previous_owner := *ext.Owner |  |  |  |             previous_owner := *ext.Owner | 
			
		
	
		
		
			
				
					
					|  |  |  |             ext.Owner = ext.PendingOwner |  |  |  |             ext.Owner = ext.PendingOwner | 
			
		
	
		
		
			
				
					
					|  |  |  |             ext.ReqID = nil |  |  |  |             ext.ReqID = nil | 
			
		
	
		
		
			
				
					
					|  |  |  |             changes.Add("state", "owner", "req_id") |  |  |  |             changes = append(changes, "state", "owner", "req_id") | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  |             messages = append(messages, SendMsg{previous_owner, NewSuccessSignal(ext.PendingID)}) |  |  |  |             messages = append(messages, SendMsg{previous_owner, NewSuccessSignal(ext.PendingID)}) | 
			
		
	
		
		
			
				
					
					|  |  |  |           } else if old_state == AbortingLock { |  |  |  |           } else if old_state == AbortingLock { | 
			
		
	
		
		
			
				
					
					|  |  |  |             changes.Add("state", "pending_owner") |  |  |  |             changes = append(changes, "state", "pending_owner") | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  |             messages = append(messages, SendMsg{*ext.PendingOwner, NewErrorSignal(*ext.ReqID, "not_unlocked")}) |  |  |  |             messages = append(messages, SendMsg{*ext.PendingOwner, NewErrorSignal(*ext.ReqID, "not_unlocked")}) | 
			
		
	
		
		
			
				
					
					|  |  |  |             ext.PendingOwner = ext.Owner |  |  |  |             ext.PendingOwner = ext.Owner | 
			
		
	
		
		
			
				
					
					|  |  |  |           } |  |  |  |           } | 
			
		
	
		
		
			
				
					
					|  |  |  |         } else { |  |  |  |         } else { | 
			
		
	
		
		
			
				
					
					|  |  |  |           changes.Add("state") |  |  |  |           changes = append(changes, "state") | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  |           ctx.Log.Logf("lockable", "PARTIAL UNLOCK: %s - %d/%d", node.ID, unlocked, len(ext.Requirements)) |  |  |  |           ctx.Log.Logf("lockable", "PARTIAL UNLOCK: %s - %d/%d", node.ID, unlocked, len(ext.Requirements)) | 
			
		
	
		
		
			
				
					
					|  |  |  |         } |  |  |  |         } | 
			
		
	
		
		
			
				
					
					|  |  |  |       } |  |  |  |       } | 
			
		
	
	
		
		
			
				
					|  |  | @ -271,7 +271,7 @@ func (ext *LockableExt) HandleLockSignal(ctx *Context, node *Node, source NodeID | 
			
		
	
		
		
			
				
					
					|  |  |  |         new_owner := source |  |  |  |         new_owner := source | 
			
		
	
		
		
			
				
					
					|  |  |  |         ext.PendingOwner = &new_owner |  |  |  |         ext.PendingOwner = &new_owner | 
			
		
	
		
		
			
				
					
					|  |  |  |         ext.Owner = &new_owner |  |  |  |         ext.Owner = &new_owner | 
			
		
	
		
		
			
				
					
					|  |  |  |         changes.Add("state", "pending_owner", "owner") |  |  |  |         changes = append(changes, "state", "pending_owner", "owner") | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  |         messages = append(messages, SendMsg{new_owner, NewSuccessSignal(signal.ID())}) |  |  |  |         messages = append(messages, SendMsg{new_owner, NewSuccessSignal(signal.ID())}) | 
			
		
	
		
		
			
				
					
					|  |  |  |       } else { |  |  |  |       } else { | 
			
		
	
		
		
			
				
					
					|  |  |  |         ext.State = Locking |  |  |  |         ext.State = Locking | 
			
		
	
	
		
		
			
				
					|  |  | @ -280,7 +280,7 @@ func (ext *LockableExt) HandleLockSignal(ctx *Context, node *Node, source NodeID | 
			
		
	
		
		
			
				
					
					|  |  |  |         new_owner := source |  |  |  |         new_owner := source | 
			
		
	
		
		
			
				
					
					|  |  |  |         ext.PendingOwner = &new_owner |  |  |  |         ext.PendingOwner = &new_owner | 
			
		
	
		
		
			
				
					
					|  |  |  |         ext.PendingID = signal.ID() |  |  |  |         ext.PendingID = signal.ID() | 
			
		
	
		
		
			
				
					
					|  |  |  |         changes.Add("state", "req_id", "pending_owner", "pending_id") |  |  |  |         changes = append(changes, "state", "req_id", "pending_owner", "pending_id") | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  |         for id, state := range(ext.Requirements) { |  |  |  |         for id, state := range(ext.Requirements) { | 
			
		
	
		
		
			
				
					
					|  |  |  |           if state != Unlocked { |  |  |  |           if state != Unlocked { | 
			
		
	
		
		
			
				
					
					|  |  |  |             ctx.Log.Logf("lockable", "REQ_NOT_UNLOCKED_WHEN_LOCKING") |  |  |  |             ctx.Log.Logf("lockable", "REQ_NOT_UNLOCKED_WHEN_LOCKING") | 
			
		
	
	
		
		
			
				
					|  |  | @ -304,7 +304,7 @@ func (ext *LockableExt) HandleLockSignal(ctx *Context, node *Node, source NodeID | 
			
		
	
		
		
			
				
					
					|  |  |  |         new_owner := source |  |  |  |         new_owner := source | 
			
		
	
		
		
			
				
					
					|  |  |  |         ext.PendingOwner = nil |  |  |  |         ext.PendingOwner = nil | 
			
		
	
		
		
			
				
					
					|  |  |  |         ext.Owner = nil |  |  |  |         ext.Owner = nil | 
			
		
	
		
		
			
				
					
					|  |  |  |         changes.Add("state", "pending_owner", "owner") |  |  |  |         changes = append(changes, "state", "pending_owner", "owner") | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  |         messages = append(messages, SendMsg{new_owner, NewSuccessSignal(signal.ID())}) |  |  |  |         messages = append(messages, SendMsg{new_owner, NewSuccessSignal(signal.ID())}) | 
			
		
	
		
		
			
				
					
					|  |  |  |       } else if source == *ext.Owner { |  |  |  |       } else if source == *ext.Owner { | 
			
		
	
		
		
			
				
					
					|  |  |  |         ext.State = Unlocking |  |  |  |         ext.State = Unlocking | 
			
		
	
	
		
		
			
				
					|  |  | @ -312,7 +312,7 @@ func (ext *LockableExt) HandleLockSignal(ctx *Context, node *Node, source NodeID | 
			
		
	
		
		
			
				
					
					|  |  |  |         ext.ReqID = &id |  |  |  |         ext.ReqID = &id | 
			
		
	
		
		
			
				
					
					|  |  |  |         ext.PendingOwner = nil |  |  |  |         ext.PendingOwner = nil | 
			
		
	
		
		
			
				
					
					|  |  |  |         ext.PendingID = signal.ID() |  |  |  |         ext.PendingID = signal.ID() | 
			
		
	
		
		
			
				
					
					|  |  |  |         changes.Add("state", "pending_owner", "pending_id", "req_id") |  |  |  |         changes = append(changes, "state", "pending_owner", "pending_id", "req_id") | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  |         for id, state := range(ext.Requirements) { |  |  |  |         for id, state := range(ext.Requirements) { | 
			
		
	
		
		
			
				
					
					|  |  |  |           if state != Locked { |  |  |  |           if state != Locked { | 
			
		
	
		
		
			
				
					
					|  |  |  |             ctx.Log.Logf("lockable", "REQ_NOT_LOCKED_WHEN_UNLOCKING") |  |  |  |             ctx.Log.Logf("lockable", "REQ_NOT_LOCKED_WHEN_UNLOCKING") | 
			
		
	
	
		
		
			
				
					|  |  | @ -340,7 +340,7 @@ func (ext *LockableExt) HandleTimeoutSignal(ctx *Context, node *Node, source Nod | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |   wait_info, found := node.ProcessResponse(ext.WaitInfos, signal) |  |  |  |   wait_info, found := node.ProcessResponse(ext.WaitInfos, signal) | 
			
		
	
		
		
			
				
					
					|  |  |  |   if found == true { |  |  |  |   if found == true { | 
			
		
	
		
		
			
				
					
					|  |  |  |     changes.Add("wait_infos") |  |  |  |     changes = append(changes, "wait_infos") | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  |     state, found := ext.Requirements[wait_info.Destination] |  |  |  |     state, found := ext.Requirements[wait_info.Destination] | 
			
		
	
		
		
			
				
					
					|  |  |  |     if found == true { |  |  |  |     if found == true { | 
			
		
	
		
		
			
				
					
					|  |  |  |       ctx.Log.Logf("lockable", "%s timed out %s while %s was %s", wait_info.Destination, ReqStateStrings[state], node.ID, ReqStateStrings[state]) |  |  |  |       ctx.Log.Logf("lockable", "%s timed out %s while %s was %s", wait_info.Destination, ReqStateStrings[state], node.ID, ReqStateStrings[state]) | 
			
		
	
	
		
		
			
				
					|  |  | @ -355,7 +355,7 @@ func (ext *LockableExt) HandleTimeoutSignal(ctx *Context, node *Node, source Nod | 
			
		
	
		
		
			
				
					
					|  |  |  |           } |  |  |  |           } | 
			
		
	
		
		
			
				
					
					|  |  |  |         } |  |  |  |         } | 
			
		
	
		
		
			
				
					
					|  |  |  |         if all_unlocked == true { |  |  |  |         if all_unlocked == true { | 
			
		
	
		
		
			
				
					
					|  |  |  |           changes.Add("state") |  |  |  |           changes = append(changes, "state") | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  |           ext.State = Unlocked |  |  |  |           ext.State = Unlocked | 
			
		
	
		
		
			
				
					
					|  |  |  |         } |  |  |  |         } | 
			
		
	
		
		
			
				
					
					|  |  |  |       case Locking: |  |  |  |       case Locking: | 
			
		
	
	
		
		
			
				
					|  |  | 
 |