2 * 2004 Matthew
Fluet (mfluet@acm
.org
)
3 * Ported to MLton threads
.
8 * COPYRIGHT (c
) 1995 AT
&T Bell Laboratories
.
9 * COPYRIGHT (c
) 1989-1991 John H
. Reppy
12 structure ThreadID
: THREAD_ID_EXTRA
=
14 structure Assert
= LocalAssert(val assert
= false)
16 structure R
= RepTypes
19 datatype thread_id
= datatype R
.thread_id
20 datatype thread_id
' = datatype thread_id
22 fun sameTid (TID
{id
=a
, ...}, TID
{id
=b
, ...}) = a
= b
23 fun compareTid (TID
{id
=a
, ...}, TID
{id
=b
, ...}) = Int.compare (a
, b
)
24 fun hashTid (TID
{id
, ...}) = Word.fromInt id
26 fun tidToString (TID
{id
, ...}) =
27 concat
["[", StringCvt.padLeft #
"0" 6 (Int.toString id
), "]"]
29 fun exnHandler (_
: exn
) = ()
30 val defaultExnHandler
= ref exnHandler
35 done_comm
= ref
false,
36 exnHandler
= ref (!defaultExnHandler
),
41 val tidCounter
= ref
0
45 val _
= Assert
.assertAtomic
' ("ThreadID.newTid", NONE
)
47 val _
= tidCounter
:= n
+ 1
52 fun reset () = tidCounter
:= 0
56 let val n
= CharVector
.foldr (fn (c
, n
) => 2 * n
- Char.ord c
) 0 s
60 fun mark (TID
{done_comm
, ...}) =
61 (Assert
.assertAtomic
' ("ThreadID.mark", NONE
)
63 fun unmark (TID
{done_comm
, ...}) =
64 (Assert
.assertAtomic
' ("ThreadID.unmark", NONE
)
66 fun isMarked (TID
{done_comm
, ...}) = !done_comm