View spinlock_mutex.cpp
// ============================================================================ | |
// This code is in the Public Domain - I claim no copyrights over it. | |
// Use at your own leisure and risk. | |
// | |
// Compiled and tested with: | |
// c++ -std=c++11 -fno-exceptions -Wall -Wextra -pedantic -O3 spinlock_mutex.cpp | |
// ============================================================================ | |
#include <cassert> | |
#include <cstdio> |
View linear_allocator.cpp
// ============================================================================ | |
// This code is in the Public Domain - I claim no copyrights over it. | |
// Use at your own leisure and risk. | |
// | |
// Compiled and tested with: | |
// c++ -std=c++11 -fno-exceptions -Wall -Wextra -pedantic -O3 linear_allocator.cpp | |
// ============================================================================ | |
#include <cassert> | |
#include <cstdint> |
View debug_allocator.hpp
// ================================================================================================ | |
// -*- C++ -*- | |
// File: debug_allocator.hpp | |
// Author: Guilherme R. Lampert | |
// Created on: 03/12/16 | |
// | |
// About: | |
// Virtual memory pages backed debug allocator. Aligns each memory allocation to one | |
// or more pages and adds an additional header and footer protected pages, ensuring that |
View template_method_specialization.cpp
// | |
// Overriding a member method of a template class/struct by defining a specialized implementation. | |
// | |
#include <cstdio> | |
#include <typeinfo> | |
template<typename T> | |
struct Foo | |
{ |
View data_race_detection.cpp
// | |
// Simple unique lock guard to detect concurrent access to unsynchronized global data. | |
// | |
// This can be a useful tool to debug data races and identify places where a mutex should | |
// be introduced. Once the race is fixed, you'll likely want to strip out this code... | |
// | |
// -------------------------------------------------------- | |
#include <atomic> |
View memory_pools.hpp
// ================================================================================================ | |
// -*- C++ -*- | |
// File: memory_pools.hpp | |
// Author: Guilherme R. Lampert | |
// Created on: 08/02/17 | |
// | |
// About: | |
// Useful templated memory pools of objects (header only). | |
// This file provides a DynamicPool and a pair of FixedSizePools, |
View atomic_slist_128bits_cas.cpp
// -------------------------------------------------------------------------------------- | |
// Atomic singly-linked intrusive list using 128-bits Compare And Swap (AKA: DCAS). | |
// Keeps a version counter with the list head to prevent the A-B-A problem. | |
// | |
// Based on the implementation found in moodycamel.com: | |
// http://moodycamel.com/blog/2014/solving-the-aba-problem-for-lock-free-free-lists | |
// | |
// My implementation uses raw GCC/Clang atomics intrinsics. While in theory | |
// std::atomic of a struct of exactly 16 bytes and properly aligned could |
View stack_machine.cpp
// | |
// Simple stack-based virtual machine tests. | |
// | |
// I use two slightly different strategies to manage the | |
// interpreter stack: First is using the "naive" approach | |
// of keeping a stack pointer that is bumped/decremented | |
// for every instruction that has stack operands. The second | |
// approach uses a "stack cache" register to cache the | |
// Top-of-Stack (TOS) value. | |
// |
View simple_lru_cache.cpp
// ---------------------------------------------------------------------------- | |
// Least Recently Used cache backed by a hash table | |
// (unprdered_map) and a fixed-size circular queue. | |
// | |
// License: | |
// Public Domain. | |
// Feel free to copy, distribute, and modify this file as you see fit. | |
// ---------------------------------------------------------------------------- |
View simple_heap.hpp
#pragma once | |
// ======================================================== | |
#include <algorithm> | |
#include <array> | |
#include <cstddef> | |
#include <cstdint> | |
#include <cstring> |
OlderNewer