00001
00002
00003
00004
00005
00006
00007
00008
00014 #include "common.h"
00015
00016
00017
00018
00019
00020 gearman_server_client_st *
00021 gearman_server_client_add(gearman_server_con_st *con)
00022 {
00023 gearman_server_client_st *client;
00024
00025 client= gearman_server_client_create(con, NULL);
00026 if (client == NULL)
00027 return NULL;
00028
00029 return client;
00030 }
00031
00032 gearman_server_client_st *
00033 gearman_server_client_create(gearman_server_con_st *con,
00034 gearman_server_client_st *client)
00035 {
00036 gearman_server_st *server= con->thread->server;
00037
00038 if (client == NULL)
00039 {
00040 if (server->free_client_count > 0)
00041 {
00042 client= server->free_client_list;
00043 GEARMAN_LIST_DEL(server->free_client, client, con_)
00044 }
00045 else
00046 {
00047 client= malloc(sizeof(gearman_server_client_st));
00048 if (client == NULL)
00049 {
00050 GEARMAN_ERROR_SET(con->thread->gearman, "gearman_server_client_create",
00051 "malloc")
00052 return NULL;
00053 }
00054 }
00055
00056 client->options= GEARMAN_SERVER_CLIENT_ALLOCATED;
00057 }
00058 else
00059 client->options= 0;
00060
00061 client->con= con;
00062 GEARMAN_LIST_ADD(con->client, client, con_)
00063 client->job= NULL;
00064 client->job_next= NULL;
00065 client->job_prev= NULL;
00066
00067 return client;
00068 }
00069
00070 void gearman_server_client_free(gearman_server_client_st *client)
00071 {
00072 gearman_server_st *server= client->con->thread->server;
00073
00074 GEARMAN_LIST_DEL(client->con->client, client, con_)
00075
00076 if (client->job != NULL)
00077 {
00078 GEARMAN_LIST_DEL(client->job->client, client, job_)
00079
00080
00081 if (client->job->client_list == NULL)
00082 client->job->options|= GEARMAN_SERVER_JOB_IGNORE;
00083 }
00084
00085 if (client->options & GEARMAN_SERVER_CLIENT_ALLOCATED)
00086 {
00087 if (server->free_client_count < GEARMAN_MAX_FREE_SERVER_CLIENT)
00088 GEARMAN_LIST_ADD(server->free_client, client, con_)
00089 else
00090 free(client);
00091 }
00092 }