package divisors_example;

import popcorn.*;

public class SumOfDivisorsComputation extends CompoundComputation {

    private static final int BLOCK_SIZE = 10;

    private int n;
    private int sumOfDivisors;

    public SumOfDivisorsComputation(int n) {
        this.n=n;
        sumOfDivisors=0;
    }

    public SumOfDivisorsComputation(int n, CompoundComputation parent) {
        super(parent);
        this.n=n;
        sumOfDivisors=0;
    }

    public String toString() {
        return "div-sum("+n+")";
    }

    public void start() {
        for (int i=1; i < n; i+=BLOCK_SIZE)
            new MyPartialSumOfDivisorsPacket(n,i,Math.min(i+BLOCK_SIZE-1,n),this).go();
    }

    public void completed() {
        reportResult(n,sumOfDivisors);
        done();
    }

    public synchronized void update(int partialSum) {
       sumOfDivisors+=partialSum;
    }

    public void reportResult(int n, int sum) {
    }

    public static void main(String[] args) {
        popcorn.debug.EventRecorder.start();
        new SumOfDivisorsComputation(Integer.parseInt(args[0])).go();
        collectAll();
        popcorn.debug.EventRecorder.dumpToFile("log.ser");
    }
}

class MyPartialSumOfDivisorsPacket extends PartialSumOfDivisorsPacket {
    public MyPartialSumOfDivisorsPacket(int n,int n1, int n2, SumOfDivisorsComputation parent) {
        super(n,n1,n2,parent);
    }

    public void reportResult(int sum) {
        ((SumOfDivisorsComputation)getParent()).update(sum);
    }
}


