thread_cthread.h revision a6e975801e37bef27deb3207f6fc8f0c59affb46
12c8cb9f3d240fd2acd098590d2e18445bd8a40bbGuido van Rossum
2a6e975801e37bef27deb3207f6fc8f0c59affb46Martin v. Löwis#ifdef MACH_C_THREADS
33ecebf17324b138a9d10ad429c0ad55ab5de1682Guido van Rossum#include <mach/cthreads.h>
4a6e975801e37bef27deb3207f6fc8f0c59affb46Martin v. Löwis#endif
52c8cb9f3d240fd2acd098590d2e18445bd8a40bbGuido van Rossum
6a6e975801e37bef27deb3207f6fc8f0c59affb46Martin v. Löwis#ifdef HURD_C_THREADS
7a6e975801e37bef27deb3207f6fc8f0c59affb46Martin v. Löwis#include <cthreads.h>
8a6e975801e37bef27deb3207f6fc8f0c59affb46Martin v. Löwis#endif
92c8cb9f3d240fd2acd098590d2e18445bd8a40bbGuido van Rossum
102c8cb9f3d240fd2acd098590d2e18445bd8a40bbGuido van Rossum/*
112c8cb9f3d240fd2acd098590d2e18445bd8a40bbGuido van Rossum * Initialization.
122c8cb9f3d240fd2acd098590d2e18445bd8a40bbGuido van Rossum */
13f70ef4f8606f99744252a804229d53a4d97601c1Thomas Woutersstatic void
14f70ef4f8606f99744252a804229d53a4d97601c1Thomas WoutersPyThread__init_thread(void)
152c8cb9f3d240fd2acd098590d2e18445bd8a40bbGuido van Rossum{
16a6e975801e37bef27deb3207f6fc8f0c59affb46Martin v. Löwis#ifndef HURD_C_THREADS
17a6e975801e37bef27deb3207f6fc8f0c59affb46Martin v. Löwis	/* Roland McGrath said this should not be used since this is
18a6e975801e37bef27deb3207f6fc8f0c59affb46Martin v. Löwis	done while linking to threads */
19a6e975801e37bef27deb3207f6fc8f0c59affb46Martin v. Löwis	cthread_init();
20a6e975801e37bef27deb3207f6fc8f0c59affb46Martin v. Löwis#else
21a6e975801e37bef27deb3207f6fc8f0c59affb46Martin v. Löwis/* do nothing */
22a6e975801e37bef27deb3207f6fc8f0c59affb46Martin v. Löwis	;
23a6e975801e37bef27deb3207f6fc8f0c59affb46Martin v. Löwis#endif
242c8cb9f3d240fd2acd098590d2e18445bd8a40bbGuido van Rossum}
252c8cb9f3d240fd2acd098590d2e18445bd8a40bbGuido van Rossum
262c8cb9f3d240fd2acd098590d2e18445bd8a40bbGuido van Rossum/*
272c8cb9f3d240fd2acd098590d2e18445bd8a40bbGuido van Rossum * Thread support.
282c8cb9f3d240fd2acd098590d2e18445bd8a40bbGuido van Rossum */
293c28863e081986a232d4d2bba3cd9b63e14263c0Guido van Rossumlong
30128bcf4520254bc7f52ba186fa02cd1c279c7591Guido van RossumPyThread_start_new_thread(void (*func)(void *), void *arg)
312c8cb9f3d240fd2acd098590d2e18445bd8a40bbGuido van Rossum{
322c8cb9f3d240fd2acd098590d2e18445bd8a40bbGuido van Rossum	int success = 0;	/* init not needed when SOLARIS_THREADS and */
332c8cb9f3d240fd2acd098590d2e18445bd8a40bbGuido van Rossum				/* C_THREADS implemented properly */
342c8cb9f3d240fd2acd098590d2e18445bd8a40bbGuido van Rossum
3565d5b5763c6bbd99d2e2c6b219570f4562382ff0Guido van Rossum	dprintf(("PyThread_start_new_thread called\n"));
362c8cb9f3d240fd2acd098590d2e18445bd8a40bbGuido van Rossum	if (!initialized)
3765d5b5763c6bbd99d2e2c6b219570f4562382ff0Guido van Rossum		PyThread_init_thread();
383ecebf17324b138a9d10ad429c0ad55ab5de1682Guido van Rossum	/* looks like solaris detaches the thread to never rejoin
393ecebf17324b138a9d10ad429c0ad55ab5de1682Guido van Rossum	 * so well do it here
403ecebf17324b138a9d10ad429c0ad55ab5de1682Guido van Rossum	 */
413ecebf17324b138a9d10ad429c0ad55ab5de1682Guido van Rossum	cthread_detach(cthread_fork((cthread_fn_t) func, arg));
423c28863e081986a232d4d2bba3cd9b63e14263c0Guido van Rossum	return success < 0 ? -1 : 0;
432c8cb9f3d240fd2acd098590d2e18445bd8a40bbGuido van Rossum}
442c8cb9f3d240fd2acd098590d2e18445bd8a40bbGuido van Rossum
45f70ef4f8606f99744252a804229d53a4d97601c1Thomas Wouterslong
46f70ef4f8606f99744252a804229d53a4d97601c1Thomas WoutersPyThread_get_thread_ident(void)
47e944da8916e053a6a1deda8ce3fa61304d68f872Guido van Rossum{
48e944da8916e053a6a1deda8ce3fa61304d68f872Guido van Rossum	if (!initialized)
4965d5b5763c6bbd99d2e2c6b219570f4562382ff0Guido van Rossum		PyThread_init_thread();
503ecebf17324b138a9d10ad429c0ad55ab5de1682Guido van Rossum	return (long) cthread_self();
51e944da8916e053a6a1deda8ce3fa61304d68f872Guido van Rossum}
52e944da8916e053a6a1deda8ce3fa61304d68f872Guido van Rossum
53f70ef4f8606f99744252a804229d53a4d97601c1Thomas Woutersstatic void
54f70ef4f8606f99744252a804229d53a4d97601c1Thomas Woutersdo_PyThread_exit_thread(int no_cleanup)
552c8cb9f3d240fd2acd098590d2e18445bd8a40bbGuido van Rossum{
5665d5b5763c6bbd99d2e2c6b219570f4562382ff0Guido van Rossum	dprintf(("PyThread_exit_thread called\n"));
572c8cb9f3d240fd2acd098590d2e18445bd8a40bbGuido van Rossum	if (!initialized)
582c8cb9f3d240fd2acd098590d2e18445bd8a40bbGuido van Rossum		if (no_cleanup)
592c8cb9f3d240fd2acd098590d2e18445bd8a40bbGuido van Rossum			_exit(0);
602c8cb9f3d240fd2acd098590d2e18445bd8a40bbGuido van Rossum		else
612c8cb9f3d240fd2acd098590d2e18445bd8a40bbGuido van Rossum			exit(0);
622c8cb9f3d240fd2acd098590d2e18445bd8a40bbGuido van Rossum	cthread_exit(0);
632c8cb9f3d240fd2acd098590d2e18445bd8a40bbGuido van Rossum}
642c8cb9f3d240fd2acd098590d2e18445bd8a40bbGuido van Rossum
65f70ef4f8606f99744252a804229d53a4d97601c1Thomas Woutersvoid
66f70ef4f8606f99744252a804229d53a4d97601c1Thomas WoutersPyThread_exit_thread(void)
672c8cb9f3d240fd2acd098590d2e18445bd8a40bbGuido van Rossum{
6865d5b5763c6bbd99d2e2c6b219570f4562382ff0Guido van Rossum	do_PyThread_exit_thread(0);
692c8cb9f3d240fd2acd098590d2e18445bd8a40bbGuido van Rossum}
702c8cb9f3d240fd2acd098590d2e18445bd8a40bbGuido van Rossum
71f70ef4f8606f99744252a804229d53a4d97601c1Thomas Woutersvoid
72f70ef4f8606f99744252a804229d53a4d97601c1Thomas WoutersPyThread__exit_thread(void)
732c8cb9f3d240fd2acd098590d2e18445bd8a40bbGuido van Rossum{
7465d5b5763c6bbd99d2e2c6b219570f4562382ff0Guido van Rossum	do_PyThread_exit_thread(1);
752c8cb9f3d240fd2acd098590d2e18445bd8a40bbGuido van Rossum}
762c8cb9f3d240fd2acd098590d2e18445bd8a40bbGuido van Rossum
772c8cb9f3d240fd2acd098590d2e18445bd8a40bbGuido van Rossum#ifndef NO_EXIT_PROG
78f70ef4f8606f99744252a804229d53a4d97601c1Thomas Woutersstatic
79f70ef4f8606f99744252a804229d53a4d97601c1Thomas Woutersvoid do_PyThread_exit_prog(int status, int no_cleanup)
802c8cb9f3d240fd2acd098590d2e18445bd8a40bbGuido van Rossum{
8165d5b5763c6bbd99d2e2c6b219570f4562382ff0Guido van Rossum	dprintf(("PyThread_exit_prog(%d) called\n", status));
822c8cb9f3d240fd2acd098590d2e18445bd8a40bbGuido van Rossum	if (!initialized)
832c8cb9f3d240fd2acd098590d2e18445bd8a40bbGuido van Rossum		if (no_cleanup)
842c8cb9f3d240fd2acd098590d2e18445bd8a40bbGuido van Rossum			_exit(status);
852c8cb9f3d240fd2acd098590d2e18445bd8a40bbGuido van Rossum		else
862c8cb9f3d240fd2acd098590d2e18445bd8a40bbGuido van Rossum			exit(status);
873ecebf17324b138a9d10ad429c0ad55ab5de1682Guido van Rossum	if (no_cleanup)
883ecebf17324b138a9d10ad429c0ad55ab5de1682Guido van Rossum		_exit(status);
893ecebf17324b138a9d10ad429c0ad55ab5de1682Guido van Rossum	else
903ecebf17324b138a9d10ad429c0ad55ab5de1682Guido van Rossum		exit(status);
912c8cb9f3d240fd2acd098590d2e18445bd8a40bbGuido van Rossum}
922c8cb9f3d240fd2acd098590d2e18445bd8a40bbGuido van Rossum
93f70ef4f8606f99744252a804229d53a4d97601c1Thomas Woutersvoid
94f70ef4f8606f99744252a804229d53a4d97601c1Thomas WoutersPyThread_exit_prog(int status)
952c8cb9f3d240fd2acd098590d2e18445bd8a40bbGuido van Rossum{
9665d5b5763c6bbd99d2e2c6b219570f4562382ff0Guido van Rossum	do_PyThread_exit_prog(status, 0);
972c8cb9f3d240fd2acd098590d2e18445bd8a40bbGuido van Rossum}
982c8cb9f3d240fd2acd098590d2e18445bd8a40bbGuido van Rossum
99f70ef4f8606f99744252a804229d53a4d97601c1Thomas Woutersvoid
100f70ef4f8606f99744252a804229d53a4d97601c1Thomas WoutersPyThread__exit_prog(int status)
1012c8cb9f3d240fd2acd098590d2e18445bd8a40bbGuido van Rossum{
10265d5b5763c6bbd99d2e2c6b219570f4562382ff0Guido van Rossum	do_PyThread_exit_prog(status, 1);
1032c8cb9f3d240fd2acd098590d2e18445bd8a40bbGuido van Rossum}
1042c8cb9f3d240fd2acd098590d2e18445bd8a40bbGuido van Rossum#endif /* NO_EXIT_PROG */
1052c8cb9f3d240fd2acd098590d2e18445bd8a40bbGuido van Rossum
1062c8cb9f3d240fd2acd098590d2e18445bd8a40bbGuido van Rossum/*
1072c8cb9f3d240fd2acd098590d2e18445bd8a40bbGuido van Rossum * Lock support.
1082c8cb9f3d240fd2acd098590d2e18445bd8a40bbGuido van Rossum */
109f70ef4f8606f99744252a804229d53a4d97601c1Thomas WoutersPyThread_type_lock
110f70ef4f8606f99744252a804229d53a4d97601c1Thomas WoutersPyThread_allocate_lock(void)
1112c8cb9f3d240fd2acd098590d2e18445bd8a40bbGuido van Rossum{
1123ecebf17324b138a9d10ad429c0ad55ab5de1682Guido van Rossum	mutex_t lock;
1132c8cb9f3d240fd2acd098590d2e18445bd8a40bbGuido van Rossum
11465d5b5763c6bbd99d2e2c6b219570f4562382ff0Guido van Rossum	dprintf(("PyThread_allocate_lock called\n"));
1152c8cb9f3d240fd2acd098590d2e18445bd8a40bbGuido van Rossum	if (!initialized)
11665d5b5763c6bbd99d2e2c6b219570f4562382ff0Guido van Rossum		PyThread_init_thread();
1172c8cb9f3d240fd2acd098590d2e18445bd8a40bbGuido van Rossum
1183ecebf17324b138a9d10ad429c0ad55ab5de1682Guido van Rossum	lock = mutex_alloc();
1193ecebf17324b138a9d10ad429c0ad55ab5de1682Guido van Rossum	if (mutex_init(lock)) {
1203ecebf17324b138a9d10ad429c0ad55ab5de1682Guido van Rossum		perror("mutex_init");
1213ecebf17324b138a9d10ad429c0ad55ab5de1682Guido van Rossum		free((void *) lock);
1223ecebf17324b138a9d10ad429c0ad55ab5de1682Guido van Rossum		lock = 0;
1233ecebf17324b138a9d10ad429c0ad55ab5de1682Guido van Rossum	}
124a44d353e2b6d947d36ab9d36c1fc84335a0878feFred Drake	dprintf(("PyThread_allocate_lock() -> %p\n", lock));
12565d5b5763c6bbd99d2e2c6b219570f4562382ff0Guido van Rossum	return (PyThread_type_lock) lock;
1262c8cb9f3d240fd2acd098590d2e18445bd8a40bbGuido van Rossum}
1272c8cb9f3d240fd2acd098590d2e18445bd8a40bbGuido van Rossum
128f70ef4f8606f99744252a804229d53a4d97601c1Thomas Woutersvoid
129f70ef4f8606f99744252a804229d53a4d97601c1Thomas WoutersPyThread_free_lock(PyThread_type_lock lock)
1302c8cb9f3d240fd2acd098590d2e18445bd8a40bbGuido van Rossum{
131a44d353e2b6d947d36ab9d36c1fc84335a0878feFred Drake	dprintf(("PyThread_free_lock(%p) called\n", lock));
1323ecebf17324b138a9d10ad429c0ad55ab5de1682Guido van Rossum	mutex_free(lock);
1332c8cb9f3d240fd2acd098590d2e18445bd8a40bbGuido van Rossum}
1342c8cb9f3d240fd2acd098590d2e18445bd8a40bbGuido van Rossum
135f70ef4f8606f99744252a804229d53a4d97601c1Thomas Woutersint
136f70ef4f8606f99744252a804229d53a4d97601c1Thomas WoutersPyThread_acquire_lock(PyThread_type_lock lock, int waitflag)
1372c8cb9f3d240fd2acd098590d2e18445bd8a40bbGuido van Rossum{
1383ecebf17324b138a9d10ad429c0ad55ab5de1682Guido van Rossum	int success = FALSE;
1392c8cb9f3d240fd2acd098590d2e18445bd8a40bbGuido van Rossum
140a44d353e2b6d947d36ab9d36c1fc84335a0878feFred Drake	dprintf(("PyThread_acquire_lock(%p, %d) called\n", lock, waitflag));
1413ecebf17324b138a9d10ad429c0ad55ab5de1682Guido van Rossum	if (waitflag) { 	/* blocking */
142a6e975801e37bef27deb3207f6fc8f0c59affb46Martin v. Löwis		mutex_lock((mutex_t)lock);
1433ecebf17324b138a9d10ad429c0ad55ab5de1682Guido van Rossum		success = TRUE;
1443ecebf17324b138a9d10ad429c0ad55ab5de1682Guido van Rossum	} else {		/* non blocking */
145a6e975801e37bef27deb3207f6fc8f0c59affb46Martin v. Löwis		success = mutex_try_lock((mutex_t)lock);
1463ecebf17324b138a9d10ad429c0ad55ab5de1682Guido van Rossum	}
147a44d353e2b6d947d36ab9d36c1fc84335a0878feFred Drake	dprintf(("PyThread_acquire_lock(%p, %d) -> %d\n", lock, waitflag, success));
1482c8cb9f3d240fd2acd098590d2e18445bd8a40bbGuido van Rossum	return success;
1492c8cb9f3d240fd2acd098590d2e18445bd8a40bbGuido van Rossum}
1502c8cb9f3d240fd2acd098590d2e18445bd8a40bbGuido van Rossum
151f70ef4f8606f99744252a804229d53a4d97601c1Thomas Woutersvoid
152f70ef4f8606f99744252a804229d53a4d97601c1Thomas WoutersPyThread_release_lock(PyThread_type_lock lock)
1532c8cb9f3d240fd2acd098590d2e18445bd8a40bbGuido van Rossum{
154a44d353e2b6d947d36ab9d36c1fc84335a0878feFred Drake	dprintf(("PyThread_release_lock(%p) called\n", lock));
1553ecebf17324b138a9d10ad429c0ad55ab5de1682Guido van Rossum	mutex_unlock((mutex_t )lock);
1562c8cb9f3d240fd2acd098590d2e18445bd8a40bbGuido van Rossum}
1572c8cb9f3d240fd2acd098590d2e18445bd8a40bbGuido van Rossum
1582c8cb9f3d240fd2acd098590d2e18445bd8a40bbGuido van Rossum/*
1592c8cb9f3d240fd2acd098590d2e18445bd8a40bbGuido van Rossum * Semaphore support.
1603ecebf17324b138a9d10ad429c0ad55ab5de1682Guido van Rossum *
1613ecebf17324b138a9d10ad429c0ad55ab5de1682Guido van Rossum * This implementation is ripped directly from the pthreads implementation.
1623ecebf17324b138a9d10ad429c0ad55ab5de1682Guido van Rossum * Which is to say that it is 100% non-functional at this time.
1633ecebf17324b138a9d10ad429c0ad55ab5de1682Guido van Rossum *
1643ecebf17324b138a9d10ad429c0ad55ab5de1682Guido van Rossum * Assuming the page is still up, documentation can be found at:
1653ecebf17324b138a9d10ad429c0ad55ab5de1682Guido van Rossum *
1663ecebf17324b138a9d10ad429c0ad55ab5de1682Guido van Rossum * http://www.doc.ic.ac.uk/~mac/manuals/solaris-manual-pages/solaris/usr/man/man2/_lwp_sema_wait.2.html
1673ecebf17324b138a9d10ad429c0ad55ab5de1682Guido van Rossum *
1683ecebf17324b138a9d10ad429c0ad55ab5de1682Guido van Rossum * Looking at the man page, it seems that one could easily implement a
1693ecebf17324b138a9d10ad429c0ad55ab5de1682Guido van Rossum * semaphore using a condition.
1703ecebf17324b138a9d10ad429c0ad55ab5de1682Guido van Rossum *
1712c8cb9f3d240fd2acd098590d2e18445bd8a40bbGuido van Rossum */
172f70ef4f8606f99744252a804229d53a4d97601c1Thomas WoutersPyThread_type_sema
173f70ef4f8606f99744252a804229d53a4d97601c1Thomas WoutersPyThread_allocate_sema(int value)
1742c8cb9f3d240fd2acd098590d2e18445bd8a40bbGuido van Rossum{
1753ecebf17324b138a9d10ad429c0ad55ab5de1682Guido van Rossum	char *sema = 0;
17665d5b5763c6bbd99d2e2c6b219570f4562382ff0Guido van Rossum	dprintf(("PyThread_allocate_sema called\n"));
1772c8cb9f3d240fd2acd098590d2e18445bd8a40bbGuido van Rossum	if (!initialized)
17865d5b5763c6bbd99d2e2c6b219570f4562382ff0Guido van Rossum		PyThread_init_thread();
1792c8cb9f3d240fd2acd098590d2e18445bd8a40bbGuido van Rossum
180a44d353e2b6d947d36ab9d36c1fc84335a0878feFred Drake	dprintf(("PyThread_allocate_sema() -> %p\n", sema));
18165d5b5763c6bbd99d2e2c6b219570f4562382ff0Guido van Rossum	return (PyThread_type_sema) sema;
1822c8cb9f3d240fd2acd098590d2e18445bd8a40bbGuido van Rossum}
1832c8cb9f3d240fd2acd098590d2e18445bd8a40bbGuido van Rossum
184f70ef4f8606f99744252a804229d53a4d97601c1Thomas Woutersvoid
185f70ef4f8606f99744252a804229d53a4d97601c1Thomas WoutersPyThread_free_sema(PyThread_type_sema sema)
1862c8cb9f3d240fd2acd098590d2e18445bd8a40bbGuido van Rossum{
187a44d353e2b6d947d36ab9d36c1fc84335a0878feFred Drake	dprintf(("PyThread_free_sema(%p) called\n", sema));
1882c8cb9f3d240fd2acd098590d2e18445bd8a40bbGuido van Rossum}
1892c8cb9f3d240fd2acd098590d2e18445bd8a40bbGuido van Rossum
190f70ef4f8606f99744252a804229d53a4d97601c1Thomas Woutersint
191f70ef4f8606f99744252a804229d53a4d97601c1Thomas WoutersPyThread_down_sema(PyThread_type_sema sema, int waitflag)
1922c8cb9f3d240fd2acd098590d2e18445bd8a40bbGuido van Rossum{
193a44d353e2b6d947d36ab9d36c1fc84335a0878feFred Drake	dprintf(("PyThread_down_sema(%p, %d) called\n", sema, waitflag));
194a44d353e2b6d947d36ab9d36c1fc84335a0878feFred Drake	dprintf(("PyThread_down_sema(%p) return\n", sema));
195cf1474b73ad3e4085af220f3845b75b201974d38Guido van Rossum	return -1;
1962c8cb9f3d240fd2acd098590d2e18445bd8a40bbGuido van Rossum}
1972c8cb9f3d240fd2acd098590d2e18445bd8a40bbGuido van Rossum
198f70ef4f8606f99744252a804229d53a4d97601c1Thomas Woutersvoid
199f70ef4f8606f99744252a804229d53a4d97601c1Thomas WoutersPyThread_up_sema(PyThread_type_sema sema)
2002c8cb9f3d240fd2acd098590d2e18445bd8a40bbGuido van Rossum{
201a44d353e2b6d947d36ab9d36c1fc84335a0878feFred Drake	dprintf(("PyThread_up_sema(%p)\n", sema));
2022c8cb9f3d240fd2acd098590d2e18445bd8a40bbGuido van Rossum}
203