00001
00002
00003
00004
00005
00006
00007
00008
00014 #include "common.h"
00015
00016
00017
00018
00019
00020 gearman_server_worker_st *
00021 gearman_server_worker_add(gearman_server_con_st *con, const char *function_name,
00022 size_t function_name_size, uint32_t timeout)
00023 {
00024 gearman_server_worker_st *worker;
00025 gearman_server_function_st *function;
00026
00027 function= gearman_server_function_get(con->thread->server, function_name,
00028 function_name_size);
00029 if (function == NULL)
00030 return NULL;
00031
00032 worker= gearman_server_worker_create(con, function, NULL);
00033 if (worker == NULL)
00034 return NULL;
00035
00036 worker->timeout= timeout;
00037
00038 return worker;
00039 }
00040
00041 gearman_server_worker_st *
00042 gearman_server_worker_create(gearman_server_con_st *con,
00043 gearman_server_function_st *function,
00044 gearman_server_worker_st *worker)
00045 {
00046 gearman_server_st *server= con->thread->server;
00047
00048 if (worker == NULL)
00049 {
00050 if (server->free_worker_count > 0)
00051 {
00052 worker= server->free_worker_list;
00053 GEARMAN_LIST_DEL(server->free_worker, worker, con_)
00054 }
00055 else
00056 {
00057 worker= malloc(sizeof(gearman_server_worker_st));
00058 if (worker == NULL)
00059 {
00060 GEARMAN_ERROR_SET(con->thread->gearman, "gearman_server_worker_create",
00061 "malloc")
00062 return NULL;
00063 }
00064 }
00065
00066 worker->options= GEARMAN_SERVER_WORKER_ALLOCATED;
00067 }
00068 else
00069 worker->options= 0;
00070
00071 worker->job_count= 0;
00072 worker->timeout= 0;
00073 worker->con= con;
00074 GEARMAN_LIST_ADD(con->worker, worker, con_)
00075 worker->function= function;
00076 GEARMAN_LIST_ADD(function->worker, worker, function_)
00077 worker->job_list= NULL;
00078
00079 return worker;
00080 }
00081
00082 void gearman_server_worker_free(gearman_server_worker_st *worker)
00083 {
00084 gearman_server_st *server= worker->con->thread->server;
00085
00086
00087 while (worker->job_list != NULL)
00088 (void)gearman_server_job_queue(worker->job_list);
00089
00090 GEARMAN_LIST_DEL(worker->con->worker, worker, con_)
00091 GEARMAN_LIST_DEL(worker->function->worker, worker, function_)
00092
00093 if (worker->options & GEARMAN_SERVER_WORKER_ALLOCATED)
00094 {
00095 if (server->free_worker_count < GEARMAN_MAX_FREE_SERVER_WORKER)
00096 GEARMAN_LIST_ADD(server->free_worker, worker, con_)
00097 else
00098 free(worker);
00099 }
00100 }