Commits

Dmitry Grebeniuk  committed e8b68ca

.

  • Participants
  • Parent commits 46ad8be

Comments (0)

Files changed (2)

 ;
 
 
-type process 'i =
-  [= `Local of local_process 'i
-  ]
-and local_process 'i =
-  { lpid :  Counter.t
-  }
-;
-
-
 type group 'i =
   { gid : Counter.t
 (*
 
     type dest 'o =
       [= `Local of ('o -> IO.m unit)
-           (* пока так, потом вытащить lwt'шные потроха *)
       ]
     ;
 
     type context 'i =
       < send : ! 'i2 . process 'i2 -> 'i2 -> IO.m unit
       ; send_group : ! 'i2 . group 'i2 -> 'i2 -> IO.m unit
-       (* полиморфность по 'i2 -- факт того, что можно слать сообщения
-          кому угодно, если знаешь тип и можешь сформировать сообщение.
-        *)
-      ; exit : unit -> IO.m unit
-
+        (* полиморфность по 'i2 -- факт того, что можно слать сообщения
+           кому угодно, если знаешь тип и можешь сформировать сообщение.
+         *)
+      ; continue : ('i -> IO.m unit) -> unit -> IO.m unit
       ; me : process 'i
       ; my_group : group 'i
       >
     ;
 
+    (* "процесс" -- это функция, позволяющая послать процессу сообщение.
+       в случае локальной передачи сообщений этого хватит.
+     *)
+    type process 'i = ('i -> IO.m unit);
+
+    type server 'i 'o = process ('i * dest 'o);
+
     (* диспетчер сообщений -- то, что содержит пользовательский код,
        но обёрнуто в абстрактный тип. *)
+    type dispatcher 'i = context 'i -> 'i -> IO.m unit;
 
-    type dispatcher 'i = context 'i -> ('i -> IO.m unit);
+    (* по идее, процесс за'loop'ляется так:
+       value proc ctx =
+         loop
+         where rec loop msg =
+           обработать msg >>= ctx#continue loop
+     *)
 
     (* обеспечить мономорфность получающегося типа, чтобы в случае top-level
        значений были конкретные типы. *)
     ;
 
 (*
+    value call : server 'i 'o -> 'i -> IO.m 'o;
+
     (* нужно конкретно для частной задачи, поэтому не уверен в ценности:
-       функция шлёт сообщения группе и дожидается ответа каждого из процессов
+       функция шлёт сообщения группе и дожидается ответа каждого из серверов
        этой группы, затем возвращает массив ответов *)
     value call_group
-      : process_group 'i 'o -> 'i -> res (list 'o);
+      : server_group 'i 'o -> 'i -> res (list 'o);
     (* если будет call, то можно будет выразить это как отсылку call-запросов
       и приём call-ответов *)
 

File parvel_IO.ml

     type t 'a = Lwt_mvar.t 'a;
     open Lwt_mvar;
     value create_empty = create_empty;
-    value put = put;
+    value put q v = Lwt.return (Lwt.ignore_result (Lwt_mvar.put q v));
     value take = take;
   end
 ;