Status: | Merged |
---|---|
Merged at revision: | 799 |
Proposed branch: | lp:~brianaker/gearmand/finish |
Merge into: | lp:gearmand |
Diff against target: |
708 lines (+277/-214) 6 files modified
libgearman/error.hpp (+1/-0) libgearman/function/function_v1.hpp (+1/-1) libgearman/interface/worker.hpp (+5/-0) libgearman/job.cc (+241/-211) libgearman/job.hpp (+23/-1) libgearman/worker.cc (+6/-1) |
To merge this branch: | bzr merge lp:~brianaker/gearmand/finish |
Related bugs: |
Reviewer | Review Type | Date Requested | Status |
---|---|---|---|
Tangent Trunk | Pending | ||
Review via email: mp+172716@code.launchpad.net |
Commit message
Description of the change
To post a comment you must log in.
Preview Diff
[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1 | === modified file 'libgearman/error.hpp' | |||
2 | --- libgearman/error.hpp 2013-02-04 06:00:39 +0000 | |||
3 | +++ libgearman/error.hpp 2013-07-03 01:51:27 +0000 | |||
4 | @@ -63,3 +63,4 @@ | |||
5 | 63 | const char *position); | 63 | const char *position); |
6 | 64 | 64 | ||
7 | 65 | void gearman_worker_reset_error(gearman_worker_st *worker); | 65 | void gearman_worker_reset_error(gearman_worker_st *worker); |
8 | 66 | void gearman_worker_reset_error(Worker&); | ||
9 | 66 | 67 | ||
10 | === modified file 'libgearman/function/function_v1.hpp' | |||
11 | --- libgearman/function/function_v1.hpp 2012-08-20 17:07:47 +0000 | |||
12 | +++ libgearman/function/function_v1.hpp 2013-07-03 01:51:27 +0000 | |||
13 | @@ -63,7 +63,7 @@ | |||
14 | 63 | } | 63 | } |
15 | 64 | 64 | ||
16 | 65 | job->error_code= GEARMAN_SUCCESS; | 65 | job->error_code= GEARMAN_SUCCESS; |
18 | 66 | job->worker->impl()->work_result= _worker_fn(job, context_arg, &(job->worker->impl()->work_result_size), &job->error_code); | 66 | job->_worker.work_result= _worker_fn(job, context_arg, &(job->_worker.work_result_size), &job->error_code); |
19 | 67 | 67 | ||
20 | 68 | if (job->error_code == GEARMAN_LOST_CONNECTION) | 68 | if (job->error_code == GEARMAN_LOST_CONNECTION) |
21 | 69 | { | 69 | { |
22 | 70 | 70 | ||
23 | === modified file 'libgearman/interface/worker.hpp' | |||
24 | --- libgearman/interface/worker.hpp 2013-06-05 21:59:31 +0000 | |||
25 | +++ libgearman/interface/worker.hpp 2013-07-03 01:51:27 +0000 | |||
26 | @@ -127,6 +127,11 @@ | |||
27 | 127 | universal.options._ssl= ssl_; | 127 | universal.options._ssl= ssl_; |
28 | 128 | } | 128 | } |
29 | 129 | 129 | ||
30 | 130 | const char* error() const | ||
31 | 131 | { | ||
32 | 132 | return universal.error(); | ||
33 | 133 | } | ||
34 | 134 | |||
35 | 130 | private: | 135 | private: |
36 | 131 | gearman_worker_st* _shell; | 136 | gearman_worker_st* _shell; |
37 | 132 | gearman_worker_st _owned_shell; | 137 | gearman_worker_st _owned_shell; |
38 | 133 | 138 | ||
39 | === modified file 'libgearman/job.cc' | |||
40 | --- libgearman/job.cc 2013-06-15 07:55:07 +0000 | |||
41 | +++ libgearman/job.cc 2013-07-03 01:51:27 +0000 | |||
42 | @@ -170,42 +170,46 @@ | |||
43 | 170 | 170 | ||
44 | 171 | gearman_job_st *gearman_job_create(gearman_worker_st *worker, gearman_job_st *job) | 171 | gearman_job_st *gearman_job_create(gearman_worker_st *worker, gearman_job_st *job) |
45 | 172 | { | 172 | { |
82 | 173 | if (job) | 173 | if (worker) |
83 | 174 | { | 174 | { |
84 | 175 | job->options.allocated= false; | 175 | if (job) |
85 | 176 | } | 176 | { |
86 | 177 | else | 177 | job->options.allocated= false; |
87 | 178 | { | 178 | } |
88 | 179 | job= new (std::nothrow) gearman_job_st; | 179 | else |
89 | 180 | if (job == NULL) | 180 | { |
90 | 181 | { | 181 | job= new (std::nothrow) gearman_job_st(*(worker->impl())); |
91 | 182 | gearman_perror(worker->impl()->universal, "new"); | 182 | if (job == NULL) |
92 | 183 | return NULL; | 183 | { |
93 | 184 | } | 184 | gearman_perror(job->_worker.universal, "new"); |
94 | 185 | 185 | return NULL; | |
95 | 186 | job->options.allocated= true; | 186 | } |
96 | 187 | } | 187 | |
97 | 188 | 188 | job->options.allocated= true; | |
98 | 189 | job->options.assigned_in_use= false; | 189 | } |
99 | 190 | job->options.work_in_use= false; | 190 | |
100 | 191 | job->options.finished= false; | 191 | job->options.assigned_in_use= false; |
101 | 192 | 192 | job->options.work_in_use= false; | |
102 | 193 | job->worker= worker; | 193 | job->options.finished= false; |
103 | 194 | job->reducer= NULL; | 194 | |
104 | 195 | job->error_code= GEARMAN_UNKNOWN_STATE; | 195 | job->reducer= NULL; |
105 | 196 | 196 | job->error_code= GEARMAN_UNKNOWN_STATE; | |
106 | 197 | if (worker->impl()->job_list) | 197 | |
107 | 198 | { | 198 | if (job->_worker.job_list) |
108 | 199 | worker->impl()->job_list->prev= job; | 199 | { |
109 | 200 | } | 200 | job->_worker.job_list->prev= job; |
110 | 201 | job->next= worker->impl()->job_list; | 201 | } |
111 | 202 | job->prev= NULL; | 202 | job->next= job->_worker.job_list; |
112 | 203 | worker->impl()->job_list= job; | 203 | job->prev= NULL; |
113 | 204 | worker->impl()->job_count++; | 204 | job->_worker.job_list= job; |
114 | 205 | 205 | job->_worker.job_count++; | |
115 | 206 | job->con= NULL; | 206 | |
116 | 207 | 207 | job->con= NULL; | |
117 | 208 | return job; | 208 | |
118 | 209 | return job; | ||
119 | 210 | } | ||
120 | 211 | |||
121 | 212 | return NULL; | ||
122 | 209 | } | 213 | } |
123 | 210 | 214 | ||
124 | 211 | bool gearman_job_build_reducer(gearman_job_st *job, gearman_aggregator_fn *aggregator_fn) | 215 | bool gearman_job_build_reducer(gearman_job_st *job, gearman_aggregator_fn *aggregator_fn) |
125 | @@ -217,7 +221,7 @@ | |||
126 | 217 | 221 | ||
127 | 218 | gearman_string_t reducer_func= gearman_job_reducer_string(job); | 222 | gearman_string_t reducer_func= gearman_job_reducer_string(job); |
128 | 219 | 223 | ||
130 | 220 | job->reducer= new (std::nothrow) gearman_job_reducer_st(job->worker->impl()->universal, reducer_func, aggregator_fn); | 224 | job->reducer= new (std::nothrow) gearman_job_reducer_st(job->universal(), reducer_func, aggregator_fn); |
131 | 221 | if (not job->reducer) | 225 | if (not job->reducer) |
132 | 222 | { | 226 | { |
133 | 223 | gearman_job_free(job); | 227 | gearman_job_free(job); |
134 | @@ -235,9 +239,9 @@ | |||
135 | 235 | 239 | ||
136 | 236 | static inline void gearman_job_reset_error(gearman_job_st *job) | 240 | static inline void gearman_job_reset_error(gearman_job_st *job) |
137 | 237 | { | 241 | { |
139 | 238 | if (job->worker) | 242 | if (job) |
140 | 239 | { | 243 | { |
142 | 240 | gearman_worker_reset_error(job->worker); | 244 | gearman_worker_reset_error(job->_worker); |
143 | 241 | } | 245 | } |
144 | 242 | } | 246 | } |
145 | 243 | 247 | ||
146 | @@ -245,36 +249,41 @@ | |||
147 | 245 | { | 249 | { |
148 | 246 | if (job) | 250 | if (job) |
149 | 247 | { | 251 | { |
180 | 248 | const void *args[2]; | 252 | if (job->finished() == false) |
181 | 249 | size_t args_size[2]; | 253 | { |
182 | 250 | 254 | const void *args[2]; | |
183 | 251 | if (job->reducer) | 255 | size_t args_size[2]; |
184 | 252 | { | 256 | |
185 | 253 | gearman_argument_t value= gearman_argument_make(NULL, 0, static_cast<const char *>(data), data_size); | 257 | if (job->reducer) |
186 | 254 | job->reducer->add(value); | 258 | { |
187 | 255 | 259 | gearman_argument_t value= gearman_argument_make(NULL, 0, static_cast<const char *>(data), data_size); | |
188 | 256 | return GEARMAN_SUCCESS; | 260 | job->reducer->add(value); |
189 | 257 | } | 261 | |
190 | 258 | 262 | return GEARMAN_SUCCESS; | |
191 | 259 | if ((job->options.work_in_use) == false) | 263 | } |
192 | 260 | { | 264 | |
193 | 261 | args[0]= job->assigned.arg[0]; | 265 | if ((job->options.work_in_use) == false) |
194 | 262 | args_size[0]= job->assigned.arg_size[0]; | 266 | { |
195 | 263 | args[1]= data; | 267 | args[0]= job->assigned.arg[0]; |
196 | 264 | args_size[1]= data_size; | 268 | args_size[0]= job->assigned.arg_size[0]; |
197 | 265 | gearman_return_t ret= gearman_packet_create_args(job->worker->impl()->universal, job->work, | 269 | args[1]= data; |
198 | 266 | GEARMAN_MAGIC_REQUEST, | 270 | args_size[1]= data_size; |
199 | 267 | GEARMAN_COMMAND_WORK_DATA, | 271 | gearman_return_t ret= gearman_packet_create_args(job->universal(), job->work, |
200 | 268 | args, args_size, 2); | 272 | GEARMAN_MAGIC_REQUEST, |
201 | 269 | if (gearman_failed(ret)) | 273 | GEARMAN_COMMAND_WORK_DATA, |
202 | 270 | { | 274 | args, args_size, 2); |
203 | 271 | return ret; | 275 | if (gearman_failed(ret)) |
204 | 272 | } | 276 | { |
205 | 273 | 277 | return ret; | |
206 | 274 | job->options.work_in_use= true; | 278 | } |
207 | 275 | } | 279 | |
208 | 276 | 280 | job->options.work_in_use= true; | |
209 | 277 | return _job_send(job); | 281 | } |
210 | 282 | |||
211 | 283 | return _job_send(job); | ||
212 | 284 | } | ||
213 | 285 | |||
214 | 286 | return GEARMAN_SUCCESS; | ||
215 | 278 | } | 287 | } |
216 | 279 | 288 | ||
217 | 280 | return GEARMAN_INVALID_ARGUMENT; | 289 | return GEARMAN_INVALID_ARGUMENT; |
218 | @@ -286,30 +295,35 @@ | |||
219 | 286 | { | 295 | { |
220 | 287 | if (job) | 296 | if (job) |
221 | 288 | { | 297 | { |
226 | 289 | const void *args[2]; | 298 | if (job->finished() == false) |
223 | 290 | size_t args_size[2]; | ||
224 | 291 | |||
225 | 292 | if ((job->options.work_in_use) == false) | ||
227 | 293 | { | 299 | { |
232 | 294 | args[0]= job->assigned.arg[0]; | 300 | const void *args[2]; |
233 | 295 | args_size[0]= job->assigned.arg_size[0]; | 301 | size_t args_size[2]; |
230 | 296 | args[1]= warning; | ||
231 | 297 | args_size[1]= warning_size; | ||
234 | 298 | 302 | ||
241 | 299 | gearman_return_t ret; | 303 | if ((job->options.work_in_use) == false) |
236 | 300 | ret= gearman_packet_create_args(job->worker->impl()->universal, job->work, | ||
237 | 301 | GEARMAN_MAGIC_REQUEST, | ||
238 | 302 | GEARMAN_COMMAND_WORK_WARNING, | ||
239 | 303 | args, args_size, 2); | ||
240 | 304 | if (gearman_failed(ret)) | ||
242 | 305 | { | 304 | { |
244 | 306 | return ret; | 305 | args[0]= job->assigned.arg[0]; |
245 | 306 | args_size[0]= job->assigned.arg_size[0]; | ||
246 | 307 | args[1]= warning; | ||
247 | 308 | args_size[1]= warning_size; | ||
248 | 309 | |||
249 | 310 | gearman_return_t ret; | ||
250 | 311 | ret= gearman_packet_create_args(job->universal(), job->work, | ||
251 | 312 | GEARMAN_MAGIC_REQUEST, | ||
252 | 313 | GEARMAN_COMMAND_WORK_WARNING, | ||
253 | 314 | args, args_size, 2); | ||
254 | 315 | if (gearman_failed(ret)) | ||
255 | 316 | { | ||
256 | 317 | return ret; | ||
257 | 318 | } | ||
258 | 319 | |||
259 | 320 | job->options.work_in_use= true; | ||
260 | 307 | } | 321 | } |
261 | 308 | 322 | ||
263 | 309 | job->options.work_in_use= true; | 323 | return _job_send(job); |
264 | 310 | } | 324 | } |
265 | 311 | 325 | ||
267 | 312 | return _job_send(job); | 326 | return GEARMAN_SUCCESS; |
268 | 313 | } | 327 | } |
269 | 314 | 328 | ||
270 | 315 | return GEARMAN_INVALID_ARGUMENT; | 329 | return GEARMAN_INVALID_ARGUMENT; |
271 | @@ -321,37 +335,42 @@ | |||
272 | 321 | { | 335 | { |
273 | 322 | if (job) | 336 | if (job) |
274 | 323 | { | 337 | { |
281 | 324 | char numerator_string[12]; | 338 | if (job->finished() == false) |
276 | 325 | char denominator_string[12]; | ||
277 | 326 | const void *args[3]; | ||
278 | 327 | size_t args_size[3]; | ||
279 | 328 | |||
280 | 329 | if (not (job->options.work_in_use)) | ||
282 | 330 | { | 339 | { |
299 | 331 | snprintf(numerator_string, 12, "%u", numerator); | 340 | char numerator_string[12]; |
300 | 332 | snprintf(denominator_string, 12, "%u", denominator); | 341 | char denominator_string[12]; |
301 | 333 | 342 | const void *args[3]; | |
302 | 334 | args[0]= job->assigned.arg[0]; | 343 | size_t args_size[3]; |
303 | 335 | args_size[0]= job->assigned.arg_size[0]; | 344 | |
304 | 336 | args[1]= numerator_string; | 345 | if (not (job->options.work_in_use)) |
289 | 337 | args_size[1]= strlen(numerator_string) + 1; | ||
290 | 338 | args[2]= denominator_string; | ||
291 | 339 | args_size[2]= strlen(denominator_string); | ||
292 | 340 | |||
293 | 341 | gearman_return_t ret; | ||
294 | 342 | ret= gearman_packet_create_args(job->worker->impl()->universal, job->work, | ||
295 | 343 | GEARMAN_MAGIC_REQUEST, | ||
296 | 344 | GEARMAN_COMMAND_WORK_STATUS, | ||
297 | 345 | args, args_size, 3); | ||
298 | 346 | if (gearman_failed(ret)) | ||
305 | 347 | { | 346 | { |
307 | 348 | return ret; | 347 | snprintf(numerator_string, 12, "%u", numerator); |
308 | 348 | snprintf(denominator_string, 12, "%u", denominator); | ||
309 | 349 | |||
310 | 350 | args[0]= job->assigned.arg[0]; | ||
311 | 351 | args_size[0]= job->assigned.arg_size[0]; | ||
312 | 352 | args[1]= numerator_string; | ||
313 | 353 | args_size[1]= strlen(numerator_string) + 1; | ||
314 | 354 | args[2]= denominator_string; | ||
315 | 355 | args_size[2]= strlen(denominator_string); | ||
316 | 356 | |||
317 | 357 | gearman_return_t ret; | ||
318 | 358 | ret= gearman_packet_create_args(job->universal(), job->work, | ||
319 | 359 | GEARMAN_MAGIC_REQUEST, | ||
320 | 360 | GEARMAN_COMMAND_WORK_STATUS, | ||
321 | 361 | args, args_size, 3); | ||
322 | 362 | if (gearman_failed(ret)) | ||
323 | 363 | { | ||
324 | 364 | return ret; | ||
325 | 365 | } | ||
326 | 366 | |||
327 | 367 | job->options.work_in_use= true; | ||
328 | 349 | } | 368 | } |
329 | 350 | 369 | ||
331 | 351 | job->options.work_in_use= true; | 370 | return _job_send(job); |
332 | 352 | } | 371 | } |
333 | 353 | 372 | ||
335 | 354 | return _job_send(job); | 373 | return GEARMAN_SUCCESS; |
336 | 355 | } | 374 | } |
337 | 356 | 375 | ||
338 | 357 | return GEARMAN_INVALID_ARGUMENT; | 376 | return GEARMAN_INVALID_ARGUMENT; |
339 | @@ -363,12 +382,17 @@ | |||
340 | 363 | { | 382 | { |
341 | 364 | if (job) | 383 | if (job) |
342 | 365 | { | 384 | { |
344 | 366 | if (job->reducer) | 385 | if (job->finished() == false) |
345 | 367 | { | 386 | { |
347 | 368 | return GEARMAN_INVALID_ARGUMENT; | 387 | if (job->reducer) |
348 | 388 | { | ||
349 | 389 | return GEARMAN_INVALID_ARGUMENT; | ||
350 | 390 | } | ||
351 | 391 | |||
352 | 392 | return gearman_job_send_complete_fin(job, result, result_size); | ||
353 | 369 | } | 393 | } |
354 | 370 | 394 | ||
356 | 371 | return gearman_job_send_complete_fin(job, result, result_size); | 395 | return GEARMAN_SUCCESS; |
357 | 372 | } | 396 | } |
358 | 373 | 397 | ||
359 | 374 | return GEARMAN_INVALID_ARGUMENT; | 398 | return GEARMAN_INVALID_ARGUMENT; |
360 | @@ -379,66 +403,64 @@ | |||
361 | 379 | { | 403 | { |
362 | 380 | if (job) | 404 | if (job) |
363 | 381 | { | 405 | { |
410 | 382 | if (job->options.finished) | 406 | if (job->finished() == false) |
411 | 383 | { | 407 | { |
412 | 384 | return GEARMAN_SUCCESS; | 408 | if (job->reducer) |
413 | 385 | } | 409 | { |
414 | 386 | 410 | if (result_size) | |
415 | 387 | if (job->reducer) | 411 | { |
416 | 388 | { | 412 | gearman_argument_t value= gearman_argument_make(NULL, 0, static_cast<const char *>(result), result_size); |
417 | 389 | if (result_size) | 413 | job->reducer->add(value); |
418 | 390 | { | 414 | } |
419 | 391 | gearman_argument_t value= gearman_argument_make(NULL, 0, static_cast<const char *>(result), result_size); | 415 | |
420 | 392 | job->reducer->add(value); | 416 | gearman_return_t rc= job->reducer->complete(); |
421 | 393 | } | 417 | if (gearman_failed(rc)) |
422 | 394 | 418 | { | |
423 | 395 | gearman_return_t rc= job->reducer->complete(); | 419 | return gearman_error(job->universal(), rc, "The reducer's complete() returned an error"); |
424 | 396 | if (gearman_failed(rc)) | 420 | } |
425 | 397 | { | 421 | |
426 | 398 | return gearman_error(job->worker->impl()->universal, rc, "The reducer's complete() returned an error"); | 422 | const gearman_vector_st *reduced_value= job->reducer->result.string(); |
427 | 399 | } | 423 | if (reduced_value) |
428 | 400 | 424 | { | |
429 | 401 | const gearman_vector_st *reduced_value= job->reducer->result.string(); | 425 | result= gearman_string_value(reduced_value); |
430 | 402 | if (reduced_value) | 426 | result_size= gearman_string_length(reduced_value); |
431 | 403 | { | 427 | } |
432 | 404 | result= gearman_string_value(reduced_value); | 428 | else |
433 | 405 | result_size= gearman_string_length(reduced_value); | 429 | { |
434 | 406 | } | 430 | result= NULL; |
435 | 407 | else | 431 | result_size= 0; |
436 | 408 | { | 432 | } |
437 | 409 | result= NULL; | 433 | } |
438 | 410 | result_size= 0; | 434 | |
439 | 411 | } | 435 | const void *args[2]; |
440 | 412 | } | 436 | size_t args_size[2]; |
441 | 413 | 437 | ||
442 | 414 | const void *args[2]; | 438 | if (not (job->options.work_in_use)) |
443 | 415 | size_t args_size[2]; | 439 | { |
444 | 416 | 440 | args[0]= job->assigned.arg[0]; | |
445 | 417 | if (not (job->options.work_in_use)) | 441 | args_size[0]= job->assigned.arg_size[0]; |
446 | 418 | { | 442 | |
447 | 419 | args[0]= job->assigned.arg[0]; | 443 | args[1]= result; |
448 | 420 | args_size[0]= job->assigned.arg_size[0]; | 444 | args_size[1]= result_size; |
449 | 421 | 445 | gearman_return_t ret= gearman_packet_create_args(job->_worker.universal, job->work, | |
450 | 422 | args[1]= result; | 446 | GEARMAN_MAGIC_REQUEST, |
451 | 423 | args_size[1]= result_size; | 447 | GEARMAN_COMMAND_WORK_COMPLETE, |
452 | 424 | gearman_return_t ret= gearman_packet_create_args(job->worker->impl()->universal, job->work, | 448 | args, args_size, 2); |
453 | 425 | GEARMAN_MAGIC_REQUEST, | 449 | if (gearman_failed(ret)) |
454 | 426 | GEARMAN_COMMAND_WORK_COMPLETE, | 450 | { |
455 | 427 | args, args_size, 2); | 451 | return ret; |
456 | 452 | } | ||
457 | 453 | job->options.work_in_use= true; | ||
458 | 454 | } | ||
459 | 455 | |||
460 | 456 | gearman_return_t ret= _job_send(job); | ||
461 | 428 | if (gearman_failed(ret)) | 457 | if (gearman_failed(ret)) |
462 | 429 | { | 458 | { |
463 | 430 | return ret; | 459 | return ret; |
464 | 431 | } | 460 | } |
475 | 432 | job->options.work_in_use= true; | 461 | |
476 | 433 | } | 462 | job->finished(true); |
477 | 434 | 463 | } | |
468 | 435 | gearman_return_t ret= _job_send(job); | ||
469 | 436 | if (gearman_failed(ret)) | ||
470 | 437 | { | ||
471 | 438 | return ret; | ||
472 | 439 | } | ||
473 | 440 | |||
474 | 441 | job->options.finished= true; | ||
478 | 442 | 464 | ||
479 | 443 | return GEARMAN_SUCCESS; | 465 | return GEARMAN_SUCCESS; |
480 | 444 | } | 466 | } |
481 | @@ -452,21 +474,26 @@ | |||
482 | 452 | { | 474 | { |
483 | 453 | if (job) | 475 | if (job) |
484 | 454 | { | 476 | { |
486 | 455 | if (not (job->options.work_in_use)) | 477 | if (job->finished() == false) |
487 | 456 | { | 478 | { |
493 | 457 | gearman_string_t handle_string= { static_cast<const char *>(job->assigned.arg[0]), job->assigned.arg_size[0] }; | 479 | if (job->options.work_in_use == false) |
489 | 458 | gearman_string_t exception_string= { static_cast<const char *>(exception), exception_size }; | ||
490 | 459 | |||
491 | 460 | gearman_return_t ret= libgearman::protocol::work_exception(job->worker->impl()->universal, job->work, handle_string, exception_string); | ||
492 | 461 | if (gearman_failed(ret)) | ||
494 | 462 | { | 480 | { |
496 | 463 | return ret; | 481 | gearman_string_t handle_string= { static_cast<const char *>(job->assigned.arg[0]), job->assigned.arg_size[0] }; |
497 | 482 | gearman_string_t exception_string= { static_cast<const char *>(exception), exception_size }; | ||
498 | 483 | |||
499 | 484 | gearman_return_t ret= libgearman::protocol::work_exception(job->_worker.universal, job->work, handle_string, exception_string); | ||
500 | 485 | if (gearman_failed(ret)) | ||
501 | 486 | { | ||
502 | 487 | return ret; | ||
503 | 488 | } | ||
504 | 489 | |||
505 | 490 | job->options.work_in_use= true; | ||
506 | 464 | } | 491 | } |
507 | 465 | 492 | ||
509 | 466 | job->options.work_in_use= true; | 493 | return _job_send(job); |
510 | 467 | } | 494 | } |
511 | 468 | 495 | ||
513 | 469 | return _job_send(job); | 496 | return GEARMAN_SUCCESS; |
514 | 470 | } | 497 | } |
515 | 471 | 498 | ||
516 | 472 | return GEARMAN_INVALID_ARGUMENT; | 499 | return GEARMAN_INVALID_ARGUMENT; |
517 | @@ -476,12 +503,17 @@ | |||
518 | 476 | { | 503 | { |
519 | 477 | if (job) | 504 | if (job) |
520 | 478 | { | 505 | { |
522 | 479 | if (job->reducer) | 506 | if (job->finished() == false) |
523 | 480 | { | 507 | { |
525 | 481 | return GEARMAN_INVALID_ARGUMENT; | 508 | if (job->reducer) |
526 | 509 | { | ||
527 | 510 | return gearman_error(job->universal(), GEARMAN_INVALID_ARGUMENT, "Job has a reducer"); | ||
528 | 511 | } | ||
529 | 512 | |||
530 | 513 | return gearman_job_send_fail_fin(job); | ||
531 | 482 | } | 514 | } |
532 | 483 | 515 | ||
534 | 484 | return gearman_job_send_fail_fin(job); | 516 | return GEARMAN_SUCCESS; |
535 | 485 | } | 517 | } |
536 | 486 | 518 | ||
537 | 487 | return GEARMAN_INVALID_ARGUMENT; | 519 | return GEARMAN_INVALID_ARGUMENT; |
538 | @@ -494,34 +526,32 @@ | |||
539 | 494 | const void *args[1]; | 526 | const void *args[1]; |
540 | 495 | size_t args_size[1]; | 527 | size_t args_size[1]; |
541 | 496 | 528 | ||
555 | 497 | if (job->options.finished) | 529 | if (job->finished() == false) |
556 | 498 | { | 530 | { |
557 | 499 | return GEARMAN_SUCCESS; | 531 | if (not (job->options.work_in_use)) |
558 | 500 | } | 532 | { |
559 | 501 | 533 | args[0]= job->assigned.arg[0]; | |
560 | 502 | if (not (job->options.work_in_use)) | 534 | args_size[0]= job->assigned.arg_size[0] - 1; |
561 | 503 | { | 535 | gearman_return_t ret= gearman_packet_create_args(job->_worker.universal, job->work, |
562 | 504 | args[0]= job->assigned.arg[0]; | 536 | GEARMAN_MAGIC_REQUEST, |
563 | 505 | args_size[0]= job->assigned.arg_size[0] - 1; | 537 | GEARMAN_COMMAND_WORK_FAIL, |
564 | 506 | gearman_return_t ret= gearman_packet_create_args(job->worker->impl()->universal, job->work, | 538 | args, args_size, 1); |
565 | 507 | GEARMAN_MAGIC_REQUEST, | 539 | if (gearman_failed(ret)) |
566 | 508 | GEARMAN_COMMAND_WORK_FAIL, | 540 | { |
567 | 509 | args, args_size, 1); | 541 | return ret; |
568 | 542 | } | ||
569 | 543 | |||
570 | 544 | job->options.work_in_use= true; | ||
571 | 545 | } | ||
572 | 546 | |||
573 | 547 | gearman_return_t ret= _job_send(job); | ||
574 | 510 | if (gearman_failed(ret)) | 548 | if (gearman_failed(ret)) |
575 | 511 | { | 549 | { |
576 | 512 | return ret; | 550 | return ret; |
577 | 513 | } | 551 | } |
578 | 514 | 552 | ||
589 | 515 | job->options.work_in_use= true; | 553 | job->finished(true); |
590 | 516 | } | 554 | } |
581 | 517 | |||
582 | 518 | gearman_return_t ret= _job_send(job); | ||
583 | 519 | if (gearman_failed(ret)) | ||
584 | 520 | { | ||
585 | 521 | return ret; | ||
586 | 522 | } | ||
587 | 523 | |||
588 | 524 | job->options.finished= true; | ||
591 | 525 | 555 | ||
592 | 526 | return GEARMAN_SUCCESS; | 556 | return GEARMAN_SUCCESS; |
593 | 527 | } | 557 | } |
594 | @@ -664,9 +694,9 @@ | |||
595 | 664 | gearman_packet_free(&(job->work)); | 694 | gearman_packet_free(&(job->work)); |
596 | 665 | } | 695 | } |
597 | 666 | 696 | ||
599 | 667 | if (job->worker->impl()->job_list == job) | 697 | if (job->_worker.job_list == job) |
600 | 668 | { | 698 | { |
602 | 669 | job->worker->impl()->job_list= job->next; | 699 | job->_worker.job_list= job->next; |
603 | 670 | } | 700 | } |
604 | 671 | 701 | ||
605 | 672 | if (job->prev) | 702 | if (job->prev) |
606 | @@ -678,7 +708,7 @@ | |||
607 | 678 | { | 708 | { |
608 | 679 | job->next->prev= job->prev; | 709 | job->next->prev= job->prev; |
609 | 680 | } | 710 | } |
611 | 681 | job->worker->impl()->job_count--; | 711 | job->_worker.job_count--; |
612 | 682 | 712 | ||
613 | 683 | delete job->reducer; | 713 | delete job->reducer; |
614 | 684 | job->reducer= NULL; | 714 | job->reducer= NULL; |
615 | @@ -700,7 +730,7 @@ | |||
616 | 700 | 730 | ||
617 | 701 | while ((ret == GEARMAN_IO_WAIT) or (ret == GEARMAN_TIMEOUT)) | 731 | while ((ret == GEARMAN_IO_WAIT) or (ret == GEARMAN_TIMEOUT)) |
618 | 702 | { | 732 | { |
620 | 703 | ret= gearman_wait(job->worker->impl()->universal); | 733 | ret= gearman_wait(job->universal()); |
621 | 704 | if (ret == GEARMAN_SUCCESS) | 734 | if (ret == GEARMAN_SUCCESS) |
622 | 705 | { | 735 | { |
623 | 706 | ret= job->con->send_packet(job->work, true); | 736 | ret= job->con->send_packet(job->work, true); |
624 | @@ -720,9 +750,9 @@ | |||
625 | 720 | 750 | ||
626 | 721 | const char *gearman_job_error(gearman_job_st *job) | 751 | const char *gearman_job_error(gearman_job_st *job) |
627 | 722 | { | 752 | { |
629 | 723 | if (job and job->worker) | 753 | if (job) |
630 | 724 | { | 754 | { |
632 | 725 | return gearman_worker_error(job->worker); | 755 | return job->_worker.error(); |
633 | 726 | } | 756 | } |
634 | 727 | 757 | ||
635 | 728 | return NULL; | 758 | return NULL; |
636 | 729 | 759 | ||
637 | === modified file 'libgearman/job.hpp' | |||
638 | --- libgearman/job.hpp 2012-08-19 21:00:10 +0000 | |||
639 | +++ libgearman/job.hpp 2013-07-03 01:51:27 +0000 | |||
640 | @@ -37,15 +37,32 @@ | |||
641 | 37 | 37 | ||
642 | 38 | #pragma once | 38 | #pragma once |
643 | 39 | 39 | ||
644 | 40 | #include "libgearman/interface/worker.hpp" | ||
645 | 41 | |||
646 | 40 | struct gearman_job_st | 42 | struct gearman_job_st |
647 | 41 | { | 43 | { |
648 | 44 | gearman_job_st(Worker& worker_): | ||
649 | 45 | _worker(worker_) | ||
650 | 46 | { } | ||
651 | 47 | |||
652 | 42 | struct { | 48 | struct { |
653 | 43 | bool allocated; | 49 | bool allocated; |
654 | 44 | bool assigned_in_use; | 50 | bool assigned_in_use; |
655 | 45 | bool work_in_use; | 51 | bool work_in_use; |
656 | 46 | bool finished; | 52 | bool finished; |
657 | 47 | } options; | 53 | } options; |
659 | 48 | gearman_worker_st *worker; | 54 | |
660 | 55 | bool finished() const | ||
661 | 56 | { | ||
662 | 57 | return options.finished; | ||
663 | 58 | } | ||
664 | 59 | |||
665 | 60 | void finished(const bool finished_) | ||
666 | 61 | { | ||
667 | 62 | options.finished= finished_; | ||
668 | 63 | } | ||
669 | 64 | |||
670 | 65 | Worker& _worker; | ||
671 | 49 | gearman_job_st *next; | 66 | gearman_job_st *next; |
672 | 50 | gearman_job_st *prev; | 67 | gearman_job_st *prev; |
673 | 51 | gearman_connection_st *con; | 68 | gearman_connection_st *con; |
674 | @@ -53,4 +70,9 @@ | |||
675 | 53 | gearman_packet_st work; | 70 | gearman_packet_st work; |
676 | 54 | struct gearman_job_reducer_st *reducer; | 71 | struct gearman_job_reducer_st *reducer; |
677 | 55 | gearman_return_t error_code; | 72 | gearman_return_t error_code; |
678 | 73 | |||
679 | 74 | gearman_universal_st& universal() | ||
680 | 75 | { | ||
681 | 76 | return _worker.universal; | ||
682 | 77 | } | ||
683 | 56 | }; | 78 | }; |
684 | 57 | 79 | ||
685 | === modified file 'libgearman/worker.cc' | |||
686 | --- libgearman/worker.cc 2013-06-23 08:23:26 +0000 | |||
687 | +++ libgearman/worker.cc 2013-07-03 01:51:27 +0000 | |||
688 | @@ -971,6 +971,11 @@ | |||
689 | 971 | return GEARMAN_INVALID_ARGUMENT; | 971 | return GEARMAN_INVALID_ARGUMENT; |
690 | 972 | } | 972 | } |
691 | 973 | 973 | ||
692 | 974 | void gearman_worker_reset_error(Worker& worker) | ||
693 | 975 | { | ||
694 | 976 | universal_reset_error(worker.universal); | ||
695 | 977 | } | ||
696 | 978 | |||
697 | 974 | void gearman_worker_reset_error(gearman_worker_st *worker) | 979 | void gearman_worker_reset_error(gearman_worker_st *worker) |
698 | 975 | { | 980 | { |
699 | 976 | if (worker and worker->impl()) | 981 | if (worker and worker->impl()) |
700 | @@ -1354,7 +1359,7 @@ | |||
701 | 1354 | { | 1359 | { |
702 | 1355 | if (job) | 1360 | if (job) |
703 | 1356 | { | 1361 | { |
705 | 1357 | return gearman_worker_clone(NULL, job->worker); | 1362 | return gearman_worker_clone(NULL, job->_worker.shell()); |
706 | 1358 | } | 1363 | } |
707 | 1359 | 1364 | ||
708 | 1360 | return NULL; | 1365 | return NULL; |