src/thread.c - Thread handling stuff
Threads are created by creating new ParrotInterpreter
objects.
static PMC *make_local_copy
- Creates a local copy of the PMC if necessary.
(No copy is made if it is marked shared.) This includes workarounds for Parrot_clone() not doing the Right Thing with subroutines (specifically,
code segments aren't preserved and it is difficult to do so as long as Parrot_clone() depends on freezing).
static Shared_gc_info *get_pool
- Gets the shared gc information.
For now this is global data; ideally it will become something other than a static variable.
If everything uses this function,
it will be easier to change.
void pt_free_pool
- Frees the shared GC information.
This clears any global data when joining all threads at parent interpreter destruction.
static PMC *make_local_args_copy
- Make a local copy of the corresponding array of arguments.
PMC *pt_shared_fixup
- Modifies a PMC to be sharable.
Right now,
reassigns the vtable to one owned by some master interpreter,
so the PMC can be safely reused after thread death.
- In the future the PMC returned might be different than the one passed,
e.g.,
if we need to reallocate the PMC in a different interpreter.
static void pt_thread_signal
- Wakes up an
interp
which should have called pt_thread_wait().
void pt_thread_wait_with
- Waits for this interpreter to be signalled through its condition variable,
dealing properly with GC issues.
*mutex
is assumed locked on entry and will be locked on exit from this function.
If a GC run occurs in the middle of this function,
then a spurious wakeup may occur.
static void pt_thread_wait
- Waits for a signal,
handling GC matters correctly.
interpreter_array_mutex
is assumed held.
Spurious wakeups may occur.
static void *thread_func
- The actual thread function.
void pt_clone_code
- Copies/clones the packfile/code from interpreter
s
to d
.
All resources are created in d
.
static void pt_ns_clone
- Clones all globals from
s
to d
.
void pt_clone_globals
- Copies the global namespace when cloning a new interpreter.
void pt_thread_prepare_for_run
- Sets up a new thread to run.
PMC *pt_transfer_sub
- Clones the sub so that it's suitable for the other interpreter.
int pt_thread_run
- Runs the
*sub
PMC in a separate thread using the interpreter in *dest_interp
.
arg
should be an array of arguments for the subroutine.
int pt_thread_run_1
- Runs a thread that shares nothing and does not communicate with the other interpreter.
int pt_thread_run_2
- Runs an interpreter in a thread with no shared variables,
but which communicates by sending messages.
int pt_thread_run_3
- Runs an interpreter in a thread,
allowing shared variables and using a thread pool.
void pt_thread_yield
- Relinquishes hold on the processor.
static Parrot_Interp pt_check_tid
- Helper function.
Checks if the given thread ID is valid.
The caller holds the mutex.
Returns the interpreter for
tid
.
static void mutex_unlock
- Unlocks the mutex
*arg
.
static int is_suspended_for_gc
- Returns true iff
interp
is suspended for a global GC run.
Be sure to hold interpreter_array_mutex
.
static QUEUE_ENTRY *remove_queued_suspend_gc
- Removes an event requesting that the interpreter suspend itself for a garbage-collection run from the event queue.
static int pt_gc_count_threads
- Returns the number of active threads in the system (running or suspended).
Be sure to hold
interpreter_array_mutex
.
static void pt_gc_wait_for_stage
- Waits until all threads have reached the desired stage.
Takes an interpreter,
starting stage and ending stage as arguments.
Updates the thread information.
Used in
pt_DOD_start_mark
and pt_DOD_stop_mark
.
static void pt_gc_wakeup_check
- Checks if it's necessary to wake threads to perform garbage collection.
This is called after thread death.
Be sure to hold
interpreter_array_mutex
.
static void pt_suspend_one_for_gc
- Suspends a single interpreter for GC.
Be sure to hold
interpreter_array_mutex
.
static void pt_suspend_all_for_gc
- Notifies all threads to perform a GC run.
void pt_suspend_self_for_gc
- Suspends this thread for a full GC run.
- XXX FIXME -- if GC is blocked,
we need to do a GC run as soon as it becomes unblocked.
PMC *pt_thread_join
- Joins (by waiting for) a joinable thread.
void pt_join_threads
- Possibly waits for other running threads.
This is called when destroying
interp
.
static Parrot_Interp detach
- Helper for detach and kill.
- Returns the interpreter,
if it didn't finish yet.
void pt_thread_detach
- Detaches the thread,
making it non-joinable.
void pt_thread_kill
- Kills the thread.
void pt_add_to_interpreters
- Stores the given interpreter in the array of all interpreters.
Be sure to hold
interpreter_array_mutex
.
void pt_DOD_start_mark
- Record that the mark phase of DOD is about to begin.
In the presence of shared PMCs,
we can only run one DOD run at a time because
PMC->next_for_GC
may be changed.
flags
are the DOD flags.
We check if we need to collect shared objects or not.
- TODO - Have a count of shared PMCs and check it during DOD.
- TODO - Evaluate if a interpreter lock is cheaper when
dod_mark_ptr
is updated.
void pt_DOD_mark_root_finished
- Records that DOD has finished for the root set.
UNIMPLEMENTED
void pt_DOD_stop_mark
- Records that the mark phase of DOD has completed.
void Parrot_shared_DOD_block
- Blocks stop-the-world DOD runs.
void Parrot_shared_DOD_unblock
- Unblocks stop-the-world DOD runs.