Request* IOProcess::addNewRequest(const char *cmd) { if( !cmd ) { return NULL; } Request* new_req = new Request(cmd); ASSERT(new_req); dprintf( D_PERF_TRACE, "request #%d (%s): dispatch\n", new_req->m_reqid, new_req->m_args.argv[0] ); // check if there is available worker process Worker *worker = findFreeWorker(); if( !worker ) { // There is no available worker if( m_max_workers == -1 || m_avail_workers_num < m_max_workers ) { worker = createNewWorker(); } } addRequestToWorker(new_req, worker); return new_req; }
bool IOProcess::startUp(int stdin_pipe, int min_workers, int max_workers) { m_min_workers = min_workers; m_max_workers = max_workers; m_stdin_buffer.setPipeEnd(stdin_pipe); // Create initial worker processes int i = 0; for( i = 0; i < m_min_workers; i++ ) { if( createNewWorker() == NULL ) { dprintf(D_ALWAYS, "Failed to create initial workers\n"); dprintf(D_ALWAYS, "Exiting....\n"); io_process_exit(1); } } return true; }
Request* IOProcess::addNewRequest(const char *cmd) { if( !cmd ) { return NULL; } Request* new_req = new Request(cmd); ASSERT(new_req); // check if there is available worker process Worker *worker = findFreeWorker(); if( !worker ) { // There is no available worker if( m_max_workers == -1 || m_avail_workers_num < m_max_workers ) { worker = createNewWorker(); } } addRequestToWorker(new_req, worker); return new_req; }