Code Monkey home page Code Monkey logo

Comments (9)

jnicklas avatar jnicklas commented on May 14, 2024

Fixing this would require using Thread locals or some other similar ugly hack. So I'm going to say this is outside the scope of the library.

from pundit.

slowjack2k avatar slowjack2k commented on May 14, 2024

@jnicklas Yes, when you want to use it with jruby or rubinius, then you have to use some thing like this:

module Pundit
  class NotAuthorizedError < StandardError; end
  class NotDefinedError < StandardError; end

  extend ActiveSupport::Concern
   THREAD_KEY_NAME = '_pundit_policy_authorized'
  class << self

     def policy_authorized?
       !! Thread.current[THREAD_KEY_NAME] 
     end

     def policy_authorized=(new_value)
         Thread.current[THREAD_KEY_NAME] =new_value 
     end

     def reset_policy_authorized
         policy_authorized = false
     end
  end 

from pundit.

jnicklas avatar jnicklas commented on May 14, 2024

@slowjack2k this has nothing to do with which Ruby implementation you use. Provided you use a threaded server (like Puma), this is a problem in MRI too. And thread locals really aren't a sensible solution for this, IMO.

from pundit.

slowjack2k avatar slowjack2k commented on May 14, 2024

@jnicklas It depends on the Ruby implementation. MRI has still a global interpreder lock.
Even with puma only one thread can run other thread's can only do IO. Changing class level instance variables is save as long as you don't use jruby or rubinius.

from pundit.

tbuehlmann avatar tbuehlmann commented on May 14, 2024

No, it's not.You don't have thread safe code per se when using MRI.

from pundit.

slowjack2k avatar slowjack2k commented on May 14, 2024

@tbuehlmann Ok, you'r right when you do IO a context switches can happen.

from pundit.

jnicklas avatar jnicklas commented on May 14, 2024

@slowjack2k no, that's incorrect. You misunderstand what the GIL does. Context switches can and do happen at any point in time, even with a GIL. Look up the difference between concurrent and parallel. MRI never executes Threads in parallel, but it definitely does execute them concurrently.

from pundit.

jnicklas avatar jnicklas commented on May 14, 2024

(should have said almost never, IIRC there are a few rare cases where MRI actually does execute multiple threads in parallel)

from pundit.

tbuehlmann avatar tbuehlmann commented on May 14, 2024

http://www.rubyinside.com/does-the-gil-make-your-ruby-code-thread-safe-6051.html is a good read.

from pundit.

Related Issues (20)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.