Patching XS modules
Today, I found out about a new release of Image::Thumbnail , which has support for Image::Epeg , a library coming from the Enlightenment desktop manager. Likely, epeg is quite fast, but it didn't build and test right under Windows. Conveniently though, Tokuhiro Matsuno maintains the module on github, so it was just a matter of forking and cloning his repository, and then trying to find out what made it break.
The breakage itself was three parts:
- A build failure where the symbols were not exported. It seems the epeg library wants
-DBUILDING_DLL
, which I supplied as acc_optimize_flag
throughModule::Install
, because I couldn't find a better way. - Some test failures because
binmode()
was not used with the test image files. Easily fixed.
These two tests made it into v0.11 , released about 30 minutes after I told tokuhirom about the patches.
The remaining problem was that a function call crashed Perl with
Free to wrong pool ... at ...
This was due to a call to free(pOut)
to release a memory block that the epeg library allocated for us. Unfortunately, the library uses malloc
and free
, and Perl redefines the two, so I had to find a way to make the XS module also call the original free()
and not the redefined free()
. Tye McQueen pointed out a working hack by making the compiler forget the redefinition:
#undef free
That undefinition would not have worked if there were other places below that line that still needed access to the redefined free()
, but luckily that was not the case. The only snag was my limited knowledge of C preprocessor specifics, as I had some whitespace before the #undef and it was not picked up nor flagged as error. But after some trials, I also figured that out, and the pull request went out.
Leave a comment