4 * author: frank zirkelbach (frank.zirkelbach@physik.uni-augsburg.de)
6 * this program tries helping to understand the amorphous depuration
7 * and recrystallization of SiCx while ion implantation at temperatures
8 * below 400 degree celsius.
9 * hopefully the program will simulate the stabilization of the
10 * selforganizing lamella structure in the observed behaviour.
13 * - J. K. N. Lindner. Habil.Schrift, Universitaet Augsburg.
14 * - Maik Haeberlen. Diplomarbeit, Universitaet Augsburg.
16 * Copyright (C) 2004 Frank Zirkelbach
18 * This program is free software; you can redistribute it and/or modify
19 * it under the terms of the GNU General Public License as published by
20 * the Free Software Foundation; either version 2 of the License, or
21 * (at your option) any later version.
23 * This program is distributed in the hope that it will be useful,
24 * but WITHOUT ANY WARRANTY; without even the implied warranty of
25 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
26 * GNU General Public License for more details.
28 * You should have received a copy of the GNU General Public License
29 * along with this program; if not, write to the Free Software
30 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
38 #include <sys/types.h>
52 #include "nlsop_general.h"
54 typedef struct s_priv {
68 * server specific stuff
74 printf("%s <listen port>\n",prog);
85 channel=network_manage_incoming(&(priv.net));
86 if(channel==N_E_ACCEPT) {
87 printf("accept failed!\n");
90 if(channel==N_E_MAXC) {
91 printf("maximum connections reached!\n");
94 printf("connection from %s port %d (ch: %d)\n",
95 priv.net.connection[channel].ip,priv.net.connection[channel].port,
98 /* are you client or gui? */
99 network_receive_chan(&(priv.net),channel,&data,1);
100 if(data==NLSOP_GUI) {
102 list_add_element(&(priv.gui),&gui_chan,sizeof(int));
103 printf("node is a gui\n");
105 else if(data==NLSOP_CLIENT) {
107 client.channel=channel;
108 list_add_element(&(priv.client),&client,sizeof(t_client));
109 printf("node is a client\n");
112 printf("not a client or gui - lets kick that ass out of here!\n");
113 network_close(&(priv.net),channel);
117 /* if we have a new node - care for it! */
118 event_math(priv.net.connection[channel].fd,&(priv.event),READ,ADD);
125 int save_job(unsigned char dc) {
135 j=(t_job *)priv.job.current->data;
137 printf("receiving data from client (%d)\n",j->size);
140 /* initial data_ok to start transmit on client */
141 network_send_chan(&(priv.net),gi,&data,sizeof(unsigned char));
143 network_receive_chan(&(priv.net),gi,(unsigned char *)&d3l,
145 network_send_chan(&(priv.net),gi,&data,sizeof(unsigned char));
146 printf("debug: got d3_lattice\n");
148 network_receive_chan(&(priv.net),gi,(unsigned char *)&info,sizeof(info));
149 network_send_chan(&(priv.net),gi,&data,sizeof(unsigned char));
150 printf("debug: got info\n");
152 network_receive_chan(&(priv.net),gi,j->ac,j->size*sizeof(unsigned char));
153 network_send_chan(&(priv.net),gi,&data,sizeof(unsigned char));
154 printf("debug: got ac\n");
156 network_receive_chan(&(priv.net),gi,(unsigned char *)j->cc,
157 j->size*sizeof(int));
158 network_send_chan(&(priv.net),gi,&data,sizeof(unsigned char));
159 printf("debug: got cc\n");
161 network_receive_chan(&(priv.net),gi,(unsigned char *)&(j->step),sizeof(int));
162 network_send_chan(&(priv.net),gi,&data,sizeof(unsigned char));
163 printf("debug: got steps\n");
166 snprintf(filename,128,"./data/nlsop_b%f_c%f_s%f_ds%d_dr%f_-_%d_of_%d.save",
167 j->info.b,j->info.c,j->info.s,
168 j->info.diff_rate,j->info.dr_ac,
169 j->step,j->info.steps);
170 if((fd=open(filename,O_WRONLY|O_CREAT))<0) {
171 printf("FATAL: unable to open file %s\n",filename);
175 if(write(fd,&d3l,sizeof(d3_lattice))<sizeof(d3_lattice)) {
176 printf("FATAL: write of d3_lattice failed\n");
180 if(write(fd,&info,sizeof(info))<sizeof(info)) {
181 printf("FATAL: write of info failed\n");
185 ret=write(fd,j->ac,j->size*sizeof(unsigned char));
186 if(ret<j->size*sizeof(unsigned char)) {
187 printf("FATAL: write of a/c states failed\n");
191 ret=write(fd,j->cc,j->size*sizeof(int));
192 if(ret<j->size*sizeof(int)) {
193 printf("FATAL: write of c.-conc. failed\n");
212 network_receive_chan(&(priv.net),gi,(unsigned char *)&(job.x),sizeof(int));
213 network_receive_chan(&(priv.net),gi,(unsigned char *)&(job.y),sizeof(int));
214 network_receive_chan(&(priv.net),gi,(unsigned char *)&(job.z),sizeof(int));
215 network_receive_chan(&(priv.net),gi,(unsigned char *)&(job.info),
218 job.size=job.x*job.y*job.z;
220 job.ac=(unsigned char *)malloc(job.size*sizeof(unsigned char));
222 printf("unable to malloc a/c memory\n");
226 job.cc=(int *)malloc(job.size*sizeof(int));
228 printf("unable to malloc cc memory\n");
234 list_add_element(&(priv.job),&job,sizeof(t_job));
236 printf("job added: b=%f | c=%f | s=%f ...\n",
237 job.info.b,job.info.c,job.info.s);
242 int send_status(void) {
250 count=list_count(&(priv.job));
252 printf("sending job info\n");
254 network_send_chan(&(priv.net),gi,&data,sizeof(unsigned char));
255 network_send_chan(&(priv.net),gi,(unsigned char *)&count,sizeof(int));
257 list_reset(&(priv.job));
258 for(i=0;i<count;i++) {
259 network_send_chan(&(priv.net),gi,priv.job.current->data,sizeof(t_job));
260 list_next(&(priv.job));
266 int handle_node(void) {
272 for(gi=0;gi<MAX_CONNECTIONS;gi++) {
273 if(FD_ISSET(priv.net.connection[gi].fd,&(priv.event.rfds))) {
277 network_receive_chan(&(priv.net),gi,&data,1);
280 if(alert==1) return -1;
282 if(list_search_data(&(priv.client),&gi,sizeof(int))==L_SUCCESS) {
284 list_search_data(&(priv.job),&gi,sizeof(int));
285 j=(t_job *)priv.job.current->data;
286 c=(t_client *)priv.client.current->data;
292 /* free job memory */
295 /* delete job entry */
296 list_del_current(&(priv.job));
297 printf("job ended, saved and removed from list.\n");
302 /* inc progress state */
304 printf("job at next level, saved.\n");
309 /* network disconnect */
310 event_math(priv.net.connection[gi].fd,&(priv.event),READ,REMOVE);
311 network_close(&(priv.net),gi);
312 /* del from client list */
313 list_del_current(&(priv.client));
314 /* change job state */
316 printf("client terminating, job queued, client removed.\n");
320 else if(list_search_data(&(priv.gui),&gi,sizeof(int))==L_SUCCESS) {
322 if(data==GUI_ADDJOB) add_job();
324 else if(data==GUI_INFO) send_status();
326 else if(data==GUI_QUIT) {
327 printf("disconnecting gui on channel %d\n",gi);
328 event_math(priv.net.connection[gi].fd,&(priv.event),READ,REMOVE);
329 network_close(&(priv.net),gi);
330 list_del_current(&(priv.gui));
334 printf("unknown gui command\n");
340 printf("this chan is not in client or gui list! i disconnect now!\n");
341 event_math(priv.net.connection[gi].fd,&(priv.event),READ,REMOVE);
342 network_close(&(priv.net),gi);
352 int distribute_jobs(t_event *event,void *allineed) {
354 int count_j,count_c,min;
360 list_reset(&(priv.job));
361 list_reset(&(priv.client));
366 if((priv.client.current==NULL)||(priv.job.current==NULL)) return 2;
368 j=(t_job *)priv.job.current->data;
369 c=(t_client *)priv.client.current->data;
370 if(j->status==IN_QUEUE) count_j++;
371 if(c->status==IDLE) count_c++;
373 while(list_next(&(priv.job))!=L_NO_NEXT_ELEMENT) {
374 j=(t_job *)priv.job.current->data;
375 if(j->status==IN_QUEUE) count_j++;
377 while(list_next(&(priv.client))!=L_NO_NEXT_ELEMENT) {
378 c=(t_client *)priv.client.current->data;
379 if(c->status==IDLE) count_c++;
382 min=(count_c<count_j)?count_c:count_j;
385 printf("d: distributing jobs ...\n");
386 printf("%d queued jobs, %d idle clients\n\n",count_j,count_c);
389 list_reset(&(priv.job));
390 list_reset(&(priv.client));
393 j=(t_job *)priv.job.current->data;
394 c=(t_client *)priv.client.current->data;
395 while(c->status!=IDLE) {
396 list_next(&(priv.client));
397 c=(t_client *)priv.client.current->data;
399 while(j->status!=IN_QUEUE) {
400 list_next(&(priv.job));
401 j=(t_job *)priv.job.current->data;
404 /* direct current job to current client */
405 if(j->step==0) data=NLSOP_NJOB;
406 else data=NLSOP_CJOB;
409 j->channel=c->channel;
416 network_send_chan(&(priv.net),c->channel,&data,sizeof(unsigned char));
417 network_send_chan(&(priv.net),c->channel,(unsigned char *)&d3l,
419 network_send_chan(&(priv.net),c->channel,(unsigned char *)&(j->info),
422 if(data==NLSOP_CJOB) {
423 network_send_chan(&(priv.net),c->channel,j->ac,
424 j->size*sizeof(unsigned char));
425 network_receive_chan(&(priv.net),c->channel,&data,sizeof(unsigned char));
426 network_send_chan(&(priv.net),c->channel,(unsigned char *)&(j->cc),
427 j->size*sizeof(int));
428 network_receive_chan(&(priv.net),c->channel,&data,sizeof(unsigned char));
429 network_send_chan(&(priv.net),c->channel,(unsigned char *)&(j->step),
431 network_receive_chan(&(priv.net),c->channel,&data,sizeof(unsigned char));
435 list_next(&(priv.client));
436 list_next(&(priv.job));
442 int parse_incoming(t_event *event,void *allineed) {
444 /* decide what to do */
445 if(FD_ISSET(priv.net.l_fd,&(priv.event.rfds))) {
447 printf("new node ...\n");
451 /* client/gui interaction */
452 printf("node interaction ...\n");
459 void destroy_it(int signum) {
461 printf("connection to client (ch %d) fucked up!\n",gi);
462 event_math(priv.net.connection[gi].fd,&(priv.event),READ,REMOVE);
463 network_close(&(priv.net),gi);
464 if(list_search_data(&(priv.client),&gi,sizeof(int))==L_SUCCESS) {
465 list_del_current(&(priv.client));
466 printf("removed client from list\n");
468 if(list_search_data(&(priv.gui),&gi,sizeof(int))==L_SUCCESS) {
469 list_del_current(&(priv.gui));
470 printf("removed gui from list\n");
482 int main(int argc,char **argv)
491 if(argc==2) port=atoi(argv[1]);
494 event_init(&(priv.event),1);
495 /* 10 sec event timeout - distributing jobs */
496 event_set_timeout(&(priv.event),10,0);
499 list_init(&(priv.client),1);
500 list_init(&(priv.gui),1);
501 list_init(&(priv.job),1);
503 /* connect to server */
504 network_init(&(priv.net),1);
505 network_set_listen_port(&(priv.net),port);
506 if(network_listen(&(priv.net))!=N_SUCCESS) {
507 printf("unable to listen on port %d, aborting!\n",port);
511 /* install sighandler */
512 signal(SIGALRM,destroy_it);
514 /* wait for events :) */
515 event_math(priv.net.l_fd,&(priv.event),READ,ADD);
516 printf("\nNLSOP_SERVER started!\n\n");
517 event_start(&(priv.event),NULL,parse_incoming,distribute_jobs);