@@ -40,88 +40,6 @@ fn send[T](c: chan[T], v: &T) { c <| v; }
40
40
41
41
fn recv[ T ] ( p: port[ T ] ) -> T { let v; p |> v; v }
42
42
43
- // Spawn a task and immediately return a channel for communicating to it
44
- fn worker[ T ] ( f : fn ( port[ T ] ) ) -> { task: task, chan: chan[ T ] } {
45
- // FIXME: This is frighteningly unsafe and only works for
46
- // a few cases
47
-
48
- type opaque = int ;
49
-
50
- // FIXME: This terrible hackery is because worktask can't currently
51
- // have type params
52
- type wordsz1 = int ;
53
- type wordsz2 = { a : int , b : int } ;
54
- type wordsz3 = { a : int , b : int , c : int } ;
55
- type wordsz4 = { a : int , b : int , c : int , d : int } ;
56
- type wordsz5 = { a : int , b : int , c : int , d : int , e : int } ;
57
- type opaquechan_1wordsz = chan [ chan[ wordsz1] ] ;
58
- type opaquechan_2wordsz = chan [ chan[ wordsz2] ] ;
59
- type opaquechan_3wordsz = chan [ chan[ wordsz3] ] ;
60
- type opaquechan_4wordsz = chan [ chan[ wordsz4] ] ;
61
- type opaquechan_5wordsz = chan [ chan[ wordsz5] ] ;
62
-
63
- fn worktask1 ( setupch : opaquechan_1wordsz , fptr : opaque ) {
64
- let f: * fn ( port[ wordsz1 ] ) = unsafe :: reinterpret_cast ( fptr) ;
65
- let p = port[ wordsz1] ( ) ;
66
- setupch <| chan( p) ;
67
- ( * f) ( p) ;
68
- }
69
-
70
- fn worktask2 ( setupch : opaquechan_2wordsz , fptr : opaque ) {
71
- let f: * fn ( port[ wordsz2 ] ) = unsafe :: reinterpret_cast ( fptr) ;
72
- let p = port[ wordsz2] ( ) ;
73
- setupch <| chan( p) ;
74
- ( * f) ( p) ;
75
- }
76
-
77
- fn worktask3 ( setupch : opaquechan_3wordsz , fptr : opaque ) {
78
- let f: * fn ( port[ wordsz3 ] ) = unsafe :: reinterpret_cast ( fptr) ;
79
- let p = port[ wordsz3] ( ) ;
80
- setupch <| chan( p) ;
81
- ( * f) ( p) ;
82
- }
83
-
84
- fn worktask4 ( setupch : opaquechan_4wordsz , fptr : opaque ) {
85
- let f: * fn ( port[ wordsz4 ] ) = unsafe :: reinterpret_cast ( fptr) ;
86
- let p = port[ wordsz4] ( ) ;
87
- setupch <| chan( p) ;
88
- ( * f) ( p) ;
89
- }
90
-
91
- fn worktask5 ( setupch : opaquechan_5wordsz , fptr : opaque ) {
92
- let f: * fn ( port[ wordsz5 ] ) = unsafe :: reinterpret_cast ( fptr) ;
93
- let p = port[ wordsz5] ( ) ;
94
- setupch <| chan( p) ;
95
- ( * f) ( p) ;
96
- }
97
-
98
- let p = port[ chan[ T ] ] ( ) ;
99
- let setupch = chan ( p) ;
100
- let fptr = unsafe :: reinterpret_cast ( ptr:: addr_of ( f) ) ;
101
-
102
- let Tsz = sys:: size_of[ T ] ( ) ;
103
- let t =
104
- if Tsz == sys:: size_of[ wordsz1] ( ) {
105
- let setupchptr = unsafe :: reinterpret_cast ( setupch) ;
106
- spawn worktask1( setupchptr, fptr)
107
- } else if ( Tsz == sys:: size_of[ wordsz2] ( ) ) {
108
- let setupchptr = unsafe :: reinterpret_cast ( setupch) ;
109
- spawn worktask2( setupchptr, fptr)
110
- } else if ( Tsz == sys:: size_of[ wordsz3] ( ) ) {
111
- let setupchptr = unsafe :: reinterpret_cast ( setupch) ;
112
- spawn worktask3( setupchptr, fptr)
113
- } else if ( Tsz == sys:: size_of[ wordsz4] ( ) ) {
114
- let setupchptr = unsafe :: reinterpret_cast ( setupch) ;
115
- spawn worktask4( setupchptr, fptr)
116
- } else if ( Tsz == sys:: size_of[ wordsz5] ( ) ) {
117
- let setupchptr = unsafe :: reinterpret_cast ( setupch) ;
118
- spawn worktask5( setupchptr, fptr)
119
- } else { fail #fmt( "unhandled type size %u in task::worker" , Tsz ) } ;
120
- let ch;
121
- p |> ch;
122
- ret { task : t, chan : ch} ;
123
- }
124
-
125
43
// Local Variables:
126
44
// mode: rust;
127
45
// fill-column: 78;
0 commit comments