scheduler: ajout de tests d'initialisation.
thread.ml: type de thread_wait_pid. git-svn-id: http://caml.inria.fr/svn/ocaml/trunk@1079 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02master
parent
e8aedecb1a
commit
146c843406
|
@ -403,6 +403,7 @@ static void check_callback()
|
||||||
value thread_yield(unit) /* ML */
|
value thread_yield(unit) /* ML */
|
||||||
value unit;
|
value unit;
|
||||||
{
|
{
|
||||||
|
Assert(curr_thread != NULL);
|
||||||
curr_thread->retval = Val_unit;
|
curr_thread->retval = Val_unit;
|
||||||
return schedule_thread();
|
return schedule_thread();
|
||||||
}
|
}
|
||||||
|
@ -412,6 +413,7 @@ value thread_yield(unit) /* ML */
|
||||||
value thread_sleep(unit) /* ML */
|
value thread_sleep(unit) /* ML */
|
||||||
value unit;
|
value unit;
|
||||||
{
|
{
|
||||||
|
Assert(curr_thread != NULL);
|
||||||
check_callback();
|
check_callback();
|
||||||
curr_thread->status = SUSPENDED;
|
curr_thread->status = SUSPENDED;
|
||||||
return schedule_thread();
|
return schedule_thread();
|
||||||
|
@ -422,6 +424,7 @@ value thread_sleep(unit) /* ML */
|
||||||
value thread_wait_read(fd) /* ML */
|
value thread_wait_read(fd) /* ML */
|
||||||
value fd;
|
value fd;
|
||||||
{
|
{
|
||||||
|
if (curr_thread == NULL) return Val_unit;
|
||||||
check_callback();
|
check_callback();
|
||||||
curr_thread->status = BLOCKED_READ;
|
curr_thread->status = BLOCKED_READ;
|
||||||
curr_thread->fd = fd;
|
curr_thread->fd = fd;
|
||||||
|
@ -431,6 +434,7 @@ value thread_wait_read(fd) /* ML */
|
||||||
value thread_wait_write(fd) /* ML */
|
value thread_wait_write(fd) /* ML */
|
||||||
value fd;
|
value fd;
|
||||||
{
|
{
|
||||||
|
if (curr_thread == NULL) return Val_unit;
|
||||||
check_callback();
|
check_callback();
|
||||||
curr_thread->status = BLOCKED_WRITE;
|
curr_thread->status = BLOCKED_WRITE;
|
||||||
curr_thread->fd = fd;
|
curr_thread->fd = fd;
|
||||||
|
@ -468,6 +472,7 @@ value thread_delay(time) /* ML */
|
||||||
value time;
|
value time;
|
||||||
{
|
{
|
||||||
double date = timeofday() + Double_val(time);
|
double date = timeofday() + Double_val(time);
|
||||||
|
Assert(curr_thread != NULL);
|
||||||
check_callback();
|
check_callback();
|
||||||
curr_thread->status = BLOCKED_DELAY;
|
curr_thread->status = BLOCKED_DELAY;
|
||||||
Assign(curr_thread->delay, copy_double(date));
|
Assign(curr_thread->delay, copy_double(date));
|
||||||
|
@ -480,6 +485,7 @@ value thread_wait_timed_read(fd, time) /* ML */
|
||||||
value fd, time;
|
value fd, time;
|
||||||
{
|
{
|
||||||
double date = timeofday() + Double_val(time);
|
double date = timeofday() + Double_val(time);
|
||||||
|
Assert(curr_thread != NULL);
|
||||||
check_callback();
|
check_callback();
|
||||||
curr_thread->status = BLOCKED_READ | BLOCKED_DELAY;
|
curr_thread->status = BLOCKED_READ | BLOCKED_DELAY;
|
||||||
curr_thread->fd = fd;
|
curr_thread->fd = fd;
|
||||||
|
@ -491,6 +497,7 @@ value thread_wait_timed_write(fd, time) /* ML */
|
||||||
value fd, time;
|
value fd, time;
|
||||||
{
|
{
|
||||||
double date = timeofday() + Double_val(time);
|
double date = timeofday() + Double_val(time);
|
||||||
|
Assert(curr_thread != NULL);
|
||||||
check_callback();
|
check_callback();
|
||||||
curr_thread->status = BLOCKED_WRITE | BLOCKED_DELAY;
|
curr_thread->status = BLOCKED_WRITE | BLOCKED_DELAY;
|
||||||
curr_thread->fd = fd;
|
curr_thread->fd = fd;
|
||||||
|
@ -504,6 +511,7 @@ value thread_join(th) /* ML */
|
||||||
value th;
|
value th;
|
||||||
{
|
{
|
||||||
check_callback();
|
check_callback();
|
||||||
|
Assert(curr_thread != NULL);
|
||||||
if (((thread_t)th)->status == KILLED) return Val_unit;
|
if (((thread_t)th)->status == KILLED) return Val_unit;
|
||||||
curr_thread->status = BLOCKED_JOIN;
|
curr_thread->status = BLOCKED_JOIN;
|
||||||
Assign(curr_thread->joining, th);
|
Assign(curr_thread->joining, th);
|
||||||
|
@ -515,6 +523,7 @@ value thread_join(th) /* ML */
|
||||||
value thread_wait_pid(pid) /* ML */
|
value thread_wait_pid(pid) /* ML */
|
||||||
value pid;
|
value pid;
|
||||||
{
|
{
|
||||||
|
Assert(curr_thread != NULL);
|
||||||
check_callback();
|
check_callback();
|
||||||
curr_thread->status = BLOCKED_WAIT;
|
curr_thread->status = BLOCKED_WAIT;
|
||||||
curr_thread->waitpid = pid;
|
curr_thread->waitpid = pid;
|
||||||
|
@ -545,6 +554,7 @@ value thread_wakeup(thread) /* ML */
|
||||||
value thread_self(unit) /* ML */
|
value thread_self(unit) /* ML */
|
||||||
value unit;
|
value unit;
|
||||||
{
|
{
|
||||||
|
Assert(curr_thread != NULL);
|
||||||
return (value) curr_thread;
|
return (value) curr_thread;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -46,8 +46,7 @@ external thread_wait_timed_write
|
||||||
= "thread_wait_timed_write"
|
= "thread_wait_timed_write"
|
||||||
external thread_join : t -> unit = "thread_join"
|
external thread_join : t -> unit = "thread_join"
|
||||||
external thread_delay : float -> unit = "thread_delay"
|
external thread_delay : float -> unit = "thread_delay"
|
||||||
external thread_wait_pid : int -> int * Unix.process_status
|
external thread_wait_pid : int -> resumption_status = "thread_wait_pid"
|
||||||
= "thread_wait_pid"
|
|
||||||
external thread_wakeup : t -> unit = "thread_wakeup"
|
external thread_wakeup : t -> unit = "thread_wakeup"
|
||||||
external thread_self : unit -> t = "thread_self"
|
external thread_self : unit -> t = "thread_self"
|
||||||
external thread_kill : t -> unit = "thread_kill"
|
external thread_kill : t -> unit = "thread_kill"
|
||||||
|
@ -63,7 +62,6 @@ let wait_read fd = thread_wait_read fd
|
||||||
let wait_write fd = thread_wait_write fd
|
let wait_write fd = thread_wait_write fd
|
||||||
let delay duration = thread_delay duration
|
let delay duration = thread_delay duration
|
||||||
let join th = thread_join th
|
let join th = thread_join th
|
||||||
let wait_pid pid = thread_wait_pid pid
|
|
||||||
let wakeup pid = thread_wakeup pid
|
let wakeup pid = thread_wakeup pid
|
||||||
let self () = thread_self()
|
let self () = thread_self()
|
||||||
let kill pid = thread_kill pid
|
let kill pid = thread_kill pid
|
||||||
|
@ -71,9 +69,14 @@ let exit () = thread_kill(thread_self())
|
||||||
|
|
||||||
let wait_timed_read_aux fd d = thread_wait_timed_read fd d
|
let wait_timed_read_aux fd d = thread_wait_timed_read fd d
|
||||||
let wait_timed_write_aux fd d = thread_wait_timed_write fd d
|
let wait_timed_write_aux fd d = thread_wait_timed_write fd d
|
||||||
|
let wait_pid_aux pid = thread_wait_pid pid
|
||||||
|
|
||||||
let wait_timed_read fd d = wait_timed_read_aux fd d = Resumed_io
|
let wait_timed_read fd d = wait_timed_read_aux fd d = Resumed_io
|
||||||
let wait_timed_write fd d = wait_timed_write_aux fd d = Resumed_io
|
let wait_timed_write fd d = wait_timed_write_aux fd d = Resumed_io
|
||||||
|
let wait_pid pid =
|
||||||
|
match wait_pid_aux pid with
|
||||||
|
Resumed_wait(pid, status) -> (pid, status)
|
||||||
|
| _ -> invalid_arg "Thread.wait_pid"
|
||||||
|
|
||||||
(* For new, make sure the function passed to thread_new always terminates
|
(* For new, make sure the function passed to thread_new always terminates
|
||||||
by calling exit. *)
|
by calling exit. *)
|
||||||
|
|
Loading…
Reference in New Issue