1713 case Value.parse_nat (UTF8.toString line) of |
1713 case Value.parse_nat (UTF8.toString line) of |
1714 Nothing -> return $ Just line |
1714 Nothing -> return $ Just line |
1715 Just n -> fmap trim_line . fst <$> read_block socket n |
1715 Just n -> fmap trim_line . fst <$> read_block socket n |
1716 \<close> |
1716 \<close> |
1717 |
1717 |
1718 generate_file "Isabelle/Standard_Thread.hs" = \<open> |
1718 generate_file "Isabelle/Isabelle_Thread.hs" = \<open> |
1719 {- Title: Isabelle/Standard_Thread.hs |
1719 {- Title: Isabelle/Isabelle_Thread.hs |
1720 Author: Makarius |
1720 Author: Makarius |
1721 LICENSE: BSD 3-clause (Isabelle) |
1721 LICENSE: BSD 3-clause (Isabelle) |
1722 |
1722 |
1723 Standard thread operations. |
1723 Isabelle-specific thread management. |
1724 |
1724 |
1725 See \<^file>\<open>$ISABELLE_HOME/src/Pure/Concurrent/standard_thread.ML\<close> |
1725 See \<^file>\<open>$ISABELLE_HOME/src/Pure/Concurrent/isabelle_thread.ML\<close> |
1726 and \<^file>\<open>$ISABELLE_HOME/src/Pure/Concurrent/standard_thread.scala\<close>. |
1726 and \<^file>\<open>$ISABELLE_HOME/src/Pure/Concurrent/isabelle_thread.scala\<close>. |
1727 -} |
1727 -} |
1728 |
1728 |
1729 {-# LANGUAGE NamedFieldPuns #-} |
1729 {-# LANGUAGE NamedFieldPuns #-} |
1730 |
1730 |
1731 module Isabelle.Standard_Thread ( |
1731 module Isabelle.Isabelle_Thread ( |
1732 ThreadId, Result, |
1732 ThreadId, Result, |
1733 find_id, |
1733 find_id, |
1734 properties, change_properties, |
1734 properties, change_properties, |
1735 add_resource, del_resource, bracket_resource, |
1735 add_resource, del_resource, bracket_resource, |
1736 is_stopped, expose_stopped, stop, |
1736 is_stopped, expose_stopped, stop, |
1910 import qualified System.IO as IO |
1910 import qualified System.IO as IO |
1911 |
1911 |
1912 import Isabelle.Library |
1912 import Isabelle.Library |
1913 import qualified Isabelle.UUID as UUID |
1913 import qualified Isabelle.UUID as UUID |
1914 import qualified Isabelle.Byte_Message as Byte_Message |
1914 import qualified Isabelle.Byte_Message as Byte_Message |
1915 import qualified Isabelle.Standard_Thread as Standard_Thread |
1915 import qualified Isabelle.Isabelle_Thread as Isabelle_Thread |
1916 |
1916 |
1917 |
1917 |
1918 {- server address -} |
1918 {- server address -} |
1919 |
1919 |
1920 localhost_name :: String |
1920 localhost_name :: String |
1951 return (server_socket, UUID.bytes password) |
1951 return (server_socket, UUID.bytes password) |
1952 |
1952 |
1953 loop :: Socket -> ByteString -> IO () |
1953 loop :: Socket -> ByteString -> IO () |
1954 loop server_socket password = forever $ do |
1954 loop server_socket password = forever $ do |
1955 (connection, _) <- Socket.accept server_socket |
1955 (connection, _) <- Socket.accept server_socket |
1956 Standard_Thread.fork_finally |
1956 Isabelle_Thread.fork_finally |
1957 (do |
1957 (do |
1958 line <- Byte_Message.read_line connection |
1958 line <- Byte_Message.read_line connection |
1959 when (line == Just password) $ handle connection) |
1959 when (line == Just password) $ handle connection) |
1960 (\finally -> do |
1960 (\finally -> do |
1961 Socket.close connection |
1961 Socket.close connection |