Steve Fink
2009-03-19 04:43:35 UTC
I understand initialization of an XS module may be modified using
BOOT.
However, there seems to be no counterpart of BOOT. How do I e.g. free
memory I allocated in BOOT?
BOOT.
However, there seems to be no counterpart of BOOT. How do I e.g. free
memory I allocated in BOOT?
Or is the current practice to write an XS function that e.g. frees the
memory allocate at BOOT and call it in an END handler in the module's
Perl code?
memory allocate at BOOT and call it in an END handler in the module's
Perl code?
Yes, but perl objects are going to be cleaned up (or at least, any with
DESTROY methods are going to get it called) before then, so that's somewhat
a red herring.
But possibly also a solution - anything allocated in BOOT that is stashed
inside an object will get that object's destroy method called soon after
END time, with a live interpreter.
I don't create any object in my XS module, it has a pure functionalDESTROY methods are going to get it called) before then, so that's somewhat
a red herring.
But possibly also a solution - anything allocated in BOOT that is stashed
inside an object will get that object's destroy method called soon after
END time, with a live interpreter.
interface. Is there anything like a destroy function instead of a
destroy method?
blessed reference. :)
In the past, I have created a dummy object for more or less this
purpose. It needn't be visible in your interface, so it doesn't really
matter whether you are doing things in a function- or object-oriented
style.
our $__WEAREALLGONNADIE = bless {}, 'My::Package::Cleanup';
sub My::Package:Cleanup::DESTROY {
cleanup_function_written_in_C();
}
In my case, I was explicitly destroying the symbol table, so I knew
that everything was still alive everywhere but in my custom-created
packages.In your case, this would end up in the scary global
destruction phase as others have pointed out. But if that bothers you,
why aren't you just using an END block again?
Although this worries me: "Is there a common practice for cleaning up
or do people just trust the OS to free everything when the process
exits?" together with "Or is the current practice to write an XS
function that e.g. frees the memory allocate at BOOT..."
If you don't trust the OS to free up allocated memory, you are going
to go insane for no useful reason. In what way would that memory be
allocated if the process no longer exists? There's no place to put it.
Stop worrying about it. It's dead, and the house it lived in is now a
strip mall.
That said, there are plenty of ways to allocate resources or perform
actions that will outlive a process -- shared memory, files, message
queues, emails to ex-girlfriends, etc. But it doesn't sound like what
you're worried about. The only reason I know of to explicitly
deallocate memory when you are certain a process is dying anyway is to
make it easier to track down true memory leaks without the
distractions of spurious reports. There's also an aesthetic argument,
but it's less persuasive when you realize you're sacrificing
efficiency. Why erase the writing on a piece of paper before throwing
it in the fire?