You are an expert in writing code in many different languages. Your goal is to perform code completion for the following code, keeping in mind the rest of the code and the file meta data.
    Metadata details:
    filename: aaq_parpool.m
    path of file: ./repos/automaticanalysis/aa_engine/aaq
    
    the code of the file until where you have to start completion: classdef aaq_parpool < aaq
    % aaq_parpool < aaq
    % aa queue processor using Matlab's parfeval to run tasks on a pool of
    % Matlab workers which are started and reserved via parpool prior to
    % any module computation.
    %
    % The advantages compared to other queue processors are in terms of the
    % availability of workers:
    %  i) short latency (because Matlab processes don't need to be started
    %     up for each task)
    % ii) Workers are reserved, so their availability is guaranteed
    %
    % Compared to other queue processors with parallelisation, aaq_parpool
    % features an alternative, faster computation of job dependencies,
    % which rather than relying on 'job done' 
    
function runall(obj, ~, waitforalljobs)
            % Run all jobs on the queue using parfeval.
            % 'waitforalljobs' is a logical, true indicating that the job
            % queue is fully built, false otherwise.

            % if true, any failed or canceled job will trigger an error
            DO_STRICT_CHECKS = true;
            % Copy current value of global variable aacache to obj.aaworker
            % because workers cannot 'see' the values of client global
            % variables
            global aacache
            obj.aaworker.aacache = aacache;
            
            % Run only if the queue is fully built
            if waitforalljobs
                if ~isempty(obj.jobqueue)
                    numJobs = length(obj.jobqueue);
                    isJobCanceled = false(1, numJobs);
                    % preallocate array of future objects
                    obj.FFuture(1:numJobs) = parallel.FevalFuture;
                    % create table from obj.jobqueue & update
                    jobTable = obj.jobqueue2table();
                    jobTable = obj.updateJobTable(jobTable);
                    execCounter = 0;
                    while any(obj.isJobNotRun)
                        % obj.jobReadyToGo will be reconstructed below,
                        % each time after a job has successfully finished
                        jobreadylist=obj.jobReadyToGo;
                        obj.jobReadyToGo=[];
                        % check uniqueness 
                        if numel(unique(jobreadylist)) ~= numel(jobreadylist)
                            aas_log(obj.aap, true, sprintf('ERROR:internal:jobReadyToGo contains duplicates'));
                        end