/* callback for task completed */ void *result_worker( void * data ) { gearman_worker_st worker; int *worker_num = (int*)data; gm_log( GM_LOG_TRACE, "worker %d started\n", *worker_num ); pthread_setcancelstate (PTHREAD_CANCEL_ENABLE, NULL); pthread_setcanceltype (PTHREAD_CANCEL_ASYNCHRONOUS, NULL); set_worker(&worker); pthread_cleanup_push ( cancel_worker_thread, (void*) &worker); while ( 1 ) { gearman_return_t ret; ret = gearman_worker_work( &worker ); if ( ret != GEARMAN_SUCCESS ) { gm_log( GM_LOG_ERROR, "worker error: %s\n", gearman_worker_error( &worker ) ); gearman_job_free_all( &worker ); gearman_worker_free( &worker ); sleep(1); set_worker(&worker ); } } pthread_cleanup_pop(0); return NULL; }
void worker_client(int worker_mode, int indx, int shid, char **env) { #else void worker_client(int worker_mode, int indx, int shid) { #endif gm_log( GM_LOG_TRACE, "%s worker client started\n", (worker_mode == GM_WORKER_STATUS ? "status" : "job" )); /* set signal handlers for a clean exit */ signal(SIGINT, clean_worker_exit); signal(SIGTERM,clean_worker_exit); worker_run_mode = worker_mode; shm_index = indx; shmid = shid; current_pid = getpid(); gethostname(hostname, GM_BUFFERSIZE-1); /* create worker */ if(set_worker(&worker) != GM_OK) { gm_log( GM_LOG_ERROR, "cannot start worker\n" ); clean_worker_exit(0); _exit( EXIT_FAILURE ); } /* create client */ if ( create_client( mod_gm_opt->server_list, &client ) != GM_OK ) { gm_log( GM_LOG_ERROR, "cannot start client\n" ); clean_worker_exit(0); _exit( EXIT_FAILURE ); } /* create duplicate client */ if( mod_gm_opt->dupserver_num ) { if ( create_client_dup( mod_gm_opt->dupserver_list, &client_dup ) != GM_OK ) { gm_log( GM_LOG_ERROR, "cannot start client for duplicate server\n" ); _exit( EXIT_FAILURE ); } } #ifdef EMBEDDEDPERL if(init_embedded_perl(env) == GM_ERROR) { _exit( EXIT_FAILURE ); } #endif worker_loop(); return; }
/* main loop of jobs */ void worker_loop() { while ( 1 ) { gearman_return_t ret; /* wait for a job, otherwise exit when hit the idle timeout */ if(mod_gm_opt->idle_timeout > 0 && ( worker_run_mode == GM_WORKER_MULTI || worker_run_mode == GM_WORKER_STATUS )) { signal(SIGALRM, idle_sighandler); alarm(mod_gm_opt->idle_timeout); } signal(SIGPIPE, SIG_IGN); ret = gearman_worker_work( &worker ); if ( ret != GEARMAN_SUCCESS ) { gm_log( GM_LOG_ERROR, "worker error: %s\n", gearman_worker_error( &worker ) ); gearman_job_free_all( &worker ); gearman_worker_free( &worker ); gearman_client_free( &client ); if( mod_gm_opt->dupserver_num ) gearman_client_free( &client_dup ); /* sleep on error to avoid cpu intensive infinite loops */ sleep(sleep_time_after_error); sleep_time_after_error += 3; if(sleep_time_after_error > 60) sleep_time_after_error = 60; /* create new connections */ set_worker( &worker ); create_client( mod_gm_opt->server_list, &client ); if( mod_gm_opt->dupserver_num ) create_client_dup( mod_gm_opt->dupserver_list, &client_dup ); } } return; }