2012-04-09 17 views
5

he encontrado este pedazo de código en el paquete Haskell sendfile:¿Qué significa '#type' en Haskell Foreign Function Interface?

http://patch-tag.com/r/mae/sendfile/snapshot/current/content/pretty/src/Network/Socket/SendFile/Linux.hsc

-- sendfile64 gives LFS support 
foreign import ccall unsafe "sendfile64" c_sendfile 
    :: Fd -> Fd -> Ptr (#type off64_t) -> (#type size_t) -> IO (#type ssize_t) 

1) lo que hace #type media y 2) ¿por qué recibo este error,

[1 of 1] Compiling Linux.Splice  (splice.hs, splice.o) 

splice.hs:40:12: parse error on input `type' 

cuando yo mismo trato de usarlo de la siguiente manera ?:

ghc --make splice.hs 

splice.hs:

{-# LANGUAGE ForeignFunctionInterface #-} 

module Linux.Splice where 

import Data.Word 
import System.Posix.Types 

-- SPLICE 

-- fcntl.h 
-- ssize_t splice(
-- int   fd_in, 
-- loff_t*  off_in, 
-- int   fd_out, 
-- loff_t*  off_out, 
-- size_t  len, 
-- unsigned int flags 
--); 

foreign import ccall unsafe "fnctl.h splice" c_splice 
    :: Fd 
    -> Ptr (#type {- < parse error -} loff_t) 
    -> Fd 
    -> Ptr (#type loff_t) 
    -> (#type size_t) 
    -> Word 
    -> IO (#type ssize_t) 

(utilizando 7.4.x GHC)

+5

http://www.haskell.org/ghc/docs/latest/html/users_guide/hsc2hs.html – sdcvvc

+2

Debo señalar que esta importación extranjera debe ** no ** marcarse como "insegura". Cuando una función foránea marca bloques 'inseguros', puede evitar que otros subprocesos se ejecuten (en un programa compilado con GHC con '-threaded'). –

+0

@JoeyAdams ¡Muchas gracias por señalar eso! Estoy trabajando en una implementación pulida de empalme de zócalos de red para mi servidor proxy. Lo cual espero usar en Linux en lugar de loops de lectura/escritura que todavía seguiría usando en otros sistemas operativos por el momento. –

Respuesta

5

Como se ha señalado por scdvvc, este utiliza los macros C preprocesamiento definidos por hsc2hs para personalizar el código específicamente para el sistema que está siendo compilado en. Debería usar hsc2hs para obtener las macros apropiadas definidas para su código.

+0

Wow gracias por la respuesta rápida :) –

+0

Btw, who/what is 'scdvvc'? –

+2

El comentarista de su pregunta original, que francamente merece más crédito que yo. ;) –

Cuestiones relacionadas