=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.

Their open modes are set to L<binary mode|https://learn.microsoft.com/en-us/cpp/c-runtime-library/text-and-binary-mode-file-i-o?view=msvc-170> in Windows.

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