-
Notifications
You must be signed in to change notification settings - Fork 0
/
test-worker.cpp
112 lines (97 loc) · 2.84 KB
/
test-worker.cpp
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
//#include "gear_config.h"
#include <cerrno>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <iostream>
#include <signal.h>
#include <libgearman/gearman.h>
//#include <boost/program_options.hpp>
static gearman_return_t worker_function(gearman_job_st *job, void *context)
{
const char *workload= (const char *)gearman_job_workload(job);
const size_t workload_size= gearman_job_workload_size(job);
std::cout << "Recieved " << workload_size << " bytes" << std::endl;
////
char *result=new char[workload_size];
memcpy(result,workload,workload_size);
/*
*if (gearman_failed(gearman_job_send_data(job, &result[y], 1)))
{
return GEARMAN_ERROR;
}
if (gearman_failed(gearman_job_send_status(job, (uint32_t)y, (uint32_t)workload_size)))
{
return GEARMAN_ERROR;
}
// Notice that we send based on y divided by zero.
if (gearman_failed(gearman_job_send_status(job, (uint32_t)workload_size, (uint32_t)workload_size)))
{
return GEARMAN_ERROR;
}
*/
if (gearman_failed(gearman_job_send_data(job, &result[0], workload_size)))
{
return GEARMAN_ERROR;
}
}
int main()
{
if (signal(SIGPIPE, SIG_IGN) == SIG_ERR)
{
std::cerr << "signal:" << strerror(errno) << std::endl;
return EXIT_FAILURE;
}
gearman_worker_st *worker;
if ((worker= gearman_worker_create(NULL)) == NULL)
{
std::cerr << "Memory allocation failure on worker creation." << std::endl;
return EXIT_FAILURE;
}
//if (unique)
//{
gearman_worker_add_options(worker, GEARMAN_WORKER_GRAB_UNIQ);
//}
int timeout=-1;
//
if (timeout >= 0)
{
gearman_worker_set_timeout(worker, timeout);
}
if (gearman_failed(gearman_worker_add_server(worker, "localhost", GEARMAN_DEFAULT_TCP_PORT)))
{
std::cerr << gearman_worker_error(worker) << std::endl;
return EXIT_FAILURE;
}
if (gearman_failed(gearman_worker_set_identifier(worker, "worker1", strlen("worker1"))))
{
std::cerr << gearman_worker_error(worker) << std::endl;
return EXIT_FAILURE;
}
gearman_function_t worker_fn= gearman_function_create(worker_function);
if (gearman_failed(gearman_worker_define_function(worker,
gearman_literal_param("make_call"),
worker_fn,
0,
NULL/*&options*/)))
{
std::cerr << gearman_worker_error(worker) << std::endl;
return EXIT_FAILURE;
}
int limit=0;
// Add one if count is not zero
if (limit != 0)
{
limit++;
}
while (--limit)
{
if (gearman_failed(gearman_worker_work(worker)))
{
std::cerr << gearman_worker_error(worker) << std::endl;
break;
}
}
gearman_worker_free(worker);
return EXIT_SUCCESS;
}