Uploaded image for project: 'Clojure'
  1. CLJ-113

GC Issue 109: RT.load's "don't load if already loaded" mechanism breaks ":reload-all"

    Details

    • Type: Bug
    • Status: In Progress
    • Priority: Major
    • Resolution: Unresolved
    • Affects versions: None
    • Fix versions: None
    • Labels:
      None

      Description

       Reported by scgilardi, Apr 24, 2009
      
      What (small set of) steps will reproduce the problem?
      
      "require" and "use" support a ":reload-all" flag that is intended to  
      cause the specified libs to be reloaded along with all libs on which  
      they directly or indirectly depend. This is implemented by temporarily  
      binding a "loaded-libs" var to the empty set and then loading the  
      specified libs.
      
      AOT compilation added another "already loaded" mechanism to  
      clojure.lang.RT.load() which is currently not sensitive to a "reload-
      all" being in progress and breaks its operation in the following case:
      
              A, B, and C are libs
              A depends on B. (via :require in its ns form)
              B depends on C. (via :require in its ns form)
              B has been compiled (B.class is on classpath)
      
              At the repl I "require" A which loads A, B, and C (either from
      class files or clj files)
              I modify C.clj
              At the repl I "require" A with the :reload-all flag, intending to  
      pick up the changes to C
              C is not reloaded because RT.load() skips loading B: B.class
      exists, is already loaded, and B.clj hasn't changed since it was compiled.
      
      
      What is the expected output? What do you see instead?
      
      I expect :reload-all to be effective. It isn't.
      
      What version are you using?
      
      svn 1354, 1.0.0RC1
      
      Was this discussed on the group? If so, please provide a link to the
      discussion:
      
      http://groups.google.com/group/clojure/browse_frm/thread/9bbc290321fd895f/e6a967250021462a#e6a967250021462a
      
      Please provide any additional information below.
      
      I'll upload a patch soon that creates a "*reload-all*" var with a  
      root binding of nil and code to bind it to true when the current  
      thread has a :reload-all call pending. When *reload-all* is true,  
      RT.load() will (re)load all libs from their ".clj" files even if  
      they're already loaded.
      
      The fix for this may need to be coordinated with a fix for issue #3.
      
      

        Attachments

          Activity

            People

            • Assignee:
              Unassigned
              Reporter:
              alex+import import
            • Votes:
              0 Vote for this issue
              Watchers:
              0 Start watching this issue

              Dates

              • Created:
                Updated: