1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 | Python/thread_solaris.h
#include <stdlib.h> #include <stdio.h> #include <errno.h> #include </usr/include/thread.h> #undef _POSIX_THREADS /* * Initialization. */ static void PyThread__init_thread(void) { } /* * Thread support. */ struct func_arg { void (*func)(void *); void *arg; }; static void * new_func(void *funcarg) { void (*func)(void *); void *arg; func = ((struct func_arg *) funcarg)->func; arg = ((struct func_arg *) funcarg)->arg; free(funcarg); (*func)(arg); return 0; } long PyThread_start_new_thread(void (*func)(void *), void *arg) { thread_t tid; struct func_arg *funcarg; dprintf(("PyThread_start_new_thread called\n")); if (!initialized) PyThread_init_thread(); funcarg = (struct func_arg *) malloc(sizeof(struct func_arg)); funcarg->func = func; funcarg->arg = arg; if (thr_create(0, 0, new_func, funcarg, THR_DETACHED | THR_NEW_LWP, &tid)) { perror("thr_create"); free((void *) funcarg); return -1; } return tid; } long PyThread_get_thread_ident(void) { if (!initialized) PyThread_init_thread(); return thr_self(); } void PyThread_exit_thread(void) { dprintf(("PyThread_exit_thread called\n")); if (!initialized) exit(0); thr_exit(0); } /* * Lock support. */ PyThread_type_lock PyThread_allocate_lock(void) { mutex_t *lock; dprintf(("PyThread_allocate_lock called\n")); if (!initialized) PyThread_init_thread(); lock = (mutex_t *) malloc(sizeof(mutex_t)); if (mutex_init(lock, USYNC_THREAD, 0)) { perror("mutex_init"); free((void *) lock); lock = 0; } dprintf(("PyThread_allocate_lock() -> %p\n", lock)); return (PyThread_type_lock) lock; } void PyThread_free_lock(PyThread_type_lock lock) { dprintf(("PyThread_free_lock(%p) called\n", lock)); mutex_destroy((mutex_t *) lock); free((void *) lock); } int PyThread_acquire_lock(PyThread_type_lock lock, int waitflag) { int success; dprintf(("PyThread_acquire_lock(%p, %d) called\n", lock, waitflag)); if (waitflag) success = mutex_lock((mutex_t *) lock); else success = mutex_trylock((mutex_t *) lock); if (success < 0) perror(waitflag ? "mutex_lock" : "mutex_trylock"); else success = !success; /* solaris does it the other way round */ dprintf(("PyThread_acquire_lock(%p, %d) -> %d\n", lock, waitflag, success)); return success; } void PyThread_release_lock(PyThread_type_lock lock) { dprintf(("PyThread_release_lock(%p) called\n", lock)); if (mutex_unlock((mutex_t *) lock)) perror("mutex_unlock"); } |