ugBASIC 1.18
An isomorphic BASIC language compiler for retrocomputers
Loading...
Searching...
No Matches
wait_parallel.c
Go to the documentation of this file.
1/*****************************************************************************
2 * ugBASIC - an isomorphic BASIC language compiler for retrocomputers *
3 *****************************************************************************
4 * Copyright 2021-2026 Marco Spedaletti (asimov@mclink.it)
5 *
6 * Licensed under the Apache License, Version 2.0 (the "License");
7 * you may not use this file except in compliance with the License.
8 * You may obtain a copy of the License at
9 *
10 * http://www.apache.org/licenses/LICENSE-2.0
11 *
12 * Unless required by applicable law or agreed to in writing, software
13 * distributed under the License is distributed on an "AS IS" BASIS,
14 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15 * See the License for the specific language governing permissions and
16 * limitations under the License.
17 *----------------------------------------------------------------------------
18 * Concesso in licenza secondo i termini della Licenza Apache, versione 2.0
19 * (la "Licenza"); è proibito usare questo file se non in conformità alla
20 * Licenza. Una copia della Licenza è disponibile all'indirizzo:
21 *
22 * http://www.apache.org/licenses/LICENSE-2.0
23 *
24 * Se non richiesto dalla legislazione vigente o concordato per iscritto,
25 * il software distribuito nei termini della Licenza è distribuito
26 * "COSÌ COM'È", SENZA GARANZIE O CONDIZIONI DI ALCUN TIPO, esplicite o
27 * implicite. Consultare la Licenza per il testo specifico che regola le
28 * autorizzazioni e le limitazioni previste dalla medesima.
29 ****************************************************************************/
30
31/****************************************************************************
32 * INCLUDE SECTION
33 ****************************************************************************/
34
35#include "../../ugbc.h"
36
37/****************************************************************************
38 * CODE SECTION
39 ****************************************************************************/
40
46/* <usermanual>
47@keyword WAIT PARALLEL
48
49@english
50
51The ''WAIT PARALLEL'' command allows you to wait for the completion
52of a previously running mandatory thread. In order for the thread
53to be considered completed, it must reach the last statement of
54the parallel procedure, or have executed the ''EXIT PROCEDURE'' command.
55
56@italian
57
58Il comando ''WAIT PARALLEL'' permette di attendere il completamento di
59un thread obbligatorio in esecuzione in precedenza. Affinché il thread
60possa considerarsi completato deve raggiungere l'ultima istruzione della
61procedura parallela, oppure aver eseguito il comando ''EXIT PROCEDURE''.
62
63@syntax WAIT PARALLEL id
64
65@example WAIT PARALLEL exampleThread
66
67</usermanual> */
68void wait_parallel( Environment * _environment, char * _thread ) {
69
70 _environment->anyProtothread = 1;
71
72 if ( _environment->protothreadForbid ) {
74 }
75
76 if ( ! _environment->procedureName ) {
78 }
79
80 yield( _environment );
81
83
84 char protothreadLabel[MAX_TEMPORARY_STORAGE]; sprintf(protothreadLabel, "%spt%d", _environment->procedureName, _environment->protothreadStep );
85
86 Variable * thread = variable_retrieve_or_define( _environment, _thread, VT_THREAD, 0 );
87 Variable * state = variable_temporary( _environment, VT_THREAD, "(state)" );
88 Variable * endedState = variable_temporary( _environment, VT_BYTE, "(ended state)" );
89 variable_store( _environment, endedState->name, PROTOTHREAD_STATUS_ENDED );
90
91 cpu_protothread_get_state( _environment, thread->realName, state->realName );
92 cpu_bvneq( _environment, variable_compare( _environment, state->name, endedState->name )->realName, protothreadLabel );
93
94 cpu_protothread_save( _environment, "PROTOTHREADCT", ( _environment->protothreadStep - 1 ) );
95 cpu_protothread_set_state( _environment, "PROTOTHREADCT", PROTOTHREAD_STATUS_WAITING );
96 cpu_return( _environment );
97 cpu_label( _environment, protothreadLabel );
98 cpu_protothread_set_state( _environment, "PROTOTHREADCT", PROTOTHREAD_STATUS_RUNNING );
99
100 ++_environment->protothreadStep;
101
102}
void cpu_protothread_get_state(Environment *_environment, char *_index, char *_state)
Definition 6309.c:6237
void cpu_protothread_save(Environment *_environment, char *_index, int _step)
Definition 6309.c:6203
void cpu_protothread_set_state(Environment *_environment, char *_index, int _state)
Definition 6309.c:6226
void cpu_label(Environment *_environment, char *_label)
Definition 6309.c:356
void cpu_bvneq(Environment *_environment, char *_value, char *_label)
Definition 6309.c:345
void cpu_return(Environment *_environment)
Definition 6309.c:4030
Variable * variable_retrieve_or_define(Environment *_environment, char *_name, VariableType _type, int _value)
Variable * variable_temporary(Environment *_environment, VariableType _type, char *_meaning)
Define a temporary variable.
Variable * variable_compare(Environment *_environment, char *_source, char *_destination)
Compare two variable and return the result of comparation.
Variable * variable_store(Environment *_environment, char *_destination, unsigned int _value)
Store a direct value to a variable.
int anyProtothread
Definition ugbc.h:2835
int protothreadStep
Definition ugbc.h:2840
char * procedureName
Definition ugbc.h:2775
int protothreadForbid
Definition ugbc.h:2845
char * name
Definition ugbc.h:979
char * realName
Definition ugbc.h:982
#define PROTOTHREAD_STATUS_ENDED
Definition ugbc.h:4550
#define MAX_TEMPORARY_STORAGE
Definition ugbc.h:563
#define PROTOTHREAD_STATUS_WAITING
Definition ugbc.h:4546
struct _Variable Variable
Structure of a single variable.
struct _Environment Environment
Structure of compilation environment.
@ VT_THREAD
Definition ugbc.h:492
@ VT_BYTE
Definition ugbc.h:450
#define CRITICAL_MULTITASKING_FORBIDDEN()
Definition ugbc.h:3703
#define PROTOTHREAD_STATUS_RUNNING
Definition ugbc.h:4547
#define CRITICAL_WAIT_PARALLEL_CANNOT_BE_CALLED_OUTSIDE_PROCEDURE()
Definition ugbc.h:3763
#define MAKE_LABEL
Definition ugbc.h:3351
void wait_parallel(Environment *_environment, char *_thread)
Emit code for WAIT PARALLEL ....
void yield(Environment *_environment)
Emit code for YIELD.
Definition yield.c:63