Hi,
I have a fairly typical 2-task write/read scenario, with one task writing
into a fixed-length buffer, and the other task reading from it. I have the
following piece of code in the write task:
function bufWrite(buf, value)
if buf.full
warn("Buffer is full")
print("full = $(buf.full)\n")
wait(buf.rdnotify)
end
:
#do stuff to write value to the buffer
end
The read task is along the lines of:
function bufRead(buf)
# do stuff to read a value from the buffer if non-empty
buf.full = false
notify(buf.rdnotify)
end
Given that @async tasks are not preemptive, I expected that between the
buf.full flag check in the write task, and the print of the buf.full flag
after the warn, the value of the full flag should not change because
control does not pass to the read task until the wait() is encountered.
However, I find that while the if buf.full check passes, the printed value
of buf.full sometimes displays false - which means that the read task got
control between the buf.full check and the print statement. Hence the
question - can warn, print, etc. pass control to other tasks while
executing?
Thanks,
Ravi