ngx-export 1.3.0 → 1.4.0
raw patch · 3 files changed
+60/−4 lines, 3 files
Files
- Changelog.md +5/−0
- NgxExport.hs +54/−3
- ngx-export.cabal +1/−1
Changelog.md view
@@ -1,3 +1,8 @@+### 1.4.0++- Added a number of opaque pointers to Nginx global objects for using them in+ C plugins.+ ### 1.3.0 - Export function *ngxExportInstallSignalHandler* to ignore SIGINT.
NgxExport.hs view
@@ -39,6 +39,10 @@ ,ngxExportAsyncHandler ,ngxExportAsyncHandlerOnReqBody ,ngxExportServiceHook+ -- * Opaque pointers to Nginx global objects+ ,ngxCyclePtr+ ,ngxUpstreamMainConfPtr+ ,ngxCachedTimePtr -- * Re-exported data constructors from /"Foreign.C"/ -- (for marshalling in foreign calls) ,Foreign.C.CInt (..)@@ -51,6 +55,8 @@ import Foreign.Storable import Foreign.Marshal.Alloc import Foreign.Marshal.Utils+import Data.IORef+import System.IO.Unsafe import System.IO.Error import System.Posix.IO import System.Posix.Types@@ -568,19 +574,25 @@ then writeFlag8b else writeFlag1b >> closeChannel ) >>= newStablePtr- where writeBufN n s = void $+ where writeBufN n s = iterateUntilM (>= n) (\w -> (w +) <$> fdWriteBuf fd (plusPtr s $ fromIntegral w) (n - w) `catchIOError` (\e -> return $ if isEINTR e then 0- else n+ else n + 1 )- ) 0+ ) 0 >>= \w -> when (w > n) cleanupOnWriteError writeFlag1b = B.unsafeUseAsCString asyncIOFlag1b $ writeBufN 1 writeFlag8b = B.unsafeUseAsCString asyncIOFlag8b $ writeBufN 8 closeChannel = closeFd fd `catchIOError` const (return ())+ -- FIXME: cleanupOnWriteError should free contents of p, spd,+ -- and spct. However, leaving this not implemented seems to be safe+ -- because Nginx won't close the event channel or delete the request+ -- object (for request-driven handlers) regardless of the Haskell+ -- handler's duration.+ cleanupOnWriteError = return () asyncIOYY :: IOYY -> CString -> CInt -> CInt -> CInt -> Ptr CUInt -> CUInt -> CUInt ->@@ -769,4 +781,43 @@ ngxExportVersion x (I n) = fromIntegral <$> foldM (\k (I v) -> pokeElemOff x k v >> return (k + 1)) 0 (take n $ versionBranch version)++-- | Returns an opaque pointer to the Nginx cycle object+-- for using it in C plugins.+ngxCyclePtr :: IO (Ptr ())+ngxCyclePtr = readIORef ngxCyclePtrStore++-- | Returns an opaque pointer to the Nginx upstream main configuration+-- for using it in C plugins.+ngxUpstreamMainConfPtr :: IO (Ptr ())+ngxUpstreamMainConfPtr = readIORef ngxUpstreamMainConfPtrStore++-- | Returns an opaque pointer to the Nginx cached time object+-- for using it in C plugins.+ngxCachedTimePtr :: IO (Ptr ())+ngxCachedTimePtr = readIORef ngxCachedTimePtrStore++foreign export ccall ngxExportSetCyclePtr :: Ptr () -> IO ()+ngxExportSetCyclePtr :: Ptr () -> IO ()+ngxExportSetCyclePtr = writeIORef ngxCyclePtrStore++foreign export ccall ngxExportSetUpstreamMainConfPtr :: Ptr () -> IO ()+ngxExportSetUpstreamMainConfPtr :: Ptr () -> IO ()+ngxExportSetUpstreamMainConfPtr = writeIORef ngxUpstreamMainConfPtrStore++foreign export ccall ngxExportSetCachedTimePtr :: Ptr () -> IO ()+ngxExportSetCachedTimePtr :: Ptr () -> IO ()+ngxExportSetCachedTimePtr = writeIORef ngxCachedTimePtrStore++ngxCyclePtrStore :: IORef (Ptr ())+ngxCyclePtrStore = unsafePerformIO $ newIORef nullPtr+{-# NOINLINE ngxCyclePtrStore #-}++ngxUpstreamMainConfPtrStore :: IORef (Ptr ())+ngxUpstreamMainConfPtrStore = unsafePerformIO $ newIORef nullPtr+{-# NOINLINE ngxUpstreamMainConfPtrStore #-}++ngxCachedTimePtrStore :: IORef (Ptr ())+ngxCachedTimePtrStore = unsafePerformIO $ newIORef nullPtr+{-# NOINLINE ngxCachedTimePtrStore #-}
ngx-export.cabal view
@@ -1,5 +1,5 @@ name: ngx-export-version: 1.3.0+version: 1.4.0 synopsis: Helper module for Nginx haskell module description: Helper module for <http://github.com/lyokha/nginx-haskell-module Nginx haskell module>