Gearman Developer Documentation

libgearman-server/client.c
Go to the documentation of this file.
00001 /* Gearman server and library
00002  * Copyright (C) 2008 Brian Aker, Eric Day
00003  * All rights reserved.
00004  *
00005  * Use and distribution licensed under the BSD license.  See
00006  * the COPYING file in the parent directory for full text.
00007  */
00008 
00014 #include "common.h"
00015 
00016 /*
00017  * Public definitions
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= (gearman_server_client_st *)malloc(sizeof(gearman_server_client_st));
00048       if (client == NULL)
00049       {
00050         gearman_log_error(con->thread->gearman, "gearman_server_client_create", "malloc");
00051         return NULL;
00052       }
00053     }
00054 
00055     client->options.allocated= true;
00056   }
00057   else
00058   {
00059     client->options.allocated= false;
00060   }
00061 
00062   client->con= con;
00063   GEARMAN_LIST_ADD(con->client, client, con_)
00064   client->job= NULL;
00065   client->job_next= NULL;
00066   client->job_prev= NULL;
00067 
00068   return client;
00069 }
00070 
00071 void gearman_server_client_free(gearman_server_client_st *client)
00072 {
00073   gearman_server_st *server= client->con->thread->server;
00074 
00075   GEARMAN_LIST_DEL(client->con->client, client, con_)
00076 
00077   if (client->job != NULL)
00078   {
00079     GEARMAN_LIST_DEL(client->job->client, client, job_)
00080 
00081     /* If this was a foreground job and is now abandoned, mark to not run. */
00082     if (client->job->client_list == NULL)
00083     {
00084       client->job->ignore_job= true;
00085       client->job->job_queued= false;
00086     }
00087   }
00088 
00089   if (client->options.allocated)
00090   {
00091     if (server->free_client_count < GEARMAN_MAX_FREE_SERVER_CLIENT)
00092       GEARMAN_LIST_ADD(server->free_client, client, con_)
00093     else
00094       free(client);
00095   }
00096 }