2012-04-09 10 views
5

ho trovato questo pezzo di codice nel pacchetto Haskell sendfile:Che cosa significa "#type" nell'interfaccia di funzione straniera Haskell?

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) Che cosa significa #type significa e 2) perché ottengo questo errore,

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

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

quando io stesso cerco di usarlo come segue ?:

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) 

(usando GHC 7.4.x)

+5

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

+2

Devo sottolineare che questa importazione straniera dovrebbe ** non ** essere contrassegnata come non sicura. Quando una funzione straniera ha marcato blocchi 'non sicuri', può impedire l'esecuzione di altri thread (in un programma compilato con GHC con' -threaded'). –

+0

@ JoeyAdams Oh grazie mille per averlo fatto notare! Sto lavorando su una lucida implementazione di splicing dei socket di rete per il mio server proxy. Che spero di usare su Linux invece che su cicli di lettura/scrittura, continuerei comunque a utilizzarlo su altri sistemi operativi per il momento. –

risposta

5

Come rilevato dalla scdvvc, Questo utilizza le macro C pre-elaborazione definite da hsc2hs per personalizzare il codice specifico al sistema è in fase di compilazione sopra. Dovresti utilizzare hsc2hs per ottenere le macro appropriate definite per il tuo codice.

+0

Wow grazie per la rapida risposta :) –

+0

Btw, chi/che cosa è 'scdvvc'? –

+2

Il commentatore della tua domanda iniziale, che francamente merita più credito di me. ;) –