text: //
  //  IOThread.h
  //  Firedrake
  //
  //  Created by Sidney Just
  //  Copyright (c) 2015 by Sidney Just
  //  Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated
  //  documentation files (the "Software"), to deal in the Software without restriction, including without limitation
  //  the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software,
  //  and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
  //  The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
  //  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
  //  INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
  //  PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE
  //  FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
  //  ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
  //
  
  #ifndef _IOTHREAD_H_
  #define _IOTHREAD_H_
  
  #include "../core/IOObject.h"
  #include <libcpp/atomic.h>
  
  namespace IO
  {
  	class Thread : public Object
  	{
  	public:
  		typedef void (*Entry)(void *, Thread *);
  
  		Thread *InitWithEntry(Entry entry, void *argument);
  
  		void Start();
  		void Cancel();
  
  		void WaitForExit();
  
  		bool IsCancelled() const { return _cancelled.load(std::memory_order_acquire); }
  
  	private:
  		void __Entry();
  
  		Entry _entry;
  		void *_argument;
  
  		std::atomic<bool> _cancelled;
  		std::atomic<bool> _exited;
  
  		IODeclareMeta(Thread)
  	};
  }
  
  #endif /* _IOTHREAD_H_ */
  