Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Segmentation fault when assigning function to reference in different thread #13

Closed
radekm opened this issue Jun 13, 2015 · 2 comments
Closed

Comments

@radekm
Copy link

radekm commented Jun 13, 2015

The following program

effect Yield : unit

let () =
  let kk = ref (fun () -> failwith "continuation") in
  begin match
    print_endline "0";
    perform Yield;
    print_endline "1";
    Unix.sleep 1;
    perform Yield;
    print_endline "2"
  with
    | () -> print_endline "done"
    | effect Yield k ->
        print_endline "before kk assig";
        kk := (fun () -> continue k ());
        print_endline "after kk assig"
  end;
  print_endline "before spawn";
  Domain.spawn (fun () -> !kk ());
  print_endline "after spawn";
  Unix.sleep 20;
  print_endline "after sleep"

always ends with segmentation fault. The output is usually

0
before kk assig
after kk assig
before spawn
1
after spawn
before kk assig
Segmentation fault

It seems that the problem occurs when performing Yield after Unix.sleep 1. What helps is replacing Domain.spawn (fun () -> !kk ()) by !kk ().

@radekm
Copy link
Author

radekm commented Jun 13, 2015

The segmentation fault happens when assigning to kk - when executing kk := (fun () -> continue k ()). Even when I assign value which doesn't contain k(eg. (fun () -> ())) there is still segmentation fault:

effect Yield : unit

let () =
  let kk = ref (fun () -> failwith "continuation") in
  let assig_k = ref true in
  begin match
    print_endline "0";
    perform Yield;
    print_endline "1";
    Unix.sleep 1;
    perform Yield;
    print_endline "2"
  with
    | () -> print_endline "done"
    | effect Yield k ->
        print_endline "before kk assig";
        if !assig_k then begin
          assig_k := false;
          print_endline "assigning k";
          kk := (fun () -> continue k ())
        end else begin
          print_endline "not assigning k";
          kk := (fun () -> ())
        end;
        print_endline "after kk assig"
  end;
  print_endline "before spawn";
  Domain.spawn (fun () -> !kk ());
  print_endline "after spawn";
  Unix.sleep 20;
  print_endline "after sleep"

@radekm radekm changed the title Segmentation fault when performing effect in continuation in different thread Segmentation fault when assigning function with continuation to reference in different thread Jun 13, 2015
@radekm radekm changed the title Segmentation fault when assigning function with continuation to reference in different thread Segmentation fault when assigning function to reference in different thread Jun 13, 2015
@kayceesrk
Copy link
Contributor

Fixed by #14.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants