|  | @@ -844,6 +844,11 @@ static grpc_error *pollset_work(grpc_exec_ctx *exec_ctx, grpc_pollset *pollset,
 | 
	
		
			
				|  |  |    *worker_hdl = &worker;
 | 
	
		
			
				|  |  |    grpc_error *error = GRPC_ERROR_NONE;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +  /* Avoid malloc for small number of elements. */
 | 
	
		
			
				|  |  | +  enum { inline_elements = 96 };
 | 
	
		
			
				|  |  | +  struct pollfd pollfd_space[inline_elements];
 | 
	
		
			
				|  |  | +  struct grpc_fd_watcher watcher_space[inline_elements];
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |    /* pollset->mu already held */
 | 
	
		
			
				|  |  |    int added_worker = 0;
 | 
	
		
			
				|  |  |    int locked = 1;
 | 
	
	
		
			
				|  | @@ -899,15 +904,23 @@ static grpc_error *pollset_work(grpc_exec_ctx *exec_ctx, grpc_pollset *pollset,
 | 
	
		
			
				|  |  |        int r;
 | 
	
		
			
				|  |  |        size_t i, fd_count;
 | 
	
		
			
				|  |  |        nfds_t pfd_count;
 | 
	
		
			
				|  |  | -      /* TODO(ctiller): inline some elements to avoid an allocation */
 | 
	
		
			
				|  |  |        grpc_fd_watcher *watchers;
 | 
	
		
			
				|  |  |        struct pollfd *pfds;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |        timeout = poll_deadline_to_millis_timeout(deadline, now);
 | 
	
		
			
				|  |  | -      /* TODO(ctiller): perform just one malloc here if we exceed the inline
 | 
	
		
			
				|  |  | -       * case */
 | 
	
		
			
				|  |  | -      pfds = gpr_malloc(sizeof(*pfds) * (pollset->fd_count + 2));
 | 
	
		
			
				|  |  | -      watchers = gpr_malloc(sizeof(*watchers) * (pollset->fd_count + 2));
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +      if (pollset->fd_count + 2 <= inline_elements) {
 | 
	
		
			
				|  |  | +        pfds = pollfd_space;
 | 
	
		
			
				|  |  | +        watchers = watcher_space;
 | 
	
		
			
				|  |  | +      } else {
 | 
	
		
			
				|  |  | +        /* Allocate one buffer to hold both pfds and watchers arrays */
 | 
	
		
			
				|  |  | +        const size_t pfd_size = sizeof(*pfds) * (pollset->fd_count + 2);
 | 
	
		
			
				|  |  | +        const size_t watch_size = sizeof(*watchers) * (pollset->fd_count + 2);
 | 
	
		
			
				|  |  | +        void *buf = gpr_malloc(pfd_size + watch_size);
 | 
	
		
			
				|  |  | +        pfds = buf;
 | 
	
		
			
				|  |  | +        watchers = (void *)((char *)buf + pfd_size);
 | 
	
		
			
				|  |  | +      }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |        fd_count = 0;
 | 
	
		
			
				|  |  |        pfd_count = 2;
 | 
	
		
			
				|  |  |        pfds[0].fd = GRPC_WAKEUP_FD_GET_READ_FD(&grpc_global_wakeup_fd);
 | 
	
	
		
			
				|  | @@ -974,8 +987,11 @@ static grpc_error *pollset_work(grpc_exec_ctx *exec_ctx, grpc_pollset *pollset,
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  |        }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -      gpr_free(pfds);
 | 
	
		
			
				|  |  | -      gpr_free(watchers);
 | 
	
		
			
				|  |  | +      if (pfds != pollfd_space) {
 | 
	
		
			
				|  |  | +        /* pfds and watchers are in the same memory block pointed to by pfds */
 | 
	
		
			
				|  |  | +        gpr_free(pfds);
 | 
	
		
			
				|  |  | +      }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |        GPR_TIMER_END("maybe_work_and_unlock", 0);
 | 
	
		
			
				|  |  |        locked = 0;
 | 
	
		
			
				|  |  |      } else {
 |