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>