source: python/trunk/Python/thread_solaris.h

Last change on this file was 391, checked in by dmik, 11 years ago

python: Merge vendor 2.7.6 to trunk.

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