Welcome
» NERWous C
» Mel
Closing A Mel
In the Producer / Consumer previous example, we use the value 0 to allow the Producer to indicate that it is done. The more generic way is for the Producer to close the mel element:
Once a mel element is closed, any attempt to write to it or read from it will result in the
Multiple Mel Closures
The
Closing At Task End
There is no automatic mel closing when the task that requests its creation, ends. When a mel element is created, its belongs to the whole NERWous C program, and not to a task. The only thing that the task has control of, is the resident mel variable that represents its access to the remote mel element. This mel variable will fall out of scope when the task ends. If a task wants to close the mel element when it ends, it has to specifically invoke the <close> operation.
When the NERWous C program exits, all mel elements are automatically closed. The CHAOS runtime then collects all the released resources for another program.
Previous Next Top
Closing A Mel
In the Producer / Consumer previous example, we use the value 0 to allow the Producer to indicate that it is done. The more generic way is for the Producer to close the mel element:
main () {
<mel buffer=100> int store;
<!> Producer (store);
<!> Consumer (store);
}
void Producer (<mel> int store) {
int c;
while ( c = Produce() )
<?>store = c;
<close>store;
}
void Consumer (<mel> int store) {
try {
while ( 1 )
Consume(<?>store);
} catch ( store<CLOSED> ) {
return;
}
}
The Producer
invokes the <close> operation on its resident mel variable store
. The CHAOS runtime receives this request, puts the Producer
job on hold, retrieves the CORE properties from the mel variable, reaches out to the remote mel element now identified, marks it as closed, and frees the Producer
job to resume processing. To limit the requesting job from waiting too long, the CHAOS runtime will garbage-collect any released resources from the closed mel element at an opportune time.
Once a mel element is closed, any attempt to write to it or read from it will result in the
CLOSED
exception. This is what happens to the Consumer
task when it attempts to read from the mel element store
. The Consumer
catches the exception and does a return
. Since the Consumer
is run under a task, a return
will end the task.
Multiple Mel Closures
The
Consumer
can also close the mel element. For example, we would like our Consumer
to consume up to 1000 items and no more. When this threshold is reached, the Consumer
will close the mel element store
to inform the Producer
to stop producing.
main () {
<mel> int store;
<!> Producer (store);
<!> Consumer (store);
}
void Producer (<mel> int store) {
int c;
try {
while ( c = Produce() ) // Produce until 0
<?>store = c;
<close>store;
}
catch ( store<CLOSED> ) { // Or until the Consumer stops consuming
return;
}
}
void Consumer (<mel> int store) {
int upto = 1000;
try {
while ( --upto >= 0 )
Consume(<?>store); // Consume until upto is reached
<close>store;
}
catch ( store<CLOSED> ) { // Or until the Producer stops producing
return;
}
}
If a mel element is already closed, apply another <close> operation to it will be silently ignored.
Closing At Task End
There is no automatic mel closing when the task that requests its creation, ends. When a mel element is created, its belongs to the whole NERWous C program, and not to a task. The only thing that the task has control of, is the resident mel variable that represents its access to the remote mel element. This mel variable will fall out of scope when the task ends. If a task wants to close the mel element when it ends, it has to specifically invoke the <close> operation.
When the NERWous C program exits, all mel elements are automatically closed. The CHAOS runtime then collects all the released resources for another program.
Previous Next Top
No comments:
Post a Comment