[Haskell-cafe] C call blocking indefinitely/behaving differently when called from Haskell
Oliver Charles
ollie at ocharles.org.uk
Wed Aug 10 17:18:05 UTC 2016
Hi all,
I'm trying to interface with a Basler USB3 camera
<http://www.baslerweb.com/en/products/> from a Haskell application, but I'm
experiencing some difficulty. The camera comes with a C++ library that
makes it fairly straight forward. The following code can be used to acquire
a camera source:
PylonAutoInitTerm pylon;
CInstantCamera camera( CTlFactory::GetInstance().CreateFirstDevice());
camera.RegisterConfiguration( (CConfigurationEventHandler*) NULL,
RegistrationMode_ReplaceAll, Cleanup_None);
cout << "Using device " << camera.GetDeviceInfo().GetModelName() <<
endl;
Using the inline-c and inline-c-cpp libraries, I am trying to perform this
same call from a Haskell executable. I have the following:
{-# LANGUAGE QuasiQuotes, TemplateHaskell #-}
import qualified Language.C.Inline as C
import qualified Language.C.Inline.Cpp as C
C.context C.cppCtx
C.include "pylon/PylonIncludes.h"
C.include "iostream"
C.using "namespace Pylon";
C.using "namespace std";
main :: IO ()
main =
[C.block| void {
PylonAutoInitTerm pylon;
CInstantCamera camera( CTlFactory::GetInstance().CreateFirstDevice());
camera.RegisterConfiguration( (CConfigurationEventHandler*) NULL,
RegistrationMode_ReplaceAll, Cleanup_None);
cout << "Using device " << camera.GetDeviceInfo().GetModelName() <<
endl;
}|]
However, when the resulting executable is ran, it hangs - failing to print
"Using device".
inline-c generates a Test.cpp file, which contains
#include "pylon/PylonIncludes.h"
#include "iostream"
using namespace Pylon;
using namespace std;
extern "C" {
void inline_c_Main_0_e23f0c6a0bc10367be76252744bf4e6c74493314() {
PylonAutoInitTerm pylon;
CInstantCamera camera( CTlFactory::GetInstance().CreateFirstDevice());
camera.RegisterConfiguration( (CConfigurationEventHandler*) NULL,
RegistrationMode_ReplaceAll, Cleanup_None);
cout << "Using device " << camera.GetDeviceInfo().GetModelName() <<
endl;
}
}
If I modify this exact file, I can turn it into something that can be run,
by simply adding:
int main() {
inline_c_Main_0_e23f0c6a0bc10367be76252744bf4e6c74493314();
}
At this point, I can now compile that very C++ code with G++ and run it:
[nix-shell:~/work/circuithub/receiving-station]$ g++ Test.cpp
-I/home/ollie/work/circuithub/receiving-station/pylon5/include
-L/home/ollie/work/circuithub/receiving-station/pylon5/lib64 -Wl,-E
-lpylonbase -lpylonu
tility -lGenApi_gcc_v3_0_Basler_pylon_v5_0
-lGCBase_gcc_v3_0_Basler_pylon_v5_0 -Wl,--enable-new-dtags
-Wl,-rpath,/home/ollie/work/circuithub/receiving-station/pylon5/lib64
[nix-shell:~/work/circuithub/receiving-station]$ ./a.out
GetDeviceDiscoveryInfo: bFunctionClass = 14, bFunctionSubClass = 3,
bFunctionProtocol = 0. Device is not an U3V device.
GetDeviceDiscoveryInfo: bFunctionClass = 14, bFunctionSubClass = 3,
bFunctionProtocol = 0. Device is not an U3V device.
Using device acA3800-14um
So as we can see, the C++ code is not the problem.
Does anyone know why I don't see the same behaviour from my Haskell
application? I imagine there might be some thread trickery happening behind
the scenes, but I don't know what to even begin looking for.
Thanks, let me know if you need any more information.
- Ollie
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.haskell.org/pipermail/haskell-cafe/attachments/20160810/ebc8eca9/attachment.html>
More information about the Haskell-Cafe
mailing list