void CleanData(MeshParams <WorldVertexDefinition> data) { data.ResetSize(); lock (m_freeDatasLock) { m_freeDatas.Add(data); } }
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; } } }