Exemplo n.º 1
0
        private void CollateParticipants(Dictionary <ParticipantId, AccessCounter> participants, out List <ParticipantId> writers, out List <KeyValuePair <ParticipantId, AccessCounter> > resources, out KeyValuePair <ParticipantId, AccessCounter>?manager)
        {
            writers   = null;
            resources = null;
            manager   = null;
            KeyValuePair <ParticipantId, AccessCounter>?priorityManager = null;

            foreach (KeyValuePair <ParticipantId, AccessCounter> participant in participants)
            {
                ParticipantId id = participant.Key;
                // priority manager
                if (id.IsPriorityManager())
                {
                    manager = priorityManager = (priorityManager == null)
                        ? participant
                        : throw new ArgumentOutOfRangeException(nameof(participants), "Only one priority transaction manager allowed in transaction");
                }
                // resource
                if (id.IsResource())
                {
                    if (resources == null)
                    {
                        resources = new List <KeyValuePair <ParticipantId, AccessCounter> >();
                    }
                    resources.Add(participant);
                    if (participant.Value.Writes > 0)
                    {
                        if (writers == null)
                        {
                            writers = new List <ParticipantId>();
                        }
                        writers.Add(id);
                    }
                }
                // manager
                if (manager == null && id.IsManager() && participant.Value.Writes > 0)
                {
                    manager = participant;
                }
            }
        }