Clone in a terminal:
Task.vala
/*
	Copyright (C) 2014 2015 2019 Johan Mattsson

	This library is free software; you can redistribute it and/or modify 
	it under the terms of the GNU Lesser General Public License as 
	published by the Free Software Foundation; either version 3 of the 
	License, or (at your option) any later version.

	This library is distributed in the hope that it will be useful, but 
	WITHOUT ANY WARRANTY; without even the implied warranty of 
	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 
	Lesser General Public License for more details.
*/

namespace BirdFont {

public class Task : GLib.Object {
	
	public delegate void Runnable ();
	public signal void done ();
	Runnable task;
	bool cancelled = false;
	bool cancelable = false;
	
	public Task.empty () {
	}
		
	public Task (owned Runnable? r, bool cancelable = false) {
		if (r != null) {
			task = (!) ((owned) r);
		}
		
		this.cancelable = cancelable;
	}
	
	public bool is_cancellable () {
		bool c;
		
		lock (cancelled) {	
			c = cancelable;
		}
		
		return c;
	}

	public void cancel () {
		lock (cancelled) {			
			if (unlikely (!cancelable)) {
				warning ("Task is not cancelable.");
			}
			
			cancelled = true;
		}
	}

	public bool is_cancelled () {
		bool c;
		
		lock (cancelled) {	
			c = cancelled;
		}
		
		return c;
	}
		
	public virtual void run () {
		task ();
		
		IdleSource idle = new IdleSource ();
		idle.set_callback (() => {
			done ();
			return false;
		});
		idle.attach (null);
	}

	public void* perform_task() {
		run ();
		return null;
	}
}

}

Contact

Email: johan.mattsson.m@gmail.com
Mastodon: typo.social/@birdfont
GitHub: johanmattssonm
LinkedIn: johan-mattsson-2ab324112