// 
// Decompiled by Procyon v0.6.0
// 

package com.hypixel.hytale.server.worldgen.util;

import com.hypixel.hytale.server.worldgen.ChunkGeneratorResource;
import javax.annotation.Nonnull;
import com.hypixel.hytale.server.worldgen.chunk.ChunkGenerator;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.concurrent.ThreadFactory;

public class ChunkWorkerThreadFactory implements ThreadFactory
{
    private static final AtomicInteger FACTORY_COUNTER;
    private final ChunkGenerator chunkGenerator;
    private final String threadNameFormat;
    @Nonnull
    private final Integer factoryId;
    @Nonnull
    private final AtomicInteger threadCounter;
    
    public ChunkWorkerThreadFactory(final ChunkGenerator chunkGenerator, final String threadNameFormat) {
        this.chunkGenerator = chunkGenerator;
        this.threadNameFormat = threadNameFormat;
        this.factoryId = ChunkWorkerThreadFactory.FACTORY_COUNTER.incrementAndGet();
        this.threadCounter = new AtomicInteger();
    }
    
    @Nonnull
    @Override
    public Thread newThread(final Runnable r) {
        final Integer threadId = this.threadCounter.incrementAndGet();
        final String threadName = String.format(this.threadNameFormat, this.factoryId, threadId);
        final ChunkWorker workerThread = new ChunkWorker(r, threadName, this.chunkGenerator);
        workerThread.setDaemon(true);
        return workerThread;
    }
    
    @Nonnull
    @Override
    public String toString() {
        return "ChunkWorkerThreadFactory{chunkGenerator=" + String.valueOf(this.chunkGenerator) + ", threadNameFormat='" + this.threadNameFormat + "', factoryId=" + this.factoryId + ", threadCounter=" + String.valueOf(this.threadCounter);
    }
    
    static {
        FACTORY_COUNTER = new AtomicInteger();
    }
    
    protected static class ChunkWorker extends Thread
    {
        protected final ChunkGenerator chunkGenerator;
        
        protected ChunkWorker(final Runnable r, @Nonnull final String name, final ChunkGenerator chunkGenerator) {
            super(r, name);
            this.chunkGenerator = chunkGenerator;
        }
        
        @Override
        public void run() {
            final ChunkGeneratorResource resource = ChunkGenerator.getResource();
            resource.init(this.chunkGenerator);
            try {
                super.run();
            }
            finally {
                resource.release();
            }
        }
    }
}
