Annotation of embedaddon/strongswan/src/libstrongswan/processing/jobs/job.h, revision 1.1

1.1     ! misho       1: /*
        !             2:  * Copyright (C) 2012 Tobias Brunner
        !             3:  * Copyright (C) 2005-2006 Martin Willi
        !             4:  * Copyright (C) 2005 Jan Hutter
        !             5:  * HSR Hochschule fuer Technik Rapperswil
        !             6:  *
        !             7:  * This program is free software; you can redistribute it and/or modify it
        !             8:  * under the terms of the GNU General Public License as published by the
        !             9:  * Free Software Foundation; either version 2 of the License, or (at your
        !            10:  * option) any later version.  See <http://www.fsf.org/copyleft/gpl.txt>.
        !            11:  *
        !            12:  * This program is distributed in the hope that it will be useful, but
        !            13:  * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
        !            14:  * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
        !            15:  * for more details.
        !            16:  */
        !            17: 
        !            18: /**
        !            19:  * @defgroup job job
        !            20:  * @{ @ingroup jobs
        !            21:  */
        !            22: 
        !            23: #ifndef JOB_H_
        !            24: #define JOB_H_
        !            25: 
        !            26: typedef struct job_t job_t;
        !            27: typedef enum job_priority_t job_priority_t;
        !            28: typedef enum job_status_t job_status_t;
        !            29: typedef enum job_requeue_type_t job_requeue_type_t;
        !            30: typedef struct job_requeue_t job_requeue_t;
        !            31: 
        !            32: #include <library.h>
        !            33: 
        !            34: /**
        !            35:  * Priority classes of jobs
        !            36:  */
        !            37: enum job_priority_t {
        !            38:        /** Critical infrastructure jobs that should always been served */
        !            39:        JOB_PRIO_CRITICAL = 0,
        !            40:        /** Short jobs executed with highest priority */
        !            41:        JOB_PRIO_HIGH,
        !            42:        /** Default job priority */
        !            43:        JOB_PRIO_MEDIUM,
        !            44:        /** Low priority jobs with thread blocking operations */
        !            45:        JOB_PRIO_LOW,
        !            46:        JOB_PRIO_MAX
        !            47: };
        !            48: 
        !            49: /**
        !            50:  * Enum names for job priorities
        !            51:  */
        !            52: extern enum_name_t *job_priority_names;
        !            53: 
        !            54: /**
        !            55:  * Job status
        !            56:  */
        !            57: enum job_status_t {
        !            58:        /** The job is queued and has not yet been executed */
        !            59:        JOB_STATUS_QUEUED = 0,
        !            60:        /** During execution */
        !            61:        JOB_STATUS_EXECUTING,
        !            62:        /** If the job got canceled */
        !            63:        JOB_STATUS_CANCELED,
        !            64:        /** The job was executed successfully */
        !            65:        JOB_STATUS_DONE,
        !            66: };
        !            67: 
        !            68: /**
        !            69:  * How a job is handled after is has been executed.
        !            70:  */
        !            71: enum job_requeue_type_t {
        !            72:        /** Do not requeue job, destroy it */
        !            73:        JOB_REQUEUE_TYPE_NONE = 0,
        !            74:        /** Requeue the job fairly, i.e. it is inserted at the end of the queue */
        !            75:        JOB_REQUEUE_TYPE_FAIR,
        !            76:        /** Reexecute the job directly, without the need of requeueing it */
        !            77:        JOB_REQUEUE_TYPE_DIRECT,
        !            78:        /** Rescheduled the job via scheduler_t */
        !            79:        JOB_REQUEUE_TYPE_SCHEDULE,
        !            80: };
        !            81: 
        !            82: /**
        !            83:  * Job requeueing policy.
        !            84:  *
        !            85:  * The job requeueing policy defines how a job is handled after it has been
        !            86:  * executed.
        !            87:  */
        !            88: struct job_requeue_t {
        !            89:        /** How to handle the job after executing it */
        !            90:        job_requeue_type_t type;
        !            91:        /** How to reschedule the job, if so */
        !            92:        enum {
        !            93:                JOB_SCHEDULE,
        !            94:                JOB_SCHEDULE_MS,
        !            95:                JOB_SCHEDULE_TV,
        !            96:        } schedule;
        !            97:        /** Time to reschedule the job */
        !            98:        union {
        !            99:                uint32_t rel;
        !           100:                timeval_t abs;
        !           101:        } time;
        !           102: };
        !           103: 
        !           104: /**
        !           105:  * Helper macros to easily define requeueing policies.
        !           106:  */
        !           107: #define __JOB_REQUEUE(t)                       (job_requeue_t){ .type = t }
        !           108: #define JOB_REQUEUE_NONE                       __JOB_REQUEUE(JOB_REQUEUE_TYPE_NONE)
        !           109: #define JOB_REQUEUE_FAIR                       __JOB_REQUEUE(JOB_REQUEUE_TYPE_FAIR)
        !           110: #define JOB_REQUEUE_DIRECT                     __JOB_REQUEUE(JOB_REQUEUE_TYPE_DIRECT)
        !           111: #define __JOB_RESCHEDULE(t, ...)       (job_requeue_t){ .type = JOB_REQUEUE_TYPE_SCHEDULE, .schedule = t, { __VA_ARGS__ } }
        !           112: #define JOB_RESCHEDULE(s)                      __JOB_RESCHEDULE(JOB_SCHEDULE, .rel = s)
        !           113: #define JOB_RESCHEDULE_MS(ms)          __JOB_RESCHEDULE(JOB_SCHEDULE_MS, .rel = ms)
        !           114: #define JOB_RESCHEDULE_TV(tv)          __JOB_RESCHEDULE(JOB_SCHEDULE_TV, .abs = tv)
        !           115: 
        !           116: /**
        !           117:  * Job interface as it is stored in the job queue.
        !           118:  */
        !           119: struct job_t {
        !           120: 
        !           121:        /**
        !           122:         * Status of this job, is modified exclusively by the processor/scheduler
        !           123:         */
        !           124:        job_status_t status;
        !           125: 
        !           126:        /**
        !           127:         * Execute a job.
        !           128:         *
        !           129:         * The processing facility executes a job using this method. Jobs are
        !           130:         * one-shot, they are destroyed after execution (depending on the return
        !           131:         * value here), so don't use a job once it has been queued.
        !           132:         *
        !           133:         * @return                      policy how to requeue the job
        !           134:         */
        !           135:        job_requeue_t (*execute) (job_t *this);
        !           136: 
        !           137:        /**
        !           138:         * Cancel a job.
        !           139:         *
        !           140:         * Implementing this method is optional.  It allows potentially blocking
        !           141:         * jobs to be canceled during shutdown.
        !           142:         *
        !           143:         * If no special action is to be taken simply return FALSE then the thread
        !           144:         * executing the job will be canceled.  If TRUE is returned the job is
        !           145:         * expected to return from execute() itself (i.e. the thread won't be
        !           146:         * canceled explicitly and can still be joined later).
        !           147:         * Jobs that return FALSE have to make sure they provide the appropriate
        !           148:         * cancellation points.
        !           149:         *
        !           150:         * @note Regular jobs that do not block MUST NOT implement this method.
        !           151:         * @note This method could be called even before execute() has been called.
        !           152:         *
        !           153:         * @return                      FALSE to cancel the thread, TRUE if canceled otherwise
        !           154:         */
        !           155:        bool (*cancel)(job_t *this);
        !           156: 
        !           157:        /**
        !           158:         * Get the priority of a job.
        !           159:         *
        !           160:         * @return                      job priority
        !           161:         */
        !           162:        job_priority_t (*get_priority)(job_t *this);
        !           163: 
        !           164:        /**
        !           165:         * Destroy a job.
        !           166:         *
        !           167:         * Is called after a job is executed or got canceled.  It is also called
        !           168:         * for queued jobs that were never executed.
        !           169:         *
        !           170:         * Use the status of a job to decide what to do during destruction.
        !           171:         */
        !           172:        void (*destroy)(job_t *this);
        !           173: };
        !           174: 
        !           175: #endif /** JOB_H_ @}*/

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>