Index: src/nonsfi/irt/irt_interfaces.c |
diff --git a/src/nonsfi/irt/irt_interfaces.c b/src/nonsfi/irt/irt_interfaces.c |
index f0e0c01c0a312330a4b37aa46c18401b97af339f..6294cda080fff86dac79d2ac58f7378f3a91540a 100644 |
--- a/src/nonsfi/irt/irt_interfaces.c |
+++ b/src/nonsfi/irt/irt_interfaces.c |
@@ -28,7 +28,6 @@ |
#include "native_client/src/include/nacl/nacl_exception.h" |
#include "native_client/src/include/nacl_macros.h" |
#include "native_client/src/public/irt_core.h" |
-#include "native_client/src/public/nonsfi/irt_exception_handling.h" |
#include "native_client/src/trusted/service_runtime/include/machine/_types.h" |
#include "native_client/src/trusted/service_runtime/include/sys/mman.h" |
#include "native_client/src/trusted/service_runtime/include/sys/stat.h" |
@@ -44,6 +43,7 @@ |
#endif |
#if defined(__native_client__) |
+# include "native_client/src/nonsfi/linux/irt_signal_handling.h" |
# include "native_client/src/nonsfi/linux/linux_pthread_private.h" |
#endif |
@@ -366,9 +366,9 @@ static void *start_thread(void *arg) { |
abort(); |
} |
-static int thread_create(void (*start_func)(void), void *stack, |
- void *thread_ptr) { |
#if defined(__native_client__) |
+static int thread_create_nonsfi(void (*start_func)(void), void *stack, |
+ void *thread_ptr, nacl_irt_tid_t *child_tid) { |
struct thread_args *args = malloc(sizeof(struct thread_args)); |
if (args == NULL) { |
return ENOMEM; |
@@ -376,10 +376,25 @@ static int thread_create(void (*start_func)(void), void *stack, |
args->start_func = start_func; |
args->thread_ptr = thread_ptr; |
/* In Linux, it is possible to use the provided stack directly. */ |
- int error = nacl_user_thread_create(start_thread, stack, args); |
+ int error = nacl_user_thread_create(start_thread, stack, args, child_tid); |
if (error != 0) |
free(args); |
return error; |
+} |
+ |
+static void thread_exit_nonsfi(int32_t *stack_flag) { |
+ nacl_user_thread_exit(stack_flag); |
+} |
+#endif |
+ |
+static int thread_create(void (*start_func)(void), void *stack, |
+ void *thread_ptr) { |
+#if defined(__native_client__) |
+ /* |
+ * When available, use the nonsfi version that does allow the |stack| to be |
+ * set in the new thread. |
+ */ |
+ return thread_create_nonsfi(start_func, stack, thread_ptr, NULL); |
#else |
/* |
* For now, we ignore the stack that user code provides and just use |
@@ -411,7 +426,11 @@ static int thread_create(void (*start_func)(void), void *stack, |
static void thread_exit(int32_t *stack_flag) { |
#if defined(__native_client__) |
- nacl_user_thread_exit(stack_flag); |
+ /* |
+ * Since we used the nonsfi version of thread_create, we must also call the |
+ * nonsfi version of thread_exit to correctly clean it up. |
+ */ |
+ thread_exit_nonsfi(stack_flag); |
#else |
*stack_flag = 0; /* Indicate that the user code's stack can be freed. */ |
pthread_exit(NULL); |
@@ -662,6 +681,14 @@ const struct nacl_irt_thread nacl_irt_thread = { |
thread_nice, |
}; |
+#if defined(__native_client__) |
+const struct nacl_irt_thread_v0_2 nacl_irt_thread_v0_2 = { |
+ thread_create_nonsfi, |
+ thread_exit_nonsfi, |
+ thread_nice, |
+}; |
+#endif |
+ |
#if defined(__linux__) |
const struct nacl_irt_futex nacl_irt_futex = { |
futex_wait_abs, |
@@ -721,6 +748,11 @@ const struct nacl_irt_exception_handling nacl_irt_exception_handling = { |
nacl_exception_set_stack, |
nacl_exception_clear_flag, |
}; |
+ |
+const struct nacl_irt_async_signal_handling nacl_irt_async_signal_handling = { |
+ nacl_async_signal_set_handler, |
+ nacl_async_signal_send_async_signal, |
+}; |
#endif |
#if defined(__native_client__) && defined(__arm__) |
@@ -747,6 +779,10 @@ static const struct nacl_irt_interface irt_interfaces[] = { |
{ NACL_IRT_MEMORY_v0_3, &nacl_irt_memory, sizeof(nacl_irt_memory), NULL }, |
{ NACL_IRT_TLS_v0_1, &nacl_irt_tls, sizeof(nacl_irt_tls), NULL }, |
{ NACL_IRT_THREAD_v0_1, &nacl_irt_thread, sizeof(nacl_irt_thread), NULL }, |
+#if defined(__native_client__) |
+ { NACL_IRT_THREAD_v0_2, &nacl_irt_thread_v0_2, |
+ sizeof(nacl_irt_thread_v0_2), NULL }, |
+#endif |
{ NACL_IRT_FUTEX_v0_1, &nacl_irt_futex, sizeof(nacl_irt_futex), NULL }, |
{ NACL_IRT_RANDOM_v0_1, &nacl_irt_random, sizeof(nacl_irt_random), NULL }, |
#if defined(__linux__) || defined(__native_client__) |
@@ -759,6 +795,8 @@ static const struct nacl_irt_interface irt_interfaces[] = { |
#if defined(__native_client__) |
{ NACL_IRT_EXCEPTION_HANDLING_v0_1, &nacl_irt_exception_handling, |
sizeof(nacl_irt_exception_handling), NULL }, |
+ { NACL_IRT_ASYNC_SIGNAL_HANDLING_v0_1, &nacl_irt_async_signal_handling, |
+ sizeof(nacl_irt_async_signal_handling), NULL }, |
#endif |
#if defined(__native_client__) && defined(__arm__) |
{ NACL_IRT_ICACHE_v0_1, &nacl_irt_icache, sizeof(nacl_irt_icache), NULL }, |