MARK P. JONES
Pacific Software Research Center
Department of Computer Science and Engineering
Oregon Graduate Institute of Science and Technology
open import Data.Empty using ( ⊥ ; ⊥-elim ) | |
open import Data.Unit using ( ⊤ ; tt ) | |
open import Data.Bool using ( Bool ; true ; false ; if_then_else_ ) | |
renaming ( _≟_ to _≟B_ ) | |
open import Data.Nat using ( ℕ ; zero ; suc ) | |
renaming ( _≟_ to _≟ℕ_ ) | |
open import Data.Product using ( Σ ; _,_ ) | |
open import Relation.Nullary using ( Dec ; yes ; no ) | |
open import Relation.Binary using ( Decidable ) | |
open import Relation.Binary.PropositionalEquality using ( _≡_ ; refl ) |
// This code installs a custom signal handler for the SIGSEGV signal | |
// (segmentation fault) and then purposefully creates a segmentation | |
// fault. The custom handler `handler` is then entered, which now | |
// increases the instruction pointer by 1, skipping the current byte | |
// of the faulty instruction. This is done for as long as the faulty | |
// instruction is still active; in the below case, that's 2 bytes. | |
// Note: This is for 64 bit systems. If you prefer 32 bit, change | |
// `REG_RIP` to `REG_EIP`. I didn't bother putting an appropriate | |
// `#ifdef` here. |
(draft; work in progress)
See also:
{-# OPTIONS --rewriting #-} | |
module cont-cwf where | |
open import Agda.Builtin.Sigma | |
open import Agda.Builtin.Unit | |
open import Agda.Builtin.Bool | |
open import Agda.Builtin.Nat | |
open import Data.Empty | |
import Relation.Binary.PropositionalEquality as Eq |
If you want to see how it works, see the README on the repo.
// Estimating CPU frequency... | |
// CPU frequency: 4.52 GHz | |
// sum1: value = 15182118497126522709, 0.31 secs, 5.14 cycles/elem | |
// sum2: value = 15182118497126522709, 0.17 secs, 2.93 cycles/elem | |
#define RW(x) asm("" : "+r"(x)) | |
typedef struct Node { | |
u64 value; | |
struct Node *next; |
{-# OPTIONS --rewriting #-} | |
module sknorm where | |
open import Agda.Primitive | |
open import Level | |
open import Relation.Binary.PropositionalEquality | |
open import Agda.Builtin.Equality.Rewrite | |
open import Data.Product | |
open import Data.Empty |
// Compile with clang or MSVC (WINDOWS ONLY RN) | |
// | |
// Implementing a POC green threads system using safepoints to show how cheap and simple it can | |
// be done, all you need to do is call SAFEPOINT_POLL in your own language at the top of every | |
// loop and function body (you can loosen up on this depending on the latency of pausing you're | |
// willing to pay). Safepoint polling is made cheap because it's a load without a use site | |
// which means it doesn't introduce a stall and pays a sub-cycle cost because of it (wastes resources | |
// sure but doesn't block up the rest of execution). | |
// | |
// # safepoint poll |
{-# OPTIONS --guarded #-} | |
open import Agda.Primitive | |
open import Relation.Binary.PropositionalEquality using (_≡_; refl; subst; sym; trans) | |
open import Data.Unit using (⊤; tt) | |
open import Data.Nat -- using (ℕ; _+_; suc; _<_) | |
open import Data.Nat.Properties | |
open import Data.Fin using (Fin; fromℕ; fromℕ<) | |
open import Data.Vec using (Vec; lookup; []; _∷_; [_]; _++_; map) |