=head1 Name
SPVM::Document::Language::System - System Setting in the SPVM Language
=head1 Description
This document describes system setting in the SPVM language.
=head1 System Setting
=head2 Standard Streams
SPVM opens own standard input, standard output, and standard error for a runtime just after a runtime is build.
The L<print operator|SPVM::Document::Language::Operators/"print Operator"> outputs to this SPVM's standard output.
The L<say operator|SPVM::Document::Language::Operators/"say Operator"> outputs to this SPVM's standard output.
The L<warn operator|SPVM::Document::Language::Operators/"warn Operator"> outputs to this SPVM's standard error.
=head2 Thread Safety
The SPVM language has some thread-safe features.
=head3 Runtime Stack
When a new thread, such as an L<OS native thread|SPVM::Thread>, a coroutine such as a L<goroutine|SPVM::Go> is created, a new L<runtime stack|SPVM::Document::NativeClass/"Runtime Stack"> should be created for the new thread.
SPVM_VALUE* new_stack = env->new_stack(env);
This runtime stack has thread-specific data, such as the value of the exception variable, as well as method-specific data, such as arguments and a return value.
When the new thread finished, the new runtime stack must be released.
env->free_stack(env, new_stack);
Currently, user data cannot be got and set in a runtime stack.
If thread-specific user data is needed, the thread ID is got by L<Thread#get_id|SPVM::Thread#get_id> method and this thread ID can be a key of a L<hash|SPVM::Hash> for thread-specific user data. In this case, L<Hash|SPVM::Hash> class is not thread safe, a lock using a L<mutex|SPVM::Sync::Mutex> is needed.
=head2 Atomic Operations
This section describe atomic operations.
Generally speaking, when using L<OS native threads|SPVM::Thread> with SPVM, the following atomic operations can result in severe performance degradation.
Therefore, the advice is to minimize object creations and object assignments in newly created L<OS native threads|SPVM::Thread>.
Coroutine threads such as L<goroutines|SPVM::Go> don't have to worry about things like this because these are synchronized.
=head3 Updating Memory Blocks Count
Updating the count of allocated memory blocks is an atomic operation and thread safe. It is protected by a mutex.
The count of all allocated memory blocks in a runtime is managed and is got by L<get_memory_blocks_count|SPVM::Document::NativeAPI/"get_memory_blocks_count"> native API.
=head3 Updating Runtime Cache
Updating a runtime cache data is an atomic operation and thread safe. It is protected by a mutex.
=head3 Compilation
A compilation is an atomic operation and thread safe. It is protected by a mutex.
=head3 Updating Reference Count
Updating the reference count of an object an atomic operation and thread safe. It is protected by a mutex.
=head1 See Also
=over 2
=item * L<SPVM::Document::Language::Operators>
=item * L<SPVM::Document::Language>
=item * L<SPVM::Document>
=back
=head1 Copyright & License
Copyright (c) 2023 Yuki Kimoto
MIT License