Merge branch 'master' of git.martlubbers.net:msc-thesis1617
[msc-thesis1617.git] / top.sds.tex
1 \Glspl{SDS} are an abstraction over resources that are available in the world
2 or in the \gls{iTasks} system. The shared data can be a file on disk, the
3 system time, a random integer or just some data stored in memory. The actual
4 \gls{SDS} is just a record containing functions on how to read and write the
5 source. In these functions the \CI{*IWorld} --- which in turn contains the real
6 \CI{*World} --- is available. Accessing the outside world is required for
7 interacting with it and thus the functions can access files on disk, raw
8 memory, other \glspl{SDS} and hardware.
9
10 The basic operations for \glspl{SDS} are get, set and update. The signatures
11 for these functions are shown in Listing~\ref{lst:shares}. By default, all
12 \glspl{SDS} are files containing a \gls{JSON} encoded version of the object and
13 thus are persistent between restarts of the program. Library functions for
14 shares residing in memory are available as well. The three main operations on
15 shares are atomic in the sense that during reading no other \glspl{Task} are
16 executed. The system provides useful functions to transform, map and combine
17 \glspl{SDS} using combinators. The system also provides functionality to
18 inspect the value of an \gls{SDS} and act upon a change. \Glspl{Task} waiting
19 on an \gls{SDS} to change are notified when needed. This results in low
20 resource usage because \glspl{Task} are never constantly inspecting \gls{SDS}
21 values but are notified.
22
23 \begin{lstlisting}[language=Clean,%
24 label={lst:shares},caption={\Gls{SDS} functions}]
25 :: RWShared p r w = ...
26 :: ReadWriteShared r w :== RWShared () r w
27 :: ROShared p r :== RWShared p () r
28 :: ReadOnlyShared r :== ROShared () r
29
30 :: Shared r :== ReadWriteShared r r
31
32 get :: (ReadWriteShared r w) -> Task r | iTask r
33 set :: w (ReadWriteShared r w) -> Task w | iTask w
34 upd :: (r -> w) (ReadWriteShared r w) -> Task w | iTask r & iTask w
35
36 sharedStore :: String a -> Shared a | JSONEncode{|*|}, JSONDecode{|*|}
37 \end{lstlisting}
38
39 \section{Parametric Lenses}
40 \Glspl{SDS} can contain complex data structures such as lists, trees and even
41 resources in the outside world. Sometimes, an update action only updates a part
42 of the resource. When this happens, all waiting \glspl{Task} looking at the
43 resource are notified of the update. However, it may be the case that
44 \glspl{Task} were only looking at parts of the structure that was not updated.
45 To solve this problem, parametric lenses were
46 introduced~\cite{domoszlai_parametric_2014}.
47
48 Parametric lenses add a type variable to the \gls{SDS}. This type variable is
49 fixed to the void type (i.e. \CI{()}) in the given functions. When an \gls{SDS}
50 executes a write operation, it also provides the system with a notification
51 predicate. This notification predicate is a function \CI{p -> Bool} where
52 \CI{p} is the parametric lens type. This allows programmers to create a big
53 \gls{SDS}, and have \glspl{Task} only look at parts of the big \gls{SDS}. This
54 technique is used in the current system in memory shares. The \CI{IWorld}
55 contains a map that is accessible through an \gls{SDS}. While all data is
56 stored in the map, only \glspl{Task} looking at a specific entry are notified
57 when the structure is updated. The type of the parametric lens is the key in
58 the map.
59
60 Functionality for setting parameters is available in the system. The most
61 important functions are the \CI{sdsFocus} and the \CI{sdsLens} function. These
62 functions are listed in Listing~\ref{lst:focus}. \CI{sdsFocus} allows the
63 programmer to fix a parametric lens value. \CI{sdsLens} is a kind of
64 \CI{mapReadWrite} including access to the parametric lens value. This allows
65 the creation of, for example, \glspl{SDS} that only read and write to parts of
66 the original \gls{SDS}.
67
68 \begin{lstlisting}[language=Clean,label={lst:focus},
69 caption={Parametric lens functions}]
70 sdsFocus :: p (RWShared p r w) -> RWShared p` r w | iTask p
71
72 :: SDSNotifyPred p :== p -> Bool
73
74 :: SDSLensRead p r rs = SDSRead (p -> rs -> MaybeError TaskException r)
75 | SDSReadConst (p -> r)
76 :: SDSLensWrite p w rs ws = SDSWrite (p -> rs -> w -> MaybeError TaskException (Maybe ws))
77 | SDSWriteConst (p -> w -> MaybeError TaskException (Maybe ws))
78 :: SDSLensNotify p w rs = SDSNotify (p -> rs -> w -> SDSNotifyPred p)
79 | SDSNotifyConst (p -> w -> SDSNotifyPred p)
80
81 sdsLens :: String (p -> ps) (SDSLensRead p r rs) (SDSLensWrite p w rs ws) (SDSLensNotify p w rs)
82 (RWShared ps rs ws) -> RWShared p r w | iTask ps
83 \end{lstlisting}