From fdc66c660ce12187023ef9834d3c8d5ad61b7822 Mon Sep 17 00:00:00 2001 From: Johan Wikman Date: Mon, 13 Feb 2017 15:37:05 +0200 Subject: [PATCH] Require that thread_data can be allocated The allocation of the thread_data that is populated by the polling mechanism must now succeed, or the process will exit. It's very unlikely it would ever fail and it is unlikely MaxScale could would function if it it did fail. Consequently, checks for its validity, which anyway weren't done correctly everywhere, could be removed. --- server/core/poll.c | 72 ++++++++++++++++------------------------------ 1 file changed, 25 insertions(+), 47 deletions(-) diff --git a/server/core/poll.c b/server/core/poll.c index f6884d55f..b6f3dafbb 100644 --- a/server/core/poll.c +++ b/server/core/poll.c @@ -240,7 +240,8 @@ poll_init() if ((epoll_fd[i] = epoll_create(MAX_EVENTS)) == -1) { char errbuf[MXS_STRERROR_BUFLEN]; - MXS_ERROR("FATAL: Could not create epoll instance: %s", strerror_r(errno, errbuf, sizeof(errbuf))); + MXS_ERROR("FATAL: Could not create epoll instance: %s", + strerror_r(errno, errbuf, sizeof(errbuf))); exit(-1); } } @@ -268,12 +269,14 @@ poll_init() memset(&pollStats, 0, sizeof(pollStats)); memset(&queueStats, 0, sizeof(queueStats)); thread_data = (THREAD_DATA *)MXS_MALLOC(n_threads * sizeof(THREAD_DATA)); - if (thread_data) + if (!thread_data) { - for (int i = 0; i < n_threads; i++) - { - thread_data[i].state = THREAD_STOPPED; - } + exit(-1); + } + + for (int i = 0; i < n_threads; i++) + { + thread_data[i].state = THREAD_STOPPED; } if ((pollStats.n_read = ts_stats_alloc()) == NULL || @@ -656,10 +659,7 @@ poll_waitevents(void *arg) thread_id = (intptr_t)arg; int poll_spins = 0; - if (thread_data) - { - thread_data[thread_id].state = THREAD_IDLE; - } + thread_data[thread_id].state = THREAD_IDLE; while (1) { @@ -671,10 +671,7 @@ poll_waitevents(void *arg) #if MUTEX_EPOLL simple_mutex_lock(&epoll_wait_mutex, TRUE); #endif - if (thread_data) - { - thread_data[thread_id].state = THREAD_POLLING; - } + thread_data[thread_id].state = THREAD_POLLING; ts_stats_increment(pollStats.n_polls, thread_id); if ((nfds = epoll_wait(epoll_fd[thread_id], events, MAX_EVENTS, 0)) == -1) @@ -741,13 +738,11 @@ poll_waitevents(void *arg) pthread_self(), nfds); ts_stats_increment(pollStats.n_pollev, thread_id); - if (thread_data) - { - thread_data[thread_id].n_fds = nfds; - thread_data[thread_id].cur_dcb = NULL; - thread_data[thread_id].event = 0; - thread_data[thread_id].state = THREAD_PROCESSING; - } + + thread_data[thread_id].n_fds = nfds; + thread_data[thread_id].cur_dcb = NULL; + thread_data[thread_id].event = 0; + thread_data[thread_id].state = THREAD_PROCESSING; pollStats.n_fds[(nfds < MAXNFDS ? (nfds - 1) : MAXNFDS - 1)]++; @@ -802,20 +797,14 @@ poll_waitevents(void *arg) dcb_process_idle_sessions(thread_id); - if (thread_data) - { - thread_data[thread_id].state = THREAD_ZPROCESSING; - } + thread_data[thread_id].state = THREAD_ZPROCESSING; /** Process closed DCBs */ dcb_process_zombies(thread_id); poll_check_message(); - if (thread_data) - { - thread_data[thread_id].state = THREAD_IDLE; - } + thread_data[thread_id].state = THREAD_IDLE; if (do_shutdown) { @@ -823,16 +812,11 @@ poll_waitevents(void *arg) * Remove the thread from the bitmask of running * polling threads. */ - if (thread_data) - { - thread_data[thread_id].state = THREAD_STOPPED; - } + thread_data[thread_id].state = THREAD_STOPPED; return; } - if (thread_data) - { - thread_data[thread_id].state = THREAD_IDLE; - } + + thread_data[thread_id].state = THREAD_IDLE; } /*< while(1) */ } @@ -909,12 +893,10 @@ process_pollq(int thread_id, struct epoll_event *event) ts_stats_set_max(queueStats.maxqtime, qtime, thread_id); CHK_DCB(dcb); - if (thread_data) - { - thread_data[thread_id].state = THREAD_PROCESSING; - thread_data[thread_id].cur_dcb = dcb; - thread_data[thread_id].event = ev; - } + + thread_data[thread_id].state = THREAD_PROCESSING; + thread_data[thread_id].cur_dcb = dcb; + thread_data[thread_id].event = ev; /* It isn't obvious that this is impossible */ /* ss_dassert(dcb->state != DCB_STATE_DISCONNECTED); */ @@ -1335,10 +1317,6 @@ dShowThreads(DCB *dcb) dcb_printf(dcb, "15 Minute Average: %.2f, 5 Minute Average: %.2f, " "1 Minute Average: %.2f\n\n", qavg15, qavg5, qavg1); - if (thread_data == NULL) - { - return; - } dcb_printf(dcb, " ID | State | # fds | Descriptor | Running | Event\n"); dcb_printf(dcb, "----+------------+--------+------------------+----------+---------------\n"); for (i = 0; i < n_threads; i++)