&& app_wrk->first_segment_manager != app_wrk->connects_seg_manager)
{
sm = segment_manager_get (app_wrk->first_segment_manager);
+ sm->first_is_protected = 0;
+ sm->app_wrk_index = SEGMENT_MANAGER_INVALID_APP_INDEX;
/* .. and has no fifos, e.g. it might be used for redirected sessions,
* remove it */
if (!segment_manager_has_fifos (sm))
- {
- sm->app_wrk_index = SEGMENT_MANAGER_INVALID_APP_INDEX;
- segment_manager_del (sm);
- }
+ segment_manager_del (sm);
}
/*
segment_manager_t *
app_worker_get_listen_segment_manager (app_worker_t * app,
- stream_session_t * s)
+ stream_session_t * listener)
{
uword *smp;
- smp = hash_get (app->listeners_table, listen_session_get_handle (s));
+ smp = hash_get (app->listeners_table, listen_session_get_handle (listener));
ASSERT (smp != 0);
return segment_manager_get (*smp);
}
evt->fifo = s->server_rx_fifo;
evt->event_type = FIFO_EVENT_APP_RX;
+ (void) svm_fifo_set_event (s->server_rx_fifo);
+
if (app_enqueue_evt (mq, &msg, lock))
return -1;
- (void) svm_fifo_set_event (s->server_rx_fifo);
return 0;
}
/**
* Send event to application
*
- * Logic from queue perspective is non-blocking. That is, if there's
- * not enough space to enqueue a message, we return. However, if the lock
- * flag is set, we do wait for queue mutex.
+ * Logic from queue perspective is non-blocking. If there's
+ * not enough space to enqueue a message, we return.
*/
int
app_worker_send_event (app_worker_t * app, stream_session_t * s, u8 evt_type)
return app_send_evt_handler_fns[evt_type] (app, s, 0 /* lock */ );
}
+/**
+ * Send event to application
+ *
+ * Logic from queue perspective is blocking. However, if queue is full,
+ * we return.
+ */
int
app_worker_lock_and_send_event (app_worker_t * app, stream_session_t * s,
u8 evt_type)
segment_manager_segment_reader_unlock (sm);
goto failed;
}
- ls->server_rx_fifo->master_session_index = ls->session_index;
- ls->server_tx_fifo->master_session_index = ls->session_index;
- ls->server_rx_fifo->master_thread_index = ~0;
- ls->server_tx_fifo->master_thread_index = ~0;
+ ls->server_rx_fifo->ct_session_index = ls->session_index;
+ ls->server_tx_fifo->ct_session_index = ls->session_index;
ls->svm_segment_index = seg_index;
ls->listener_index = ll->session_index;
ls->client_wrk_index = client_wrk->wrk_index;
local_session_t * ls)
{
svm_fifo_segment_private_t *seg;
+ stream_session_t *listener;
segment_manager_t *sm;
uword client_key;
u8 has_transport;
- has_transport = session_has_transport ((stream_session_t *) ls);
- client_key = application_client_local_connect_key (ls);
+ /* Retrieve listener transport type as it is the one that decides where
+ * the fifos are allocated */
+ has_transport = application_local_session_listener_has_transport (ls);
if (!has_transport)
sm = application_get_local_segment_manager_w_session (server_wrk, ls);
else
- sm = app_worker_get_listen_segment_manager (server_wrk,
- (stream_session_t *) ls);
+ {
+ listener = listen_session_get (ls->listener_index);
+ sm = app_worker_get_listen_segment_manager (server_wrk, listener);
+ }
seg = segment_manager_get_segment (sm, ls->svm_segment_index);
if (client_wrk)
- hash_unset (client_wrk->local_connects, client_key);
+ {
+ client_key = application_client_local_connect_key (ls);
+ hash_unset (client_wrk->local_connects, client_key);
+ }
if (!has_transport)
{