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 17c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou /* Roland McGrath said this should not be used since this is 18c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou done while linking to threads */ 19c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou cthread_init(); 20a6e975801e37bef27deb3207f6fc8f0c59affb46Martin v. Löwis#else 21a6e975801e37bef27deb3207f6fc8f0c59affb46Martin v. Löwis/* do nothing */ 22c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou ; 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{ 32c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou int success = 0; /* init not needed when SOLARIS_THREADS and */ 33c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou /* C_THREADS implemented properly */ 342c8cb9f3d240fd2acd098590d2e18445bd8a40bbGuido van Rossum 35c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou dprintf(("PyThread_start_new_thread called\n")); 36c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou if (!initialized) 37c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou PyThread_init_thread(); 38c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou /* looks like solaris detaches the thread to never rejoin 39c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou * so well do it here 40c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou */ 41c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou cthread_detach(cthread_fork((cthread_fn_t) func, arg)); 42c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou return success < 0 ? -1 : 0; 432c8cb9f3d240fd2acd098590d2e18445bd8a40bbGuido van Rossum} 442c8cb9f3d240fd2acd098590d2e18445bd8a40bbGuido van Rossum 45f70ef4f8606f99744252a804229d53a4d97601c1Thomas Wouterslong 46f70ef4f8606f99744252a804229d53a4d97601c1Thomas WoutersPyThread_get_thread_ident(void) 47e944da8916e053a6a1deda8ce3fa61304d68f872Guido van Rossum{ 48c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou if (!initialized) 49c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou PyThread_init_thread(); 50c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou return (long) cthread_self(); 51e944da8916e053a6a1deda8ce3fa61304d68f872Guido van Rossum} 52e944da8916e053a6a1deda8ce3fa61304d68f872Guido van Rossum 53f70ef4f8606f99744252a804229d53a4d97601c1Thomas Woutersvoid 54f70ef4f8606f99744252a804229d53a4d97601c1Thomas WoutersPyThread_exit_thread(void) 552c8cb9f3d240fd2acd098590d2e18445bd8a40bbGuido van Rossum{ 56c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou dprintf(("PyThread_exit_thread called\n")); 57c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou if (!initialized) 58c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou exit(0); 59c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou cthread_exit(0); 602c8cb9f3d240fd2acd098590d2e18445bd8a40bbGuido van Rossum} 612c8cb9f3d240fd2acd098590d2e18445bd8a40bbGuido van Rossum 622c8cb9f3d240fd2acd098590d2e18445bd8a40bbGuido van Rossum/* 632c8cb9f3d240fd2acd098590d2e18445bd8a40bbGuido van Rossum * Lock support. 642c8cb9f3d240fd2acd098590d2e18445bd8a40bbGuido van Rossum */ 65f70ef4f8606f99744252a804229d53a4d97601c1Thomas WoutersPyThread_type_lock 66f70ef4f8606f99744252a804229d53a4d97601c1Thomas WoutersPyThread_allocate_lock(void) 672c8cb9f3d240fd2acd098590d2e18445bd8a40bbGuido van Rossum{ 68c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou mutex_t lock; 692c8cb9f3d240fd2acd098590d2e18445bd8a40bbGuido van Rossum 70c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou dprintf(("PyThread_allocate_lock called\n")); 71c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou if (!initialized) 72c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou PyThread_init_thread(); 732c8cb9f3d240fd2acd098590d2e18445bd8a40bbGuido van Rossum 74c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou lock = mutex_alloc(); 75c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou if (mutex_init(lock)) { 76c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou perror("mutex_init"); 77c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou free((void *) lock); 78c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou lock = 0; 79c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou } 80c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou dprintf(("PyThread_allocate_lock() -> %p\n", lock)); 81c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou return (PyThread_type_lock) lock; 822c8cb9f3d240fd2acd098590d2e18445bd8a40bbGuido van Rossum} 832c8cb9f3d240fd2acd098590d2e18445bd8a40bbGuido van Rossum 84f70ef4f8606f99744252a804229d53a4d97601c1Thomas Woutersvoid 85f70ef4f8606f99744252a804229d53a4d97601c1Thomas WoutersPyThread_free_lock(PyThread_type_lock lock) 862c8cb9f3d240fd2acd098590d2e18445bd8a40bbGuido van Rossum{ 87c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou dprintf(("PyThread_free_lock(%p) called\n", lock)); 88c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou mutex_free(lock); 892c8cb9f3d240fd2acd098590d2e18445bd8a40bbGuido van Rossum} 902c8cb9f3d240fd2acd098590d2e18445bd8a40bbGuido van Rossum 91f70ef4f8606f99744252a804229d53a4d97601c1Thomas Woutersint 92f70ef4f8606f99744252a804229d53a4d97601c1Thomas WoutersPyThread_acquire_lock(PyThread_type_lock lock, int waitflag) 932c8cb9f3d240fd2acd098590d2e18445bd8a40bbGuido van Rossum{ 94c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou int success = FALSE; 952c8cb9f3d240fd2acd098590d2e18445bd8a40bbGuido van Rossum 96c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou dprintf(("PyThread_acquire_lock(%p, %d) called\n", lock, waitflag)); 97c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou if (waitflag) { /* blocking */ 98c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou mutex_lock((mutex_t)lock); 99c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou success = TRUE; 100c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou } else { /* non blocking */ 101c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou success = mutex_try_lock((mutex_t)lock); 102c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou } 103c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou dprintf(("PyThread_acquire_lock(%p, %d) -> %d\n", lock, waitflag, success)); 104c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou return success; 1052c8cb9f3d240fd2acd098590d2e18445bd8a40bbGuido van Rossum} 1062c8cb9f3d240fd2acd098590d2e18445bd8a40bbGuido van Rossum 107f70ef4f8606f99744252a804229d53a4d97601c1Thomas Woutersvoid 108f70ef4f8606f99744252a804229d53a4d97601c1Thomas WoutersPyThread_release_lock(PyThread_type_lock lock) 1092c8cb9f3d240fd2acd098590d2e18445bd8a40bbGuido van Rossum{ 110c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou dprintf(("PyThread_release_lock(%p) called\n", lock)); 111c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou mutex_unlock((mutex_t )lock); 1122c8cb9f3d240fd2acd098590d2e18445bd8a40bbGuido van Rossum} 113