Multi-thread enablement for the debug cli http server

Change-Id: Iec1f739fe24c722d0db6c10cc81b5e8333067ea1
Signed-off-by: Dave Barach <dbarach@cisco.com>
This commit is contained in:
Dave Barach
2017-05-10 13:34:04 -04:00
committed by Damjan Marion
parent 3335693cc1
commit e5f1d27695
3 changed files with 35 additions and 2 deletions

View File

@ -401,6 +401,7 @@ session_queue_node_fn (vlib_main_t * vm, vlib_node_runtime_t * node,
u32 my_thread_index = vm->thread_index;
int i, rv;
f64 now = vlib_time_now (vm);
void (*fp) (void *);
SESSION_EVT_DBG (SESSION_EVT_POLL_GAP_TRACK, smm, my_thread_index);
@ -496,6 +497,11 @@ skip_dequeue:
app = application_get (s0->app_index);
app->cb_fns.builtin_server_rx_callback (s0);
break;
case FIFO_EVENT_RPC:
fp = e0->rpc_args.fp;
(*fp) (e0->rpc_args.arg);
break;
default:
clib_warning ("unhandled event type %d", e0->event_type);
}

View File

@ -32,7 +32,8 @@ typedef enum
FIFO_EVENT_APP_TX,
FIFO_EVENT_TIMEOUT,
FIFO_EVENT_DISCONNECT,
FIFO_EVENT_BUILTIN_RX
FIFO_EVENT_BUILTIN_RX,
FIFO_EVENT_RPC,
} fifo_event_type_t;
#define foreach_session_input_error \
@ -91,12 +92,19 @@ typedef enum
SESSION_STATE_N_STATES,
} stream_session_state_t;
typedef struct
{
void *fp;
void *arg;
} rpc_args_t;
/* *INDENT-OFF* */
typedef CLIB_PACKED (struct {
union
{
svm_fifo_t * fifo;
u64 session_handle;
rpc_args_t rpc_args;
};
u8 event_type;
u16 event_id;

View File

@ -385,6 +385,13 @@ builtin_redirect_connect_callback (u32 client_index, void *mp)
return -1;
}
static void
alloc_http_process_callback (void *s_arg)
{
stream_session_t *s = (stream_session_t *) s_arg;
alloc_http_process (s);
}
static int
http_server_rx_callback (stream_session_t * s)
{
@ -414,7 +421,19 @@ http_server_rx_callback (stream_session_t * s)
/* send the command to a new/recycled vlib process */
s->opaque[1] = (u64) vec_dup (hsm->rx_buf);
alloc_http_process (s);
/* Send an RPC request via the thread-0 input node */
if (vlib_get_thread_index () != 0)
{
session_fifo_event_t evt;
evt.rpc_args.fp = alloc_http_process_callback;
evt.rpc_args.arg = s;
evt.event_type = FIFO_EVENT_RPC;
unix_shared_memory_queue_add
(session_manager_get_vpp_event_queue (0 /* main thread */ ),
(u8 *) & evt, 0 /* do wait for mutex */ );
}
else
alloc_http_process (s);
return 0;
}