OLD | NEW |
1 /* | 1 /* |
2 * Copyright (c) 2013 The Native Client Authors. All rights reserved. | 2 * Copyright (c) 2013 The Native Client Authors. All rights reserved. |
3 * Use of this source code is governed by a BSD-style license that can be | 3 * Use of this source code is governed by a BSD-style license that can be |
4 * found in the LICENSE file. | 4 * found in the LICENSE file. |
5 */ | 5 */ |
6 | 6 |
7 #include "native_client/src/nonsfi/irt/irt_interfaces.h" | 7 #include "native_client/src/nonsfi/irt/irt_interfaces.h" |
8 | 8 |
9 #include <assert.h> | 9 #include <assert.h> |
10 #include <errno.h> | 10 #include <errno.h> |
(...skipping 25 matching lines...) Expand all Loading... |
36 #include "native_client/src/trusted/service_runtime/include/sys/unistd.h" | 36 #include "native_client/src/trusted/service_runtime/include/sys/unistd.h" |
37 #include "native_client/src/untrusted/irt/irt.h" | 37 #include "native_client/src/untrusted/irt/irt.h" |
38 #include "native_client/src/untrusted/irt/irt_dev.h" | 38 #include "native_client/src/untrusted/irt/irt_dev.h" |
39 #include "native_client/src/untrusted/irt/irt_interfaces.h" | 39 #include "native_client/src/untrusted/irt/irt_interfaces.h" |
40 #include "native_client/src/untrusted/nacl/nacl_random.h" | 40 #include "native_client/src/untrusted/nacl/nacl_random.h" |
41 | 41 |
42 #if defined(__native_client__) && defined(__arm__) | 42 #if defined(__native_client__) && defined(__arm__) |
43 #include "native_client/src/nonsfi/irt/irt_icache.h" | 43 #include "native_client/src/nonsfi/irt/irt_icache.h" |
44 #endif | 44 #endif |
45 | 45 |
| 46 #if defined(__native_client__) |
| 47 # include "native_client/src/nonsfi/linux/linux_pthread_private.h" |
| 48 #endif |
| 49 |
46 /* | 50 /* |
47 * This is an implementation of NaCl's IRT interfaces that runs | 51 * This is an implementation of NaCl's IRT interfaces that runs |
48 * outside of the NaCl sandbox. | 52 * outside of the NaCl sandbox. |
49 * | 53 * |
50 * This allows PNaCl to be used as a portability layer without the | 54 * This allows PNaCl to be used as a portability layer without the |
51 * SFI-based sandboxing. PNaCl pexes can be translated to | 55 * SFI-based sandboxing. PNaCl pexes can be translated to |
52 * non-SFI-sandboxed native code and linked against this IRT | 56 * non-SFI-sandboxed native code and linked against this IRT |
53 * implementation. | 57 * implementation. |
54 */ | 58 */ |
55 | 59 |
(...skipping 291 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
347 static void *start_thread(void *arg) { | 351 static void *start_thread(void *arg) { |
348 struct thread_args args = *(struct thread_args *) arg; | 352 struct thread_args args = *(struct thread_args *) arg; |
349 free(arg); | 353 free(arg); |
350 g_tls_value = args.thread_ptr; | 354 g_tls_value = args.thread_ptr; |
351 args.start_func(); | 355 args.start_func(); |
352 abort(); | 356 abort(); |
353 } | 357 } |
354 | 358 |
355 static int thread_create(void (*start_func)(void), void *stack, | 359 static int thread_create(void (*start_func)(void), void *stack, |
356 void *thread_ptr) { | 360 void *thread_ptr) { |
| 361 #if defined(__native_client__) |
| 362 struct thread_args *args = malloc(sizeof(struct thread_args)); |
| 363 if (args == NULL) { |
| 364 return ENOMEM; |
| 365 } |
| 366 args->start_func = start_func; |
| 367 args->thread_ptr = thread_ptr; |
| 368 /* In Linux, it is possible to use the provided stack directly. */ |
| 369 int error = nacl_user_thread_create(start_thread, stack, args); |
| 370 if (error != 0) |
| 371 free(args); |
| 372 return error; |
| 373 #else |
357 /* | 374 /* |
358 * For now, we ignore the stack that user code provides and just use | 375 * For now, we ignore the stack that user code provides and just use |
359 * the stack that the host libpthread allocates. | 376 * the stack that the host libpthread allocates. |
360 */ | 377 */ |
361 pthread_attr_t attr; | 378 pthread_attr_t attr; |
362 int error = pthread_attr_init(&attr); | 379 int error = pthread_attr_init(&attr); |
363 if (error != 0) | 380 if (error != 0) |
364 return error; | 381 return error; |
365 error = pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED); | 382 error = pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED); |
366 if (error != 0) | 383 if (error != 0) |
367 return error; | 384 return error; |
368 struct thread_args *args = malloc(sizeof(struct thread_args)); | 385 struct thread_args *args = malloc(sizeof(struct thread_args)); |
369 if (args == NULL) { | 386 if (args == NULL) { |
370 error = ENOMEM; | 387 error = ENOMEM; |
371 goto cleanup; | 388 goto cleanup; |
372 } | 389 } |
373 args->start_func = start_func; | 390 args->start_func = start_func; |
374 args->thread_ptr = thread_ptr; | 391 args->thread_ptr = thread_ptr; |
375 pthread_t tid; | 392 pthread_t tid; |
376 error = pthread_create(&tid, &attr, start_thread, args); | 393 error = pthread_create(&tid, &attr, start_thread, args); |
377 if (error != 0) | 394 if (error != 0) |
378 free(args); | 395 free(args); |
379 cleanup: | 396 cleanup: |
380 pthread_attr_destroy(&attr); | 397 pthread_attr_destroy(&attr); |
381 return error; | 398 return error; |
| 399 #endif |
382 } | 400 } |
383 | 401 |
384 static void thread_exit(int32_t *stack_flag) { | 402 static void thread_exit(int32_t *stack_flag) { |
| 403 #if defined(__native_client__) |
| 404 nacl_user_thread_exit(stack_flag); |
| 405 #else |
385 *stack_flag = 0; /* Indicate that the user code's stack can be freed. */ | 406 *stack_flag = 0; /* Indicate that the user code's stack can be freed. */ |
386 pthread_exit(NULL); | 407 pthread_exit(NULL); |
| 408 #endif |
387 } | 409 } |
388 | 410 |
389 static int thread_nice(const int nice) { | 411 static int thread_nice(const int nice) { |
390 return 0; | 412 return 0; |
391 } | 413 } |
392 | 414 |
393 /* | 415 /* |
394 * Mac OS X does not provide futexes or clock_gettime()/getres() natively. | 416 * Mac OS X does not provide futexes or clock_gettime()/getres() natively. |
395 * TODO(mseaborn): Make threads and clock_gettime() work on Mac OS X. | 417 * TODO(mseaborn): Make threads and clock_gettime() work on Mac OS X. |
396 */ | 418 */ |
(...skipping 356 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
753 nacl_entry_func_t entry_func = | 775 nacl_entry_func_t entry_func = |
754 #if defined(__APPLE__) | 776 #if defined(__APPLE__) |
755 _start; | 777 _start; |
756 #else | 778 #else |
757 _user_start; | 779 _user_start; |
758 #endif | 780 #endif |
759 | 781 |
760 return nacl_irt_nonsfi_entry(argc, argv, environ, entry_func); | 782 return nacl_irt_nonsfi_entry(argc, argv, environ, entry_func); |
761 } | 783 } |
762 #endif | 784 #endif |
OLD | NEW |