From 52b3525bab6a4f7ea561fa264ec0032211aece05 Mon Sep 17 00:00:00 2001 From: borysp Date: Fri, 23 Aug 2019 13:17:11 +0200 Subject: [PATCH] [LibOS] Fix nested function callbacks segfaulting --- LibOS/shim/src/ipc/shim_ipc_pid.c | 52 +++++++++++++++---------------- 1 file changed, 26 insertions(+), 26 deletions(-) diff --git a/LibOS/shim/src/ipc/shim_ipc_pid.c b/LibOS/shim/src/ipc/shim_ipc_pid.c index ac845f24..49a53e96 100644 --- a/LibOS/shim/src/ipc/shim_ipc_pid.c +++ b/LibOS/shim/src/ipc/shim_ipc_pid.c @@ -177,6 +177,32 @@ int ipc_pid_getstatus_send (struct shim_ipc_port * port, IDTYPE dest, return ret; } +struct thread_status { + int npids; + IDTYPE * pids; + int nstatus; + struct pid_status * status; +}; + +int check_thread (struct shim_thread * thread, void * arg, + bool * unlocked) +{ + __UNUSED(unlocked); // Kept for API compatibility + struct thread_status * status = (struct thread_status *) arg; + + for (int i = 0 ; i < status->npids ; i++) + if (status->pids[i] == thread->tid && + thread->in_vm && thread->is_alive) { + status->status[status->nstatus].pid = thread->tid; + status->status[status->nstatus].tgid = thread->tgid; + status->status[status->nstatus].pgid = thread->pgid; + status->nstatus++; + return 1; + } + + return 0; +} + int ipc_pid_getstatus_callback (IPC_CALLBACK_ARGS) { BEGIN_PROFILE_INTERVAL(); @@ -187,32 +213,6 @@ int ipc_pid_getstatus_callback (IPC_CALLBACK_ARGS) debug("ipc callback from %u: IPC_PID_GETSTATUS(%d, [%u, ...])\n", msg->src, msgin->npids, msgin->pids[0]); - struct thread_status { - int npids; - IDTYPE * pids; - int nstatus; - struct pid_status * status; - }; - - int check_thread (struct shim_thread * thread, void * arg, - bool * unlocked) - { - __UNUSED(unlocked); // Kept for API compatibility - struct thread_status * status = (struct thread_status *) arg; - - for (int i = 0 ; i < status->npids ; i++) - if (status->pids[i] == thread->tid && - thread->in_vm && thread->is_alive) { - status->status[status->nstatus].pid = thread->tid; - status->status[status->nstatus].tgid = thread->tgid; - status->status[status->nstatus].pgid = thread->pgid; - status->nstatus++; - return 1; - } - - return 0; - } - struct thread_status status; status.npids = msgin->npids; status.pids = msgin->pids;