Changeset 8267
- Timestamp:
- 02/03/13 20:48:54 (11 years ago)
- Location:
- trunk
- Files:
-
- 5 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/global-functions.h
r8266 r8267 22 22 extern int32_t process_client_pipe(struct s_client *cl, uchar *buf, int32_t l); 23 23 extern void *clientthread_init(void * init); 24 extern void cleanup_thread(void *var);25 24 extern void kill_thread(struct s_client *cl); 26 25 extern void cs_debug_level(void); -
trunk/oscam-client.c
r8258 r8267 5 5 #include "module-webif.h" 6 6 #include "oscam-client.h" 7 #include "oscam-ecm.h" 7 8 #include "oscam-failban.h" 9 #include "oscam-garbage.h" 8 10 #include "oscam-lock.h" 9 11 #include "oscam-net.h" … … 532 534 } } 533 535 } 536 537 void free_client(struct s_client *cl) 538 { 539 if (!cl) 540 return; 541 struct s_reader *rdr = cl->reader; 542 543 // Remove client from client list. kill_thread also removes this client, so here just if client exits itself... 544 struct s_client *prev, *cl2; 545 cs_writelock(&clientlist_lock); 546 cl->kill = 1; 547 for (prev = first_client, cl2 = first_client->next; 548 prev->next != NULL; 549 prev = prev->next, cl2 = cl2->next) 550 { 551 if (cl == cl2) 552 break; 553 } 554 if (cl == cl2) 555 prev->next = cl2->next; // Remove client from list 556 int32_t bucket = (uintptr_t)cl / 16 % CS_CLIENT_HASHBUCKETS; 557 // Remove client from hashed list 558 if (first_client_hashed[bucket] == cl){ 559 first_client_hashed[bucket] = cl->nexthashed; 560 } else { 561 for (prev = first_client_hashed[bucket], cl2 = first_client_hashed[bucket]->nexthashed; 562 prev->nexthashed != NULL; 563 prev = prev->nexthashed, cl2 = cl2->nexthashed) 564 { 565 if (cl == cl2) 566 break; 567 } 568 if (cl == cl2) 569 prev->nexthashed = cl2->nexthashed; 570 } 571 cs_writeunlock(&clientlist_lock); 572 573 // Clean reader. The cleaned structures should be only used by the reader thread, so we should be save without waiting 574 if (rdr) { 575 remove_reader_from_ecm(rdr); 576 remove_reader_from_active(rdr); 577 if(rdr->ph.cleanup) 578 rdr->ph.cleanup(cl); 579 if (cl->typ == 'r') 580 cardreader_close(rdr); 581 if (cl->typ == 'p') 582 network_tcp_connection_close(rdr, "cleanup"); 583 cl->reader = NULL; 584 } 585 586 // Clean client specific data 587 if (cl->typ == 'c') { 588 cs_statistics(cl); 589 cl->last_caid = 0xFFFF; 590 cl->last_srvid = 0xFFFF; 591 cs_statistics(cl); 592 cs_sleepms(500); //just wait a bit that really really nobody is accessing client data 593 if (modules[cl->ctyp].cleanup) 594 modules[cl->ctyp].cleanup(cl); 595 } 596 597 // Close network socket if not already cleaned by previous cleanup functions 598 if (cl->pfd) 599 close(cl->pfd); 600 601 // Clean all remaining structures 602 free_joblist(cl); 603 604 cleanup_ecmtasks(cl); 605 add_garbage(cl->emmcache); 606 #ifdef MODULE_CCCAM 607 add_garbage(cl->cc); 608 #endif 609 #ifdef MODULE_SERIAL 610 add_garbage(cl->serialdata); 611 #endif 612 add_garbage(cl); 613 } -
trunk/oscam-client.h
r8258 r8267 20 20 void kill_all_clients(void); 21 21 void client_check_status(struct s_client *cl); 22 void free_client(struct s_client *cl); 22 23 23 24 #endif -
trunk/oscam-work.c
r8259 r8267 80 80 free_job_data(data); 81 81 data = NULL; 82 cleanup_thread(cl);82 free_client(cl); 83 83 if (restart_reader) 84 84 restart_cardreader(reader, 0); -
trunk/oscam.c
r8266 r8267 530 530 } 531 531 532 void cleanup_thread(void *var)533 {534 struct s_client *cl = var;535 if(!cl) return;536 struct s_reader *rdr = cl->reader;537 538 // Remove client from client list. kill_thread also removes this client, so here just if client exits itself...539 struct s_client *prev, *cl2;540 cs_writelock(&clientlist_lock);541 cl->kill = 1;542 for (prev=first_client, cl2=first_client->next; prev->next != NULL; prev=prev->next, cl2=cl2->next)543 if (cl == cl2)544 break;545 if (cl == cl2)546 prev->next = cl2->next; //remove client from list547 int32_t bucket = (uintptr_t)cl/16 % CS_CLIENT_HASHBUCKETS;548 //remove client from hashed list549 if(first_client_hashed[bucket] == cl){550 first_client_hashed[bucket] = cl->nexthashed;551 } else {552 for (prev=first_client_hashed[bucket], cl2=first_client_hashed[bucket]->nexthashed; prev->nexthashed != NULL; prev=prev->nexthashed, cl2=cl2->nexthashed)553 if (cl == cl2)554 break;555 if (cl == cl2)556 prev->nexthashed = cl2->nexthashed;557 }558 cs_writeunlock(&clientlist_lock);559 560 // Clean reader. The cleaned structures should be only used by the reader thread, so we should be save without waiting561 if (rdr){562 remove_reader_from_ecm(rdr);563 564 remove_reader_from_active(rdr);565 if(rdr->ph.cleanup)566 rdr->ph.cleanup(cl);567 if (cl->typ == 'r')568 cardreader_close(rdr);569 if (cl->typ == 'p')570 network_tcp_connection_close(rdr, "cleanup");571 cl->reader = NULL;572 }573 574 // Clean client specific data575 if(cl->typ == 'c'){576 cs_statistics(cl);577 cl->last_caid = 0xFFFF;578 cl->last_srvid = 0xFFFF;579 cs_statistics(cl);580 581 cs_sleepms(500); //just wait a bit that really really nobody is accessing client data582 583 if(modules[cl->ctyp].cleanup)584 modules[cl->ctyp].cleanup(cl);585 }586 587 // Close network socket if not already cleaned by previous cleanup functions588 if(cl->pfd)589 close(cl->pfd);590 591 // Clean all remaining structures592 free_joblist(cl);593 594 cleanup_ecmtasks(cl);595 add_garbage(cl->emmcache);596 #ifdef MODULE_CCCAM597 add_garbage(cl->cc);598 #endif599 #ifdef MODULE_SERIAL600 add_garbage(cl->serialdata);601 #endif602 add_garbage(cl);603 }604 605 532 static void cs_cleanup(void) 606 533 { … … 826 753 cs_debug_mask(D_TRACE, "thread %8lX ended!", (unsigned long)pthread_self()); 827 754 828 cleanup_thread(cl);755 free_client(cl); 829 756 830 757 //Restore signals before exiting thread
Note:
See TracChangeset
for help on using the changeset viewer.