Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Sometimes hammerspoon hangs. Is there an easy way to profile our config? #3678

Open
unphased opened this issue Aug 23, 2024 · 4 comments
Open

Comments

@unphased
Copy link

unphased commented Aug 23, 2024

I've noticed some inconsistent hanging/slowness with hammerspoon where it does not respond and I will notice that the menubar tray icon is beachballing. There are times when I've killed it and times when it only crunches on something for about a second or two before responding. And then it mysteriously stops and starts working normally. Today it was doing that, i restarted it once it gave me control, upon restarting it was still being slow, but then it started not being slow by itself shortly after that.

One easy but not great way to "profile" it is to place prints in the config and try to see which areas we got to by watching the console, but when we have freezing like this, it's often not even possible to bring up the console as neither the hotkey I set up to do it will be working nor will the menu be responsive on account of it being beachballed. But I will try next time it happens maybe I can bring it up and put the console on always on top mode and see if it can be useful this way.

But are there other viable approaches?

@unphased
Copy link
Author

unphased commented Aug 28, 2024

I'm using

local socket = require "socket"
local function dump(o)
   if type(o) == 'table' then
      local s = '{ '
      for k,v in pairs(o) do
         if type(k) ~= 'number' then k = '"'..k..'"' end
         s = s .. '['..k..'] = ' .. dump(v) .. ','
      end
      return s .. '} '
   else
      return tostring(o)
   end
end

_G.l = function(...)
  local args = {...}
  local log_file_path = "/tmp/lua-hs.log"
  local log_file = io.open(log_file_path, "a")
  if log_file == nil then
    print("Could not open log file: " .. log_file_path)
    return
  end
  io.output(log_file)
  io.write(socket.gettime() .. " >>> ")
  for i, payload in ipairs(args) do
    local ty = type(payload)
    if ty == "table" then
      io.write(string.format("%d -> %s\n", i, dump(payload)))
    elseif ty == "function" then
      io.write(string.format("%d -> [function]\n", i))
    else
      io.write(string.format("%d -> %s\n", i, payload))
    end
  end
  io.close(log_file)
end

stuck in the front of my hammerspoon config.

I tried posix.clock_gettime, but that method somehow doesnt exist when i fetch luaposix with luarocks, so i gave up on that.

I found some hanging behavior around here

local function findNeovideInstancesAccessOrder()
    print("Listing Neovides by window order...")
    l('fNIAO')
    local instances = {}
    local orderedWindows = hs.window.orderedWindows()
    l('fNIAO 1')
    for _, window in ipairs(orderedWindows) do
        l('fNIAO 2 ' .. window:title())
        local app = window:application();
        if app:bundleID() == 'com.neovide.neovide' then
            table.insert(instances, app)
        end
    end
    return instances
end

but the sluggishness went away after i added these logs so i will have to wait until it gets sluggish again to continue troubleshooting this.

@latenitefilms
Copy link
Contributor

local socket = require "socket"

Any reason you're not using a built-in Hammerspoon extension?

@latenitefilms
Copy link
Contributor

local orderedWindows = hs.window.orderedWindows()

My guess is SOMETHING on your system is blocking/breaking the Accessibility API. Can you try force quit everything except Hammerspoon?

@unphased
Copy link
Author

unphased commented Aug 29, 2024

the issue doesnt really happen frequently enough to be a problem. I suspect the largest hanging thing is hs.window.orderedWindows() but I havent been able to confirm it before it started being fast again.

Any reason you're not using a built-in Hammerspoon extension?

Could you elaborate on which built in extension would provide millisecond or better precision?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants