Пример #1
0
 void CleanData(MeshParams <WorldVertexDefinition> data)
 {
     data.ResetSize();
     lock (m_freeDatasLock)
     {
         m_freeDatas.Add(data);
     }
 }
Пример #2
0
    void StartNextTask()
    {
        //create next task
        MeshParams <WorldVertexDefinition> data = null;

        lock (m_freeDatasLock)
        {
            if (m_freeDatas.Count > 0)
            {
                data = m_freeDatas[0];
                m_freeDatas.RemoveAt(0);
            }
        }
        if (data == null)
        {
            return;
        }

        int nextJobID = GetNearestJobIndex();

        lock (m_waitingJobsLock)
        {
            Job job = null;

            if (nextJobID >= 0)
            {
                job = m_waitingJobs[nextJobID];
                m_waitingJobs.RemoveAt(nextJobID);
            }

            if (job == null)
            {
                lock (m_freeDatasLock)
                {
                    m_freeDatas.Add(data);
                }
                return;
            }

            data.ResetSize();
            job.data = data;

            lock (m_doingJobStatusLock)
            {
                lock (m_doingJobLock)
                {
                    Debug.Assert(m_doingJob == null);
                    m_doingJob = job;
                    m_doingJobStatus.CloneJob(m_doingJob);
                }
            }
        }

        DoJob();

        //move task to ended task
        lock (m_doingJobLock)
        {
            lock (m_doingJobStatusLock)
            {
                m_doingJobStatus.working = false;
                m_doingJob.aborted       = m_doingJobStatus.aborted;
            }

            lock (m_endedJobsLock)
            {
                if (m_doingJob.aborted)
                {
                    CleanData(m_doingJob.data);
                }
                else
                {
                    m_endedJobs.Add(m_doingJob);
                }

                m_doingJob = null;
            }
        }
    }