1*0Sstevel@tonic-gate /* fakethr.h 2*0Sstevel@tonic-gate * 3*0Sstevel@tonic-gate * Copyright (C) 1999, by Larry Wall and others 4*0Sstevel@tonic-gate * 5*0Sstevel@tonic-gate * You may distribute under the terms of either the GNU General Public 6*0Sstevel@tonic-gate * License or the Artistic License, as specified in the README file. 7*0Sstevel@tonic-gate * 8*0Sstevel@tonic-gate */ 9*0Sstevel@tonic-gate 10*0Sstevel@tonic-gate typedef int perl_mutex; 11*0Sstevel@tonic-gate typedef int perl_key; 12*0Sstevel@tonic-gate 13*0Sstevel@tonic-gate typedef struct perl_thread *perl_os_thread; 14*0Sstevel@tonic-gate /* With fake threads, thr is global(ish) so we don't need dTHR */ 15*0Sstevel@tonic-gate #define dTHR extern int errno 16*0Sstevel@tonic-gate 17*0Sstevel@tonic-gate struct perl_wait_queue { 18*0Sstevel@tonic-gate struct perl_thread * thread; 19*0Sstevel@tonic-gate struct perl_wait_queue * next; 20*0Sstevel@tonic-gate }; 21*0Sstevel@tonic-gate typedef struct perl_wait_queue *perl_cond; 22*0Sstevel@tonic-gate 23*0Sstevel@tonic-gate /* Ask thread.h to include our per-thread extras */ 24*0Sstevel@tonic-gate #define HAVE_THREAD_INTERN 25*0Sstevel@tonic-gate struct thread_intern { 26*0Sstevel@tonic-gate perl_os_thread next_run, prev_run; /* Linked list of runnable threads */ 27*0Sstevel@tonic-gate perl_cond wait_queue; /* Wait queue that we are waiting on */ 28*0Sstevel@tonic-gate IV private; /* Holds data across time slices */ 29*0Sstevel@tonic-gate I32 savemark; /* Holds MARK for thread join values */ 30*0Sstevel@tonic-gate }; 31*0Sstevel@tonic-gate 32*0Sstevel@tonic-gate #define init_thread_intern(t) \ 33*0Sstevel@tonic-gate STMT_START { \ 34*0Sstevel@tonic-gate t->self = (t); \ 35*0Sstevel@tonic-gate (t)->i.next_run = (t)->i.prev_run = (t); \ 36*0Sstevel@tonic-gate (t)->i.wait_queue = 0; \ 37*0Sstevel@tonic-gate (t)->i.private = 0; \ 38*0Sstevel@tonic-gate } STMT_END 39*0Sstevel@tonic-gate 40*0Sstevel@tonic-gate /* 41*0Sstevel@tonic-gate * Note that SCHEDULE() is only callable from pp code (which 42*0Sstevel@tonic-gate * must be expecting to be restarted). We'll have to do 43*0Sstevel@tonic-gate * something a bit different for XS code. 44*0Sstevel@tonic-gate */ 45*0Sstevel@tonic-gate 46*0Sstevel@tonic-gate #define SCHEDULE() return schedule(), PL_op 47*0Sstevel@tonic-gate 48*0Sstevel@tonic-gate #define MUTEX_LOCK(m) 49*0Sstevel@tonic-gate #define MUTEX_UNLOCK(m) 50*0Sstevel@tonic-gate #define MUTEX_INIT(m) 51*0Sstevel@tonic-gate #define MUTEX_DESTROY(m) 52*0Sstevel@tonic-gate #define COND_INIT(c) perl_cond_init(c) 53*0Sstevel@tonic-gate #define COND_SIGNAL(c) perl_cond_signal(c) 54*0Sstevel@tonic-gate #define COND_BROADCAST(c) perl_cond_broadcast(c) 55*0Sstevel@tonic-gate #define COND_WAIT(c, m) \ 56*0Sstevel@tonic-gate STMT_START { \ 57*0Sstevel@tonic-gate perl_cond_wait(c); \ 58*0Sstevel@tonic-gate SCHEDULE(); \ 59*0Sstevel@tonic-gate } STMT_END 60*0Sstevel@tonic-gate #define COND_DESTROY(c) 61*0Sstevel@tonic-gate 62*0Sstevel@tonic-gate #define THREAD_CREATE(t, f) f((t)) 63*0Sstevel@tonic-gate #define THREAD_POST_CREATE(t) NOOP 64*0Sstevel@tonic-gate 65*0Sstevel@tonic-gate #define YIELD NOOP 66