35 |
static void |
static void |
36 |
task_reinit (hurd_cap_class_t cap_class, hurd_cap_obj_t obj) |
task_reinit (hurd_cap_class_t cap_class, hurd_cap_obj_t obj) |
37 |
{ |
{ |
38 |
task_t task = (task_t) obj; |
task_t task = hurd_cap_obj_to_user (task_t, obj); |
39 |
unsigned int i; |
unsigned int i; |
40 |
|
|
41 |
/* Destroy all threads. */ |
/* Destroy all threads. */ |
87 |
error_t |
error_t |
88 |
task_class_init () |
task_class_init () |
89 |
{ |
{ |
90 |
return hurd_cap_class_init (&task_class, sizeof (struct task), |
return hurd_cap_class_init (&task_class, task_t, |
|
__alignof__ (struct task), |
|
91 |
NULL, NULL, task_reinit, NULL, |
NULL, NULL, task_reinit, NULL, |
92 |
task_demuxer); |
task_demuxer); |
93 |
} |
} |
99 |
reference. */ |
reference. */ |
100 |
error_t |
error_t |
101 |
task_alloc (l4_word_t task_id, unsigned int nr_threads, |
task_alloc (l4_word_t task_id, unsigned int nr_threads, |
102 |
l4_thread_id_t *threads, hurd_cap_obj_t *r_obj) |
l4_thread_id_t *threads, task_t *r_task) |
103 |
{ |
{ |
104 |
error_t err; |
error_t err; |
105 |
|
hurd_cap_obj_t obj; |
106 |
task_t task; |
task_t task; |
107 |
|
|
108 |
err = hurd_cap_class_alloc (&task_class, (hurd_cap_obj_t *) &task); |
err = hurd_cap_class_alloc (&task_class, &obj); |
109 |
if (err) |
if (err) |
110 |
return err; |
return err; |
111 |
|
task = hurd_cap_obj_to_user (task_t, obj); |
112 |
|
|
113 |
task->task_id = task_id; |
task->task_id = task_id; |
114 |
assert (nr_threads <= MAX_THREADS); |
assert (nr_threads <= MAX_THREADS); |
115 |
task->nr_threads = nr_threads; |
task->nr_threads = nr_threads; |
116 |
memcpy (task->threads, threads, sizeof (l4_thread_id_t) * nr_threads); |
memcpy (task->threads, threads, sizeof (l4_thread_id_t) * nr_threads); |
117 |
|
|
118 |
*r_obj = &task->obj; |
*r_task = task; |
119 |
return 0; |
return 0; |
120 |
} |
} |