// Path: src/main/java/com/epickrram/workshop/perf/support/Threads.java
// public enum Threads
// {
//     THREADS;
// 
//     public Runnable runOnCpu(final Runnable task, final int... cpus)
//     {
//         return () -> {
//             setCurrentThreadAffinity(cpus);
//             task.run();
//         };
//     }
// 
//     public void setCurrentThreadAffinity(final int... cpus)
//     {
//         if (cpus.length == 0)
//         {
//             return;
//         }
//         if (cpus.length != 1)
//         {
//             throw new UnsupportedOperationException();
//         }
// 
//         ProcessBuilder builder = new ProcessBuilder("taskset", "-cp",
//           Integer.toString(cpus[0]), Integer.toString(getCurrentThreadId()));
// 
//         try
//         {
//             builder.start().waitFor();
//             System.out.println("Set affinity for thread " + Thread.currentThread().getName() + " to " + Arrays.toString(cpus));
//         }
//         catch (InterruptedException | IOException e)
//         {
//             e.printStackTrace();
//         }
//     }
// 
//     public int getCurrentThreadId()
//     {
//         try
//         {
//             final List<String> strings = Files.readAllLines(Paths.get("/proc/thread-self/status"));
//             return Integer.parseInt(strings.stream().filter(s -> s.startsWith("Pid:")).map(s -> {
//                 return s.split("\\s+")[1];
//             }).findAny().get());
// 
// //
// //            // TODO: if Java 9, then use ProcessHandle.
// //            final String pidPorpertyValue = System.getProperty("sun.java.launcher.pid");
// //
// //            if (null != pidPorpertyValue)
// //            {
// //                return Integer.parseInt(pidPorpertyValue);
// //            }
// //
// //            final String jvmName = ManagementFactory.getRuntimeMXBean().getName();
// //
// //            return Integer.parseInt(jvmName.split("@")[0]);
//         }
//         catch (final Throwable ex)
//         {
//             return -1;
//         }
//     }
// 
//     public void sleep(final long duration, final TimeUnit unit)
//     {
//         try
//         {
//             Thread.sleep(unit.toMillis(duration));
//         }
//         catch (InterruptedException e)
//         {
//             throw new RuntimeException("Interrupted during sleep!");
//         }
//     }
// 
//     private BitSet cpuListToBitMask(final int[] cpus)
//     {
//         final BitSet bitSet = new BitSet();
// 
//         for(int cpu : cpus)
//         {
//             bitSet.set(cpu);
//         }
// 
//         return bitSet;
//     }
// }


import com.epickrram.workshop.perf.support.Threads;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.TimeUnit;
import static com.epickrram.workshop.perf.support.DaemonThreadFactory.DAEMON_THREAD_FACTORY;
import static java.util.concurrent.Executors.newFixedThreadPool;
package com.epickrram.workshop.perf.app.jitter;




public enum Spinners
{
    SPINNERS;

    private static final long BUSY_SPIN_PERIOD_NANOS = TimeUnit.MILLISECONDS.toNanos(3L);
    private static final long SLEEP_PERIOD_NANOS = TimeUnit.MILLISECONDS.toNanos(30L);

    private volatile boolean running = false;

    public void start()
    {
        running = true;
        final int processors = Runtime.getRuntime().availableProcessors();
        final ExecutorService executorService = newFixedThreadPool(processors, DAEMON_THREAD_FACTORY);
        for(int i = 0; i < processors; i++)
        {
            executorService.submit(new Spinner());
        }
    }

    public void stop()
    {
        running = false;
    }

// Path: src/main/java/com/epickrram/workshop/perf/support/Threads.java
// public enum Threads
// {
//     THREADS;
// 
//     public Runnable runOnCpu(final Runnable task, final int... cpus)
//     {
//         return () -> {
//             setCurrentThreadAffinity(cpus);
//             task.run();
//         };
//     }
// 
//     public void setCurrentThreadAffinity(final int... cpus)
//     {
//         if (cpus.length == 0)
//         {
//             return;
//         }
//         if (cpus.length != 1)
//         {
//             throw new UnsupportedOperationException();
//         }
// 
//         ProcessBuilder builder = new ProcessBuilder("taskset", "-cp",
//           Integer.toString(cpus[0]), Integer.toString(getCurrentThreadId()));
// 
//         try
//         {
//             builder.start().waitFor();
//             System.out.println("Set affinity for thread " + Thread.currentThread().getName() + " to " + Arrays.toString(cpus));
//         }
//         catch (InterruptedException | IOException e)
//         {
//             e.printStackTrace();
//         }
//     }
// 
//     public int getCurrentThreadId()
//     {
//         try
//         {
//             final List<String> strings = Files.readAllLines(Paths.get("/proc/thread-self/status"));
//             return Integer.parseInt(strings.stream().filter(s -> s.startsWith("Pid:")).map(s -> {
//                 return s.split("\\s+")[1];
//             }).findAny().get());
// 
// //
// //            // TODO: if Java 9, then use ProcessHandle.
// //            final String pidPorpertyValue = System.getProperty("sun.java.launcher.pid");
// //
// //            if (null != pidPorpertyValue)
// //            {
// //                return Integer.parseInt(pidPorpertyValue);
// //            }
// //
// //            final String jvmName = ManagementFactory.getRuntimeMXBean().getName();
// //
// //            return Integer.parseInt(jvmName.split("@")[0]);
//         }
//         catch (final Throwable ex)
//         {
//             return -1;
//         }
//     }
// 
//     public void sleep(final long duration, final TimeUnit unit)
//     {
//         try
//         {
//             Thread.sleep(unit.toMillis(duration));
//         }
//         catch (InterruptedException e)
//         {
//             throw new RuntimeException("Interrupted during sleep!");
//         }
//     }
// 
//     private BitSet cpuListToBitMask(final int[] cpus)
//     {
//         final BitSet bitSet = new BitSet();
// 
//         for(int cpu : cpus)
//         {
//             bitSet.set(cpu);
//         }
// 
//         return bitSet;
//     }
// }


// Path: src/main/java/com/epickrram/workshop/perf/app/jitter/Spinners.java
import com.epickrram.workshop.perf.support.Threads;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.TimeUnit;
import static com.epickrram.workshop.perf.support.DaemonThreadFactory.DAEMON_THREAD_FACTORY;
import static java.util.concurrent.Executors.newFixedThreadPool;

package com.epickrram.workshop.perf.app.jitter;




public enum Spinners
{
    SPINNERS;

    private static final long BUSY_SPIN_PERIOD_NANOS = TimeUnit.MILLISECONDS.toNanos(3L);
    private static final long SLEEP_PERIOD_NANOS = TimeUnit.MILLISECONDS.toNanos(30L);

    private volatile boolean running = false;

    public void start()
    {
        running = true;
        final int processors = Runtime.getRuntime().availableProcessors();
        final ExecutorService executorService = newFixedThreadPool(processors, DAEMON_THREAD_FACTORY);
        for(int i = 0; i < processors; i++)
        {
            executorService.submit(new Spinner());
        }
    }

    public void stop()
    {
        running = false;
    }

    private class Spinner implements Runnable