Пример #1
0
        public void ReportDone(IWorkerId workerId, IWorkId workId)
        {
            lock (this.Lock)
            {
                // This loop is not sound as we are not monotonic
                foreach (var p in this.WorkInProgress.GetValueOrEmpty(workId.SliceId).AssumeNotNull().Where(p => p.Key.Time < workId.Time).ToArray())
                {
                    if (this.CancelWork(p.Key, p.Value))
                    {
                        this.WorkInProgress.Remove(p.Key);
                    }
                }

                this.WorkInProgress.Remove(workId.SliceId, workId.SliceHash);
            }

            this.MarkAsComputed(workId.SliceId, workId.SliceHash);

            // Maybe not used, see if we can remove it
            if (this.OnWorkDone != null)
            {
                this.OnWorkDone(workerId, workId);
            }

            lock (this.Lock)
            {
                // If the queue is empty, let's trigger the event
                if (this.InternalIsEmpty())
                {
                    this.EmptyQueue.Set();
                }
            }
        }
Пример #2
0
        public bool TryPop(IWorkerId workerId, out IWorkId workId)
        {
            lock (this.Lock)
            {
                if (this.ToDo.Count == 0)
                {
                    workId = default(IWorkId);
                    return(false);
                }

                var workToDo = this.ToDo.Pop();
                Contract.Assume(workToDo != null);
                // Untested option
                if (this.optionB2)
                {
                    foreach (var p in this.WorkInProgress.GetValueOrEmpty(workToDo.SliceId).AssumeNotNull())
                    {
                        this.CancelWork(p.Key, p.Value);
                    }
                }

                // Untested option
                if (this.optionA2)
                {
                    this.WorkInProgress.Remove(workToDo.SliceId);
                }

                this.WorkInProgress.Add(workToDo, workerId);

                workId = workToDo;
                return(true);
            }
        }
Пример #3
0
    public virtual void ReportDone(IWorkerId workerId, IWorkId workId, int returnCode)
    {
      // TODO: what to do with errors? -- the time being we let OnWorkDone record them
      if (this.OnWorkDone != null)
      {
        this.OnWorkDone(workId.SliceId, returnCode);
      }

      this.queue.ReportDone(workerId, workId);
    }
Пример #4
0
        public virtual void ReportDone(IWorkerId workerId, IWorkId workId, int returnCode)
        {
            // TODO: what to do with errors? -- the time being we let OnWorkDone record them
            if (this.OnWorkDone != null)
            {
                this.OnWorkDone(workId.SliceId, returnCode);
            }

            this.queue.ReportDone(workerId, workId);
        }
Пример #5
0
            protected override FList <string> MakeArgs(IWorkId work)
            {
                var args = base.MakeArgs(work);

                if (this.db != null)
                {
                    args = args.Cons("-cache");
                }

                return(args);
            }
Пример #6
0
            protected virtual FList <string> MakeArgs(IWorkId work)
            {
                Contract.Requires(work != null);

                var args = this.baseArgs;

                args = args.Cons(work.SliceId.Dll);                     // the dll to analyze

                args = args.Cons("-sliceTime:" + work.Time.ToBinary()); // The sliceTime is the "universal" time -- to see: can we replace it with a job id?

                return(args);
            }
Пример #7
0
            protected override int Do(IWorkId work)
            {
                var args = this.MakeArgs(work).ToArray();

                var bufferedOutput = BufferedTextWriter.Create();

                try
                {
                    bufferedOutput.WriteLine("Analysis of dll: {0}", work.SliceId.Dll);

                    return(this.callClousotMain(args, bufferedOutput));
                }
                finally
                {
                    this.output.WriteLine(bufferedOutput.ToString());
                }
            }
Пример #8
0
            protected override int Do(IWorkId work)
            {
                var args = this.MakeArgs(work).ToArray();

                var bufferedOutput = BufferedTextWriter.Create();

                try
                {
                    var outputFactory = new FullTextWriterOutputFactory <Method, Assembly>(bufferedOutput);

                    this.output.WriteLine("[SlicerWorker: {0}] Analysis of dll (Time stamp {1}) {2}", DateTime.Now, work.Time, work.SliceId.Dll);

                    return(this.callClousotMain(args, outputFactory, this.db.AsEnumerable()));
                }
                finally
                {
                    this.output.WriteLine(bufferedOutput.ToString());
                }
            }
Пример #9
0
 protected override IEnumerable <ISliceId> SlicesToScheduleForReanalysis(IWorkId workId)
 {
     return(this.db.Dependences(workId.SliceId));
 }
Пример #10
0
        public override void ReportDone(IWorkerId workerId, IWorkId workId, int returnCode)
        {
            base.ReportDone(workerId, workId, returnCode);

            this.FeedQueue(this.SlicesToScheduleForReanalysis(workId));
        }
Пример #11
0
 protected virtual IEnumerable <ISliceId> SlicesToScheduleForReanalysis(IWorkId workId)
 {
     yield break;
 }
Пример #12
0
 public bool TryPop(IWorkerId workerId, out IWorkId workId)
 {
     return(this.queue.TryPop(workerId, out workId));
 }
Пример #13
0
 protected override IEnumerable <ISliceId> SlicesToScheduleForReanalysis(IWorkId workId)
 {
     return(base.SlicesToScheduleForReanalysis(workId).Union(this.db.SlicesForMethodsInTheSameType(workId.SliceId)).Distinct());
 }
Пример #14
0
 public bool Equals(IWorkId other)
 {
     return(other != null && this.sliceId.Equals(other.SliceId) && this.time.Equals(other.Time) && this.sliceHash.Equals(other.SliceHash));
 }
Пример #15
0
 private void OnWorkDone(IWorkId work, int returnCode)
 {
   this.scheduler.ReportDone(this.id, work, returnCode);
 }
Пример #16
0
 protected abstract int Do(IWorkId work);
Пример #17
0
 private bool TryGetWorkToDo(out IWorkId workId)
 {
     return(this.scheduler.TryPop(this.id, out workId));
 }
Пример #18
0
 public bool TryPop(IWorkerId workerId, out IWorkId workId)
 {
   return this.queue.TryPop(workerId, out workId);
 }
Пример #19
0
 protected override IEnumerable<ISliceId> SlicesToScheduleForReanalysis(IWorkId workId)
 {
   return base.SlicesToScheduleForReanalysis(workId).Union(this.db.SlicesForMethodsInTheSameType(workId.SliceId)).Distinct();
 }
Пример #20
0
 private void OnWorkDone(IWorkId work, int returnCode)
 {
     this.scheduler.ReportDone(this.id, work, returnCode);
 }
Пример #21
0
 protected virtual IEnumerable<ISliceId> SlicesToScheduleForReanalysis(IWorkId workId)
 {
   yield break;
 }
Пример #22
0
 private bool TryGetWorkToDo(out IWorkId workId)
 {
   return this.scheduler.TryPop(this.id, out workId);
 }
Пример #23
0
    public override void ReportDone(IWorkerId workerId, IWorkId workId, int returnCode)
    {
      base.ReportDone(workerId, workId, returnCode);

      this.FeedQueue(this.SlicesToScheduleForReanalysis(workId));
    }
Пример #24
0
 protected abstract int Do(IWorkId work);
Пример #25
0
 protected override IEnumerable<ISliceId> SlicesToScheduleForReanalysis(IWorkId workId)
 {
   return this.db.Dependences(workId.SliceId);
 }