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