aboutsummaryrefslogtreecommitdiffstats
path: root/Source/charon/job_queue.h
blob: 3b6349836d6ff03c9d7a092581b1c0ccd18a2887 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
/**
 * @file job_queue.h
 * 
 * @brief Job-Queue based on linked_list_t
 * 
 */

/*
 * Copyright (C) 2005 Jan Hutter, Martin Willi
 * Hochschule fuer Technik Rapperswil
 *
 * This program is free software; you can redistribute it and/or modify it
 * under the terms of the GNU General Public License as published by the
 * Free Software Foundation; either version 2 of the License, or (at your
 * option) any later version.  See <http://www.fsf.org/copyleft/gpl.txt>.
 *
 * This program is distributed in the hope that it will be useful, but
 * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
 * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
 * for more details.
 */

#ifndef JOB_QUEUE_H_
#define JOB_QUEUE_H_

#include "linked_list.h"

/**
 * Type of Jobs
 */
typedef enum job_type_e job_type_t;

enum job_type_e{
	/** 
	 * Job is to process an incoming IKEv2-Message
	 */
	INCOMING_PACKET,
	/** 
	 * Job is to retransmit an IKEv2-Message
	 */
	RETRANSMIT_REQUEST,
	/** 
	 * Job is to establish an ike sa as initiator
	 */
	ESTABLISH_IKE_SA
};


/**
 * @brief Job like it is represented in the job queue
 */
typedef struct job_s job_t;


struct job_s{
	job_type_t type;
	/**
	 * Every job has its assigned_data
	 */
	void * assigned_data;

	/**
	 * @brief Destroys a job_t object
	 * 
	 * @param job_t calling object
	 * @returns SUCCESS if succeeded, FAILED otherwise
	 */
	status_t (*destroy) (job_t *job);
};

/**
 * @brief Creates a job of specific type
 *
 * @param type type of the job
 * @param assigned_data value to assign to the job
 * 
 * @return job_t job object
 */
job_t *job_create(job_type_t type, void *assigned_data);

/**
 * @brief Job-Queue
 */
typedef struct job_queue_s job_queue_t;

struct job_queue_s {
	
	/**
	 * @brief Returns number of jobs in queue
	 * 
	 * @param job_queue_t calling object
 	 * @param count integer pointer to store the job count in
	 * @returns SUCCESS if succeeded, FAILED otherwise
	 */
	status_t (*get_count) (job_queue_t *job_queue, int *count);

	/**
	 * @brief Get the next job from the queue
	 * 
	 * If the queue is empty, this function blocks until job can be returned.
	 * 
	 * After using, the returned job has to get destroyed.
	 * 
	 * @param job_queue_t calling object
 	 * @param job pointer to a job pointer where to job is returned to
	 * @returns SUCCESS if succeeded, FAILED otherwise
	 */
	status_t (*get) (job_queue_t *job_queue, job_t **job);
	
	/**
	 * @brief Adds a job to the queue
	 * 
	 * This function is non blocking
	 * 
	 * @param job_queue_t calling object
 	 * @param job job to add to the queue (job is not copied)
	 * @returns SUCCESS if succeeded, FAILED otherwise
	 */
	status_t (*add) (job_queue_t *job_queue, job_t *job);

	/**
	 * @brief Destroys a job_queue object
	 * 
	 * @warning Has only to be called if no other thread is accessing the queue
	 * 
	 * @param job_queue_t calling object
	 * @returns SUCCESS if succeeded, FAILED otherwise
	 */
	status_t (*destroy) (job_queue_t *job_queue);
};

/**
 * @brief Creates a job_queue
 * * 
 * @return job_queue_t empty job_queue
 */
job_queue_t *job_queue_create();
#endif /*JOB_QUEUE_H_*/