Sha256: fd936bd3d34c25799f71d4b9c1a8220f60fc4fe18dc1e1a6bb07d6bc20b76aa6

Contents?: true

Size: 1.63 KB

Versions: 4

Compression:

Stored size: 1.63 KB

Contents

# frozen_string_literal: true

require 'raindrops'

module Pitchfork
  module SharedMemory
    extend self

    PER_DROP = Raindrops::PAGE_SIZE / Raindrops::SIZE
    CURRENT_GENERATION_OFFSET = 0
    SHUTDOWN_OFFSET = 1
    MOLD_TICK_OFFSET = 2
    MOLD_PROMOTION_TICK_OFFSET = 3
    WORKER_TICK_OFFSET = 4

    DROPS = [Raindrops.new(PER_DROP)]

    def current_generation
      DROPS[0][CURRENT_GENERATION_OFFSET]
    end

    def current_generation=(value)
      DROPS[0][CURRENT_GENERATION_OFFSET] = value
    end

    def shutting_down!
      DROPS[0][SHUTDOWN_OFFSET] = 1
    end

    def shutting_down?
      DROPS[0][SHUTDOWN_OFFSET] > 0
    end

    class Field
      def initialize(offset)
        @drop = DROPS.fetch(offset / PER_DROP)
        @offset = offset % PER_DROP
      end

      def value
        @drop[@offset]
      end

      def value=(value)
        @drop[@offset] = value
      end
    end

    def mold_deadline
      self[MOLD_TICK_OFFSET]
    end

    def mold_promotion_deadline
      self[MOLD_PROMOTION_TICK_OFFSET]
    end

    def worker_deadline(worker_nr)
      self[WORKER_TICK_OFFSET + worker_nr]
    end

    def [](offset)
      Field.new(offset)
    end

    # Since workers are created from another process, we have to
    # pre-allocate the drops so they are shared between everyone.
    #
    # However this doesn't account for TTIN signals that increase the
    # number of workers, but we should probably remove that feature too.
    def preallocate_drops(workers_count)
      0.upto(((WORKER_TICK_OFFSET + workers_count) / PER_DROP.to_f).ceil) do |i|
        DROPS[i] ||= Raindrops.new(PER_DROP)
      end
    end
  end
end

Version data entries

4 entries across 4 versions & 1 rubygems

Version Path
pitchfork-0.13.0 lib/pitchfork/shared_memory.rb
pitchfork-0.12.0 lib/pitchfork/shared_memory.rb
pitchfork-0.11.1 lib/pitchfork/shared_memory.rb
pitchfork-0.11.0 lib/pitchfork/shared_memory.rb