1
/* Gearman server and library
2
* Copyright (C) 2008 Brian Aker, Eric Day
5
* Use and distribution licensed under the BSD license. See
6
* the COPYING file in the parent directory for full text.
11
* @brief Job definitions
17
* Private declarations
21
* @addtogroup gearman_job_private Private Job Functions
22
* @ingroup gearman_job
27
* Send a packet for a job.
29
static gearman_return_t _job_send(gearman_job_st *job);
37
gearman_job_st *gearman_job_create(gearman_st *gearman, gearman_job_st *job)
41
job= malloc(sizeof(gearman_job_st));
44
GEARMAN_ERROR_SET(gearman, "gearman_job_create", "malloc")
48
job->options= GEARMAN_JOB_ALLOCATED;
53
job->gearman= gearman;
54
GEARMAN_LIST_ADD(gearman->job, job,)
60
void gearman_job_free(gearman_job_st *job)
62
if (job->options & GEARMAN_JOB_ASSIGNED_IN_USE)
63
gearman_packet_free(&(job->assigned));
65
if (job->options & GEARMAN_JOB_WORK_IN_USE)
66
gearman_packet_free(&(job->work));
68
GEARMAN_LIST_DEL(job->gearman->job, job,)
70
if (job->options & GEARMAN_JOB_ALLOCATED)
74
gearman_return_t gearman_job_data(gearman_job_st *job, void *data,
79
if (!(job->options & GEARMAN_JOB_WORK_IN_USE))
81
ret= gearman_packet_add(job->gearman, &(job->work), GEARMAN_MAGIC_REQUEST,
82
GEARMAN_COMMAND_WORK_DATA, job->assigned.arg[0],
83
job->assigned.arg_size[0], data, data_size, NULL);
84
if (ret != GEARMAN_SUCCESS)
87
job->options|= GEARMAN_JOB_WORK_IN_USE;
90
return _job_send(job);
93
gearman_return_t gearman_job_warning(gearman_job_st *job, void *warning,
98
if (!(job->options & GEARMAN_JOB_WORK_IN_USE))
100
ret= gearman_packet_add(job->gearman, &(job->work), GEARMAN_MAGIC_REQUEST,
101
GEARMAN_COMMAND_WORK_WARNING, job->assigned.arg[0],
102
job->assigned.arg_size[0], warning, warning_size,
104
if (ret != GEARMAN_SUCCESS)
107
job->options|= GEARMAN_JOB_WORK_IN_USE;
110
return _job_send(job);
113
gearman_return_t gearman_job_status(gearman_job_st *job, uint32_t numerator,
114
uint32_t denominator)
116
gearman_return_t ret;
117
char numerator_string[12];
118
char denominator_string[12];
120
if (!(job->options & GEARMAN_JOB_WORK_IN_USE))
122
snprintf(numerator_string, 12, "%u", numerator);
123
snprintf(denominator_string, 12, "%u", denominator);
125
ret= gearman_packet_add(job->gearman, &(job->work), GEARMAN_MAGIC_REQUEST,
126
GEARMAN_COMMAND_WORK_STATUS, job->assigned.arg[0],
127
job->assigned.arg_size[0], numerator_string,
128
strlen(numerator_string) + 1, denominator_string,
129
strlen(denominator_string), NULL);
130
if (ret != GEARMAN_SUCCESS)
133
job->options|= GEARMAN_JOB_WORK_IN_USE;
136
return _job_send(job);
139
gearman_return_t gearman_job_complete(gearman_job_st *job, void *result,
142
gearman_return_t ret;
144
if (job->options & GEARMAN_JOB_FINISHED)
145
return GEARMAN_SUCCESS;
147
if (!(job->options & GEARMAN_JOB_WORK_IN_USE))
149
ret= gearman_packet_add(job->gearman, &(job->work),
150
GEARMAN_MAGIC_REQUEST,
151
GEARMAN_COMMAND_WORK_COMPLETE,
152
job->assigned.arg[0], job->assigned.arg_size[0],
153
result, result_size, NULL);
154
if (ret != GEARMAN_SUCCESS)
157
job->options|= GEARMAN_JOB_WORK_IN_USE;
161
if (ret != GEARMAN_SUCCESS)
164
job->options|= GEARMAN_JOB_FINISHED;
165
return GEARMAN_SUCCESS;
168
gearman_return_t gearman_job_exception(gearman_job_st *job, void *exception,
169
size_t exception_size)
171
gearman_return_t ret;
173
if (!(job->options & GEARMAN_JOB_WORK_IN_USE))
175
ret= gearman_packet_add(job->gearman, &(job->work), GEARMAN_MAGIC_REQUEST,
176
GEARMAN_COMMAND_WORK_EXCEPTION,
177
job->assigned.arg[0], job->assigned.arg_size[0],
178
exception, exception_size, NULL);
179
if (ret != GEARMAN_SUCCESS)
182
job->options|= GEARMAN_JOB_WORK_IN_USE;
185
return _job_send(job);
188
gearman_return_t gearman_job_fail(gearman_job_st *job)
190
gearman_return_t ret;
192
if (job->options & GEARMAN_JOB_FINISHED)
193
return GEARMAN_SUCCESS;
195
if (!(job->options & GEARMAN_JOB_WORK_IN_USE))
197
ret= gearman_packet_add(job->gearman, &(job->work), GEARMAN_MAGIC_REQUEST,
198
GEARMAN_COMMAND_WORK_FAIL, job->assigned.arg[0],
199
job->assigned.arg_size[0] - 1, NULL);
200
if (ret != GEARMAN_SUCCESS)
203
job->options|= GEARMAN_JOB_WORK_IN_USE;
207
if (ret != GEARMAN_SUCCESS)
210
job->options|= GEARMAN_JOB_FINISHED;
211
return GEARMAN_SUCCESS;
214
char *gearman_job_handle(gearman_job_st *job)
216
return (char *)job->assigned.arg[0];
219
char *gearman_job_function_name(gearman_job_st *job)
221
return (char *)job->assigned.arg[1];
224
const char *gearman_job_unique(gearman_job_st *job)
226
if (job->assigned.command == GEARMAN_COMMAND_JOB_ASSIGN_UNIQ)
227
return (const char *)job->assigned.arg[2];
231
const void *gearman_job_workload(gearman_job_st *job)
233
return job->assigned.data;
236
size_t gearman_job_workload_size(gearman_job_st *job)
238
return job->assigned.data_size;
242
* Private definitions
245
static gearman_return_t _job_send(gearman_job_st *job)
247
gearman_return_t ret;
249
ret= gearman_con_send(job->con, &(job->work), true);
250
if (ret != GEARMAN_SUCCESS)
253
gearman_packet_free(&(job->work));
254
job->options&= (gearman_job_options_t)~GEARMAN_JOB_WORK_IN_USE;
256
return GEARMAN_SUCCESS;