annotate TaskManager/Cell/SpeThreads.cc @ 66:1034077dd217

*** empty log message ***
author gongo
date Sun, 17 Feb 2008 18:29:08 +0900
parents 519d24aa7ac8
children 5a1a5f4c28fd
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
65
519d24aa7ac8 *** empty log message ***
gongo
parents:
diff changeset
1 #include "SpeThreads.h"
519d24aa7ac8 *** empty log message ***
gongo
parents:
diff changeset
2
519d24aa7ac8 *** empty log message ***
gongo
parents:
diff changeset
3 SpeThreads::SpeThreads(int num) : spe_num(num) {}
519d24aa7ac8 *** empty log message ***
gongo
parents:
diff changeset
4
519d24aa7ac8 *** empty log message ***
gongo
parents:
diff changeset
5 void*
519d24aa7ac8 *** empty log message ***
gongo
parents:
diff changeset
6 SpeThreads::spe_thread_run(void *arg)
519d24aa7ac8 *** empty log message ***
gongo
parents:
diff changeset
7 {
519d24aa7ac8 *** empty log message ***
gongo
parents:
diff changeset
8 unsigned int entry = SPE_DEFAULT_ENTRY;
519d24aa7ac8 *** empty log message ***
gongo
parents:
diff changeset
9 spe_context_ptr_t ctx = (spe_context_ptr_t)arg;
519d24aa7ac8 *** empty log message ***
gongo
parents:
diff changeset
10
519d24aa7ac8 *** empty log message ***
gongo
parents:
diff changeset
11 spe_context_run(ctx, &entry, 0, NULL, NULL, NULL);
519d24aa7ac8 *** empty log message ***
gongo
parents:
diff changeset
12
519d24aa7ac8 *** empty log message ***
gongo
parents:
diff changeset
13 pthread_exit(NULL);
519d24aa7ac8 *** empty log message ***
gongo
parents:
diff changeset
14 }
519d24aa7ac8 *** empty log message ***
gongo
parents:
diff changeset
15
519d24aa7ac8 *** empty log message ***
gongo
parents:
diff changeset
16 void*
519d24aa7ac8 *** empty log message ***
gongo
parents:
diff changeset
17 SpeThreads::frontend_thread_run(void *arg)
519d24aa7ac8 *** empty log message ***
gongo
parents:
diff changeset
18 {
519d24aa7ac8 *** empty log message ***
gongo
parents:
diff changeset
19 pthread_t thread;
519d24aa7ac8 *** empty log message ***
gongo
parents:
diff changeset
20 thread_arg_t *arg_t = (thread_arg_t *)arg;
519d24aa7ac8 *** empty log message ***
gongo
parents:
diff changeset
21
519d24aa7ac8 *** empty log message ***
gongo
parents:
diff changeset
22 pthread_create(&thread, NULL, &spe_thread_run, (void*)arg_t->ctx);
519d24aa7ac8 *** empty log message ***
gongo
parents:
diff changeset
23
519d24aa7ac8 *** empty log message ***
gongo
parents:
diff changeset
24 pthread_exit(NULL);
519d24aa7ac8 *** empty log message ***
gongo
parents:
diff changeset
25 }
519d24aa7ac8 *** empty log message ***
gongo
parents:
diff changeset
26
519d24aa7ac8 *** empty log message ***
gongo
parents:
diff changeset
27 void
519d24aa7ac8 *** empty log message ***
gongo
parents:
diff changeset
28 SpeThreads::init(void)
519d24aa7ac8 *** empty log message ***
gongo
parents:
diff changeset
29 {
519d24aa7ac8 *** empty log message ***
gongo
parents:
diff changeset
30 int i;
519d24aa7ac8 *** empty log message ***
gongo
parents:
diff changeset
31
519d24aa7ac8 *** empty log message ***
gongo
parents:
diff changeset
32 spe_handle = spe_image_open(SPE_ELF);
519d24aa7ac8 *** empty log message ***
gongo
parents:
diff changeset
33
519d24aa7ac8 *** empty log message ***
gongo
parents:
diff changeset
34 spe_ctx = new spe_context_ptr_t[spe_num];
519d24aa7ac8 *** empty log message ***
gongo
parents:
diff changeset
35 threads = new pthread_t[spe_num];
519d24aa7ac8 *** empty log message ***
gongo
parents:
diff changeset
36 args = new thread_arg_t[spe_num];
519d24aa7ac8 *** empty log message ***
gongo
parents:
diff changeset
37
519d24aa7ac8 *** empty log message ***
gongo
parents:
diff changeset
38 for (i = 0; i < spe_num; i++) {
519d24aa7ac8 *** empty log message ***
gongo
parents:
diff changeset
39 args[i].speid = i;
519d24aa7ac8 *** empty log message ***
gongo
parents:
diff changeset
40 spe_ctx[i] = spe_context_create(0, NULL);
519d24aa7ac8 *** empty log message ***
gongo
parents:
diff changeset
41 spe_program_load(spe_ctx[i], spe_handle);
519d24aa7ac8 *** empty log message ***
gongo
parents:
diff changeset
42 args[i].ctx = spe_ctx[i];
519d24aa7ac8 *** empty log message ***
gongo
parents:
diff changeset
43 }
519d24aa7ac8 *** empty log message ***
gongo
parents:
diff changeset
44
519d24aa7ac8 *** empty log message ***
gongo
parents:
diff changeset
45 for (i = 0; i < spe_num; i++) {
519d24aa7ac8 *** empty log message ***
gongo
parents:
diff changeset
46 pthread_create(&threads[i], NULL,
519d24aa7ac8 *** empty log message ***
gongo
parents:
diff changeset
47 &frontend_thread_run, (void*)&args[i]);
519d24aa7ac8 *** empty log message ***
gongo
parents:
diff changeset
48 }
519d24aa7ac8 *** empty log message ***
gongo
parents:
diff changeset
49 }
519d24aa7ac8 *** empty log message ***
gongo
parents:
diff changeset
50
519d24aa7ac8 *** empty log message ***
gongo
parents:
diff changeset
51 int
519d24aa7ac8 *** empty log message ***
gongo
parents:
diff changeset
52 SpeThreads::get_mail(int speid)
519d24aa7ac8 *** empty log message ***
gongo
parents:
diff changeset
53 {
519d24aa7ac8 *** empty log message ***
gongo
parents:
diff changeset
54 unsigned int ret;
519d24aa7ac8 *** empty log message ***
gongo
parents:
diff changeset
55
519d24aa7ac8 *** empty log message ***
gongo
parents:
diff changeset
56 if (spe_out_mbox_read(spe_ctx[speid], &ret, 1) > 0) {
519d24aa7ac8 *** empty log message ***
gongo
parents:
diff changeset
57 return (int)ret;
519d24aa7ac8 *** empty log message ***
gongo
parents:
diff changeset
58 } else {
519d24aa7ac8 *** empty log message ***
gongo
parents:
diff changeset
59 return -1;
519d24aa7ac8 *** empty log message ***
gongo
parents:
diff changeset
60 }
519d24aa7ac8 *** empty log message ***
gongo
parents:
diff changeset
61 }
66
1034077dd217 *** empty log message ***
gongo
parents: 65
diff changeset
62
1034077dd217 *** empty log message ***
gongo
parents: 65
diff changeset
63 void
1034077dd217 *** empty log message ***
gongo
parents: 65
diff changeset
64 SpeThreads::send_mail(int speid, unsigned int *data)
1034077dd217 *** empty log message ***
gongo
parents: 65
diff changeset
65 {
1034077dd217 *** empty log message ***
gongo
parents: 65
diff changeset
66 spe_in_mbox_write(spe_ctx[speid], data, 1, SPE_MBOX_ANY_NONBLOCKING);
1034077dd217 *** empty log message ***
gongo
parents: 65
diff changeset
67 }