Non Blocking Channel Operations in Scilab

Our example demonstrates non-blocking operations using Scilab’s event handling mechanism. Since Scilab doesn’t have built-in channels or select statements like some other languages, we’ll simulate similar behavior using timers and callbacks.

function main()
    // Create timer objects to simulate channels
    messages = timer();
    signals = timer();

    // Simulate a non-blocking receive
    function receiveMessage()
        disp("received message")
    end
    
    function noMessage()
        disp("no message received")
    end
    
    // Set up timer for messages
    messages.TimerFcn = receiveMessage;
    messages.StartDelay = 0.1;  // Short delay to simulate immediate check
    messages.TasksToExecute = 1;
    start(messages);
    
    sleep(200);  // Wait for timer to possibly execute
    if ~messages.Running then
        noMessage();
    end

    // Simulate a non-blocking send
    msg = "hi";
    function sendMessage()
        disp("sent message " + msg)
    end
    
    function noSend()
        disp("no message sent")
    end
    
    // Set up timer for sending
    messages.TimerFcn = sendMessage;
    messages.StartDelay = 0.1;
    start(messages);
    
    sleep(200);
    if ~messages.Running then
        noSend();
    end

    // Simulate multi-way non-blocking select
    function receiveSignal()
        disp("received signal")
    end
    
    function noActivity()
        disp("no activity")
    end
    
    messages.TimerFcn = receiveMessage;
    signals.TimerFcn = receiveSignal;
    messages.StartDelay = 0.1;
    signals.StartDelay = 0.1;
    start(messages);
    start(signals);
    
    sleep(200);
    if ~messages.Running & ~signals.Running then
        noActivity();
    end
end

main()

This Scilab code simulates non-blocking channel operations using timers. Here’s how it works:

  1. We create timer objects messages and signals to simulate channels.

  2. For the non-blocking receive, we set up a timer with a short delay. If the timer executes, it simulates receiving a message. If it doesn’t execute before we check, we simulate no message received.

  3. The non-blocking send works similarly. We set up a timer, and if it executes, we simulate sending a message. Otherwise, we simulate no message sent.

  4. For the multi-way non-blocking select, we set up both timers. If neither timer executes before we check, we simulate no activity.

To run this program, save it as a .sce file and execute it in Scilab:

--> exec('non_blocking_operations.sce', -1)
no message received
no message sent
no activity

This example demonstrates how to simulate non-blocking operations in Scilab. While it doesn’t provide the same level of concurrency as some other languages, it shows how you can use timers and callbacks to achieve similar behavior.