ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/radiance/ray/src/rt/raypwin.c
Revision: 2.8
Committed: Tue Oct 26 03:45:35 2010 UTC (13 years, 6 months ago) by greg
Content type: text/plain
Branch: MAIN
CVS Tags: rad5R2, rad4R2P2, rad5R0, rad5R1, rad4R2, rad4R1, rad4R2P1
Changes since 2.7: +8 -1 lines
Log Message:
Bug fix in l+ option of mkillum under Windows

File Contents

# Content
1 #ifndef lint
2 static const char RCSid[] = "$Id: raypwin.c,v 2.7 2010/05/27 19:32:13 greg Exp $";
3 #endif
4 /*
5 * raypwin.c - interface for parallel rendering using Radiance (Windows ver)
6 *
7 * External symbols declared in ray.h
8 */
9
10 #include "copyright.h"
11
12 /*
13 * See raypcalls.c for an explanation of these routines.
14 */
15
16 /***** XXX CURRENTLY, THIS IS JUST A COLLECTION OF IMPOTENT STUBS XXX *****/
17
18 #include "ray.h"
19
20 int ray_pnprocs = 0; /* number of child processes */
21 int ray_pnidle = 0; /* number of idle children */
22
23 static RAY queued_ray;
24
25 void
26 ray_pinit( /* initialize ray-tracing processes */
27 char *otnm,
28 int nproc
29 )
30 {
31 ray_pdone(0);
32 ray_init(otnm);
33 ray_popen(nproc);
34 }
35
36
37 int
38 ray_psend( /* add a ray to our send queue */
39 RAY *r
40 )
41 {
42 if (r == NULL)
43 return(0);
44 if (ray_pnidle <= 0)
45 return(0);
46 queued_ray = *r;
47 ray_pnidle = 0;
48 return(1);
49 }
50
51
52 int
53 ray_pqueue( /* queue a ray for computation */
54 RAY *r
55 )
56 {
57 RNUMBER rno;
58
59 if (r == NULL)
60 return(0);
61 if (ray_pnidle <= 0) {
62 RAY new_ray = *r;
63 *r = queued_ray;
64 queued_ray = new_ray;
65 }
66 rno = r->rno;
67 r->rno = raynum++;
68 samplendx++;
69 rayvalue(r);
70 r->rno = rno;
71 return(1);
72 }
73
74
75 int
76 ray_presult( /* check for a completed ray */
77 RAY *r,
78 int poll
79 )
80 {
81 if (r == NULL)
82 return(0);
83 if (ray_pnidle <= 0) {
84 *r = queued_ray;
85 r->rno = raynum++;
86 samplendx++;
87 rayvalue(r);
88 r->rno = queued_ray.rno;
89 ray_pnidle = 1;
90 return(1);
91 }
92 return(0);
93 }
94
95
96 void
97 ray_pdone( /* reap children and free data */
98 int freall
99 )
100 {
101 ray_done(freall);
102 ray_pnprocs = ray_pnidle = 0;
103 }
104
105
106 void
107 ray_popen( /* open the specified # processes */
108 int nadd
109 )
110 {
111 if (ray_pnprocs + nadd > 1) {
112 error(WARNING, "only single process supported");
113 nadd = 1 - ray_pnprocs;
114 }
115 ray_pnprocs += nadd;
116 ray_pnidle += nadd;
117 }
118
119
120 void
121 ray_pclose( /* close one or more child processes */
122 int nsub
123 )
124 {
125 if (nsub > ray_pnprocs)
126 nsub = ray_pnprocs;
127 ray_pnprocs -= nsub;
128 if ((ray_pnidle -= nsub) < 0)
129 ray_pnidle = 0;
130 }