Abortable event

Note Abortable events require OpenCL 1.1 or higher

Abortable events allow you to abort events before they're completed. When an abortable event is created, a new flag event is created, alongside a host-side flag.

If the event completes before it's aborted, the flag event is marked with it's result and the host-side flag is marked as not-aborted. The abortable event will return Ok(Some(_)) if it succedded, and Err(_) if it didn't.

If the event is aborted before completion, the flag event is marked without an error and the host-side flag is marked as aborted. The abortable event will return Ok(None).

use blaze_rs::{event::{AbortHandle, consumer::{Noop, AbortableEvent}}, prelude::*};

#[global_context]
static CTX : SimpleContext = SimpleContext::default();

#[test]
fn aborted () -> Result<()> {
    let flag = FlagEvent::new()?;
    let (event, handle): (AbortableEvent<Noop>, AbortHandle) = flag
        .subscribe()
        .into_event()
        .abortable()?;
    
    assert_eq!(handle.try_abort(), Ok(true)); // Abort the event
    assert_eq!(event.join(), Ok(None));
    Ok(())
}

#[test]
fn not_aborted () -> Result<()> {
    let flag = FlagEvent::new()?;
    let (event, handle): (AbortableEvent<Noop>, AbortHandle) = flag
        .subscribe()
        .into_event()
        .abortable()?;
    
    assert_eq!(flag.try_mark(None), Ok(true)); // Complete the event
    assert_eq!(event.join(), Ok(Some(())));
    assert_eq!(handle.try_abort(), Ok(false));
    Ok(())
}