root/headers/private/support/JobQueue.h
/*
 * Copyright 2011-2015, Haiku, Inc.
 * Distributed under the terms of the MIT License.
 */
#ifndef _SUPPORT_PRIVATE_JOB_QUEUE_H_
#define _SUPPORT_PRIVATE_JOB_QUEUE_H_


#include <Locker.h>
#include <SupportDefs.h>

#include <Job.h>


namespace BSupportKit {

namespace BPrivate {


class JobQueue : private BJobStateListener {
public:
                                                                JobQueue();
        virtual                                         ~JobQueue();

                        status_t                        InitCheck() const;

                        status_t                        AddJob(BJob* job);
                                                                        // takes ownership
                        status_t                        RemoveJob(BJob* job);
                                                                        // gives up ownership

                        BJob*                           Pop();
                        status_t                        Pop(bigtime_t timeout, bool returnWhenEmpty,
                                                                        BJob** _job);
                                                                        // caller owns job

                        size_t                          CountJobs() const;

                        void                            Close();

private:
                                                                // BJobStateListener
        virtual void                            JobSucceeded(BJob* job);
        virtual void                            JobFailed(BJob* job);

private:
                        struct JobPriorityLess;
                        class JobPriorityQueue;

private:
                        status_t                        _Init();

                        void                            _RequeueDependantJobsOf(BJob* job);
                        void                            _RemoveDependantJobsOf(BJob* job);

        mutable BLocker                         fLock;
                        uint32                          fNextTicketNumber;
                        JobPriorityQueue*       fQueuedJobs;
                        sem_id                          fHaveRunnableJobSem;

                        status_t                        fInitStatus;
};


}       // namespace BPrivate

}       // namespace BSupportKit


#endif // _SUPPORT_PRIVATE_JOB_QUEUE_H_