- Timestamp:
- 07/10/11 18:46:56 (13 years ago)
- Location:
- branches/dynamic-threads
- Files:
-
- 4 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/dynamic-threads/Distribution/monitor/mpcsmon.sh
r5575 r5592 1 1 #!/bin/bash 2 2 3 CSHOST=" 192.168.1.31"3 CSHOST="localhost" 4 4 CSPORT="988" 5 USR="user 1"6 PWD="passw ord1"5 USR="user" 6 PWD="passwd" 7 7 NETCAT="nc" 8 8 DELAY=5 -
branches/dynamic-threads/global-functions.h
r5578 r5592 69 69 extern void reader_do_card_info(struct s_reader * reader); 70 70 71 extern int32_t accept_connection(int32_t i, int32_t j); 71 72 extern void start_thread(void * startroutine, char * nameroutine); 72 73 extern void add_job(struct s_client *cl, int8_t action, void *ptr, int len); 74 extern void add_check(struct s_client *client, int8_t action, void *ptr, int32_t size, int32_t ms_delay); 73 75 extern int32_t reader_init(struct s_reader *); 74 76 extern void reader_nullcard(struct s_reader * reader); -
branches/dynamic-threads/globals.h
r5578 r5592 385 385 #define ACTION_CLIENT_KILL 25 386 386 #define ACTION_CLIENT_INIT 26 387 388 #define CHECK_ECM_FALLBACK 1 389 #define CHECK_ECM_TIMEOUT 2 387 390 388 391 #define AVAIL_CHECK_CONNECTED 0 … … 1333 1336 }; 1334 1337 1338 struct s_check { 1339 struct s_client *cl; 1340 int8_t action; 1341 void *ptr; 1342 int32_t len; 1343 struct timeb t_check; 1344 }; 1345 1335 1346 typedef struct reader_stat_t 1336 1347 { -
branches/dynamic-threads/oscam.c
r5588 r5592 32 32 char cs_confdir[128]=CS_CONFDIR; 33 33 int32_t cs_dblevel=0; // Debug Level 34 int32_t thread_pipe[2] = {0, 0} ;34 int32_t thread_pipe[2] = {0, 0}, check_pipe[2] = {0, 0}; 35 35 #ifdef WEBIF 36 36 int8_t cs_restart_mode=1; //Restartmode: 0=off, no restart fork, 1=(default)restart fork, restart by webif, 2=like=1, but also restart on segfaults … … 51 51 52 52 //Cache for ecms, cws and rcs: 53 LLIST *ecmcache; 53 LLIST *ecmcache = NULL; 54 LLIST *checklist = NULL; 54 55 55 56 struct s_config cfg; … … 1963 1964 1964 1965 if (ll_has_elements(ert->matching_rdr)) {//we have still another chance 1966 if (cfg.preferlocalcards && !er->locals_done) { 1967 er->locals_done=1; 1968 LL_NODE *ptr; 1969 struct s_reader *rdr; 1970 for (ptr = er->matching_rdr?er->matching_rdr->initial:NULL; ptr; ptr = ptr->nxt) { 1971 rdr = (struct s_reader*)ptr->obj; 1972 if (!(rdr->typ & R_IS_NETWORK)) 1973 er->locals_done=0; 1974 } 1975 // if there is no local reader left send request to network reader 1976 if (er->locals_done) 1977 request_cw(er, er->stage, 2); 1978 1979 } 1965 1980 ert->selected_reader=NULL; 1966 1981 ert=NULL; … … 2417 2432 } 2418 2433 2434 int local_reader_count = 0; 2419 2435 if(er->rc >= E_99) { 2420 2436 er->reader_avail=0; … … 2431 2447 else { 2432 2448 ll_prepend(er->matching_rdr, rdr); 2449 if (!(rdr->typ & R_IS_NETWORK)) 2450 local_reader_count++; 2433 2451 } 2434 2452 #ifdef WITH_LB … … 2486 2504 2487 2505 er->rcEx = 0; 2488 request_cw(er, 0, cfg.preferlocalcards ? 1 : 0); 2506 request_cw(er, 0, (cfg.preferlocalcards && local_reader_count) ? 1 : 0); 2507 2508 //send ecm request to fallback reader after fallbacktimeout 2509 add_check(er->client, CHECK_ECM_FALLBACK, er, sizeof(ECM_REQUEST), cfg.ftimeout); 2510 2511 //check ecm request for timeout after clienttimeout 2512 add_check(er->client, CHECK_ECM_TIMEOUT, er, sizeof(ECM_REQUEST), cfg.ctimeout); 2489 2513 } 2490 2514 … … 2634 2658 } 2635 2659 2636 static int32_t chk_pending(struct s_client *cl, int32_t timeout) 2637 { 2638 int32_t i, pending=0; 2639 uint32_t td; 2640 struct timeb tpn, tpe, tpc; // <n>ow, <e>nd, <c>heck 2641 2642 ECM_REQUEST *er; 2643 cs_ftime(&tpn); 2644 2645 tpe=tpn; 2646 tpe.time+=timeout; 2647 2648 if (!cl || !cl->ecmtask) 2649 return 0; 2650 2651 if (cl->ecmtask) 2652 i=(ph[cl->ctyp].multi)?CS_MAXPENDING:1; 2653 else 2654 i=0; 2655 2656 for (--i; i>=0; i--) { 2657 if (cl->ecmtask[i].rc>=E_99) { // check all pending ecm-requests 2658 int32_t act=1; 2659 er=&cl->ecmtask[i]; 2660 pending++; 2661 2662 //additional cache check: 2663 if (check_cwcache2(er, cl->grp)) { 2664 //cs_log("found lost entry in cache! %s %04X&%06X/%04X", username(cl), er->caid, er->prid, er->srvid); 2665 er->rc = E_CACHE2; 2666 add_job(cl, ACTION_CLIENT_ECM_ANSWER, er, sizeof(ECM_REQUEST)); 2667 continue; 2668 } 2669 2670 tpc=er->tps; 2671 uint32_t tt; 2672 tt = (er->stage) ? cfg.ctimeout : cfg.ftimeout; 2673 tpc.time +=tt / 1000; 2674 tpc.millitm += tt % 1000; 2675 if (!er->stage && er->rc >= E_UNHANDLED) { 2676 LL_NODE *ptr; 2677 for (ptr = er->matching_rdr?er->matching_rdr->initial:NULL; ptr && ptr != er->fallback; ptr = ptr->nxt) 2678 if (!cfg.preferlocalcards || 2679 (cfg.preferlocalcards && !er->locals_done && (!(((struct s_reader*)ptr->obj)->typ & R_IS_NETWORK))) || 2680 (cfg.preferlocalcards && er->locals_done && (((struct s_reader*)ptr->obj)->typ & R_IS_NETWORK))) 2681 act=0; 2682 2683 //cs_log("stage 0, act=%d r0=%d, r1=%d, r2=%d, r3=%d, r4=%d r5=%d", act, 2684 // er->matching_rdr[0], er->matching_rdr[1], er->matching_rdr[2], 2685 // er->matching_rdr[3], er->matching_rdr[4], er->matching_rdr[5]); 2686 2687 if (act) { 2688 int32_t inc_stage = 1; 2689 if (cfg.preferlocalcards && !er->locals_done) { 2690 er->locals_done = 1; 2691 struct s_reader *rdr; 2692 for (rdr=first_active_reader; rdr ; rdr=rdr->next) 2693 if (rdr->typ & R_IS_NETWORK) 2694 inc_stage = 0; 2695 } 2696 uint32_t tt; 2697 if (!inc_stage) { 2698 request_cw(er, er->stage, 2); 2699 tt = 1000 * (tpn.time - er->tps.time) + tpn.millitm - er->tps.millitm; 2700 } else { 2701 er->locals_done = 0; 2702 er->stage++; 2703 request_cw(er, er->stage, cfg.preferlocalcards ? 1 : 0); 2704 2705 tt = (cfg.ctimeout-cfg.ftimeout); 2706 } 2707 tpc.time += tt / 1000; 2708 tpc.millitm += tt % 1000; 2709 } 2710 } 2711 if (comp_timeb(&tpn, &tpc)>0) { // action needed 2712 //cs_log("Action now %d.%03d", tpn.time, tpn.millitm); 2713 //cs_log(" %d.%03d", tpc.time, tpc.millitm); 2714 if (er->stage) { 2715 er->rc = E_TIMEOUT; 2716 er->rcEx = 0; 2717 #ifdef WITH_LB 2718 if (cfg.lb_mode) { 2719 LL_NODE *ptr; 2720 for (ptr = er->matching_rdr?er->matching_rdr->initial:NULL; ptr ; ptr = ptr->nxt) 2721 send_reader_stat((struct s_reader *)ptr->obj, er, E_TIMEOUT); 2722 } 2723 #endif 2724 store_cw_in_cache(er, cl->grp, E_TIMEOUT); 2725 add_job(cl, ACTION_CLIENT_ECM_ANSWER, er, sizeof(ECM_REQUEST)); 2726 continue; 2727 } else { 2728 er->stage++; 2729 cs_debug_mask(D_TRACE, "fallback for %s %04X&%06X/%04X", username(cl), er->caid, er->prid, er->srvid); 2730 if (er->rc >= E_UNHANDLED) //do not request rc=99 2731 request_cw(er, er->stage, 0); 2732 uint32_t tt; 2733 tt = (cfg.ctimeout-cfg.ftimeout); 2734 tpc.time += tt / 1000; 2735 tpc.millitm += tt % 1000; 2736 } 2737 } 2738 2739 //build_delay(&tpe, &tpc); 2740 if (comp_timeb(&tpe, &tpc)>0) { 2741 tpe.time=tpc.time; 2742 tpe.millitm=tpc.millitm; 2743 } 2744 } 2745 } 2746 2747 td=(tpe.time-tpn.time)*1000+(tpe.millitm-tpn.millitm)+5; 2748 cl->pending=pending; 2749 2750 return td; 2660 void add_check(struct s_client *client, int8_t action, void *ptr, int32_t size, int32_t ms_delay) { 2661 2662 if (!checklist) 2663 return; 2664 2665 struct timeb t_now; 2666 cs_ftime(&t_now); 2667 2668 t_now.time += ms_delay / 1000; 2669 t_now.millitm += ms_delay % 1000; 2670 2671 struct s_check *tt = cs_malloc(&tt, sizeof(struct s_check), -1); 2672 2673 tt->cl = client; 2674 tt->ptr = ptr; 2675 tt->len = size; 2676 tt->action=action; 2677 tt->t_check = t_now; 2678 2679 ll_append(checklist, tt); 2680 2681 cs_debug_mask(D_TRACE, "adding check action=%d ms_delay=%d", action, ms_delay); 2682 2683 char buf[1]; 2684 if (check_pipe[1]) 2685 write(check_pipe[1], buf, 1); //wakeup check thread 2751 2686 } 2752 2687 … … 3037 2972 } 3038 2973 3039 int32_t accept_connection(int32_t i, int32_t j); 2974 void * check_thread(void) { 2975 checklist = ll_create(); 2976 int32_t next_check = 100, time_to_check, rc; 2977 struct timeb t_now; 2978 char buf[10]; 2979 ECM_REQUEST *er; 2980 struct pollfd pfd[1]; 2981 2982 if (pipe(check_pipe) == -1) { 2983 printf("cannot create pipe, errno=%d\n", errno); 2984 exit(1); 2985 } 2986 2987 pfd[0].fd = check_pipe[0]; 2988 pfd[0].events = POLLIN | POLLPRI; 2989 2990 while(1) { 2991 rc = poll(pfd, 1, next_check ? next_check : -1); 2992 cs_ftime(&t_now); 2993 2994 if (rc>0) 2995 continue; 2996 2997 if (rc) 2998 read(check_pipe[0], buf, sizeof(buf)); 2999 3000 LL_ITER itr = ll_iter_create(checklist); 3001 3002 struct s_check *t1; 3003 next_check = 0; 3004 while ((t1 = ll_iter_next(&itr))) { 3005 time_to_check = ((t1->t_check.time - t_now.time) * 1000) + (t1->t_check.millitm - t_now.millitm); 3006 if (time_to_check <= 0) { 3007 //TODO: we should check here if cl and t1->ptr is still a valid pointer to avoid segfaults 3008 switch(t1->action) { 3009 case CHECK_ECM_TIMEOUT: 3010 er = t1->ptr; 3011 if (er->rc<E_99) 3012 break; 3013 3014 er->rc = E_TIMEOUT; 3015 er->rcEx = 0; 3016 #ifdef WITH_LB 3017 if (cfg.lb_mode) { 3018 LL_NODE *ptr; 3019 for (ptr = er->matching_rdr?er->matching_rdr->initial:NULL; ptr ; ptr = ptr->nxt) 3020 send_reader_stat((struct s_reader *)ptr->obj, er, E_TIMEOUT); 3021 } 3022 #endif 3023 if (er->client) { 3024 store_cw_in_cache(er, er->client->grp, E_TIMEOUT); 3025 add_job(er->client, ACTION_CLIENT_ECM_ANSWER, er, sizeof(ECM_REQUEST)); 3026 } 3027 break; 3028 case CHECK_ECM_FALLBACK: 3029 er = t1->ptr; 3030 if (er->rc<E_99) 3031 break; 3032 3033 er->stage++; 3034 cs_debug_mask(D_TRACE, "fallback for %s %04X&%06X/%04X", username(er->client), er->caid, er->prid, er->srvid); 3035 if (er->rc >= E_UNHANDLED) //do not request rc=99 3036 request_cw(er, er->stage, 0); 3037 3038 break; 3039 default: 3040 break; 3041 } 3042 3043 ll_iter_remove(&itr); 3044 add_garbage(t1); 3045 } else { 3046 if (!next_check || time_to_check < next_check) 3047 next_check = time_to_check; 3048 } 3049 } 3050 } 3051 } 3040 3052 3041 3053 void * client_check(void) { … … 3178 3190 continue; 3179 3191 } 3180 //check for pending ecm requests (on client ecmtask) and answer with timeout after ctimeout3181 //physical reader do not use ecmtask and proxy reader using casc_process_ecm() and casc_check_dcw() for checking3182 chk_pending(cl, cfg.cmaxidle);3183 3192 } 3184 3193 } … … 3557 3566 #endif 3558 3567 start_thread((void *) &reader_check, "reader check"); 3568 start_thread((void *) &check_thread, "check"); 3559 3569 #ifdef LCDSUPPORT 3560 3570 start_lcd_thread();
Note:
See TracChangeset
for help on using the changeset viewer.