#5254: usb library fails on Windows
---------------------------------+------------------------------------------
    Reporter:  basvandijk        |       Owner:                
        Type:  bug               |      Status:  new           
    Priority:  normal            |   Component:  Compiler (FFI)
     Version:  7.0.3             |    Keywords:                
    Testcase:                    |   Blockedby:                
          Os:  Windows           |    Blocking:                
Architecture:  Unknown/Multiple  |     Failure:  Runtime crash 
---------------------------------+------------------------------------------
 I'm trying to get my Haskell `usb` library to work on Windows. I currently
 get a weird error. Please follow the steps below to reproduce the error:

  * Download
 [http://www.libusb.org/wiki/windows_backend#LatestBinarySnapshots libusb
 for Windows] and extract it somewhere e.g. `C:\Program
 Files\libusb\libusb1`.

  (Important build-time files: `libusb-1.0\include\libusb.h` and
 `MinGW32\dll\libusb-1.0.dll.a`)

  (Important run-time files: `MinGW32\dll\libusb-1.0.dll`)

  * Download, unpack and cabal install the, as of yet unreleased,
 [https://bitbucket.org/mauricio/bindings-dsl/get/1.0.12.tar.gz bindings-
 DSL-1.0.12]
  (This version lets you use the right calling convention on Windows
 (`stdcall` instead of `ccall`) by configuring cabal with
  `cc-options: -DBINDINGS_STDCALLCONV`)

  * Install `bindings-libusb`:
 {{{
 git clone git://github.com/basvandijk/bindings-libusb.git
 cd bindings-libusb
 }}}

  Make sure to checkout the `windows` branch and let cabal know where to
 find `libusb`:
 {{{
 git checkout windows
 cabal install --extra-include-dirs="C:\Program
 Files\libusb\libusb1\include\libusb-1.0"
               --extra-lib-dirs="C:\Program
 Files\libusb\libusb1\MinGW32\dll"
 }}}

  * Clone the `usb` repository:
 {{{
 git clone git://github.com/basvandijk/usb.git
 cd usb
 }}}
  There's no need to install the library. I included an example program
 that will demonstrate the error:
 {{{
 cabal configure --flags="example -library"
 cabal build
 }}}

 The example should read some bytes of an attached USB mouse (change the
 VID and PID to match your mouse). However it gives two errors:

 {{{
 dist\build\example\example.exe
 example.exe: NotFoundException
 Segmentation fault/access violation in generated code
 }}}

 This bug report is about the segmentation fault.

 The `NotFoundException` is thrown by `c'libusb_get_config_descriptor`
 which is indirectly called by `getDevices`. According to the
 
[http://libusb.sourceforge.net/api-1.0/group__desc.html#gaa635d9aec77de4895dd0896ccf001532
 libusb docs]
 this error is thrown when the specified configuration doesn't
 exists. Since I only call this function on existing configurations
 this seems like a bug in libusb. I will dive in the libusb source code to
 see what is going on.

 The `Segmentation fault/access violation in generated code` is caused
 by the finalizer in `newCtx`:

 {{{
 newCtx ∷ IO Ctx
 newCtx = newCtxNoEventManager Ctx

 libusb_init ∷ IO (Ptr C'libusb_context)
 libusb_init = alloca $ \ctxPtrPtr → do
                handleUSBException $ c'libusb_init ctxPtrPtr
                peek ctxPtrPtr

 newCtxNoEventManager ∷ (ForeignPtr  C'libusb_context → Ctx) → IO Ctx
 newCtxNoEventManager ctx = mask_ $ do
                             ctxPtr ← libusb_init
                             ctx <$> newForeignPtr p'libusb_exit ctxPtr
 }}}

 When `p'libusb_exit` is called the segmentation fault occurs.

 '''Note that the error disappears when I change that last line with:

 `ctx <$> Foreign.Concurrent.newForeignPtr ctxPtr (c'libusb_exit
 ctxPtr)`'''

 I previously got the exact same segmentation fault when calling other
 `bindings-libusb` functions. This was caused by using the wrong calling
 convention on Windows. I used `ccall` but had to use `stdcall`. So I
 assume the current segmentation fault has something to do with the calling
 convention of `FunPtrs`.

 Any ideas what is causing this? I would really like to solve it. It's the
 last step before releasing `usb-1.0`.

 Thanks!

-- 
Ticket URL: <http://hackage.haskell.org/trac/ghc/ticket/5254>
GHC <http://www.haskell.org/ghc/>
The Glasgow Haskell Compiler

_______________________________________________
Glasgow-haskell-bugs mailing list
[email protected]
http://www.haskell.org/mailman/listinfo/glasgow-haskell-bugs

Reply via email to