Annotation of 43BSDReno/contrib/isode-beta/quipu/task_select.c, revision 1.1

1.1     ! root        1: /* task_select.c - tidy connection mesh and select next DSA activity */
        !             2: 
        !             3: #ifndef lint
        !             4: static char *rcsid = "$Header: /f/osi/quipu/RCS/task_select.c,v 7.2 90/07/09 14:46:43 mrose Exp $";
        !             5: #endif
        !             6: 
        !             7: /*
        !             8:  * $Header: /f/osi/quipu/RCS/task_select.c,v 7.2 90/07/09 14:46:43 mrose Exp $
        !             9:  *
        !            10:  *
        !            11:  * $Log:       task_select.c,v $
        !            12:  * Revision 7.2  90/07/09  14:46:43  mrose
        !            13:  * sync
        !            14:  * 
        !            15:  * Revision 7.1  89/12/19  16:20:51  mrose
        !            16:  * sync
        !            17:  * 
        !            18:  * Revision 7.0  89/11/23  22:18:15  mrose
        !            19:  * Release 6.0
        !            20:  * 
        !            21:  */
        !            22: 
        !            23: /*
        !            24:  *                                NOTICE
        !            25:  *
        !            26:  *    Acquisition, use, and distribution of this module and related
        !            27:  *    materials are subject to the restrictions of a license agreement.
        !            28:  *    Consult the Preface in the User's Manual for the full terms of
        !            29:  *    this agreement.
        !            30:  *
        !            31:  */
        !            32: 
        !            33: 
        !            34: #include "quipu/util.h"
        !            35: #include "quipu/connection.h"
        !            36: 
        !            37: extern LLog * log_dsap;
        !            38: extern time_t  conn_timeout;
        !            39: extern time_t  nsap_timeout;
        !            40: extern time_t  slave_timeout;
        !            41: extern time_t  time();
        !            42: extern time_t  timenow;
        !            43: time_t lastedb_update;
        !            44: 
        !            45: struct task_act        * task_select(secs_p)
        !            46: int            * secs_p;
        !            47: {
        !            48:     struct connection  * cn;
        !            49:     struct connection  * cn_tmp;
        !            50:     struct connection  **next_cn;
        !            51:     struct task_act    * tk;
        !            52:     struct task_act    **next_tk;
        !            53:     struct oper_act    * edbon;
        !            54:     struct oper_act    **next_edbon = (struct oper_act **)NULL;
        !            55:     struct oper_act    * on;
        !            56:     int                          timeout_tmp;
        !            57:     char                 process_edbs = TRUE;
        !            58:     char                 do_timeout;
        !            59:     int                          suspended = FALSE;
        !            60:     struct task_act    * ret_tk = NULLTASK;
        !            61:     extern char          startup_update;
        !            62: 
        !            63:     (void) time (&timenow);
        !            64:     (*secs_p) = NOTOK;
        !            65:     conns_used = 0;
        !            66: 
        !            67: /*
        !            68:     DLOG(log_dsap, LLOG_DEBUG, ("task_select connections:"));
        !            69:     conn_list_log(connlist);
        !            70: */
        !            71: 
        !            72:     for(cn=connlist; cn!=NULLCONN; cn=cn_tmp)
        !            73:     {
        !            74:        cn_tmp = cn->cn_next;   /* Nasty but necessary in conn_extract()
        !            75:                                   manages to get itself called somehow */
        !            76: 
        !            77:        do_timeout = FALSE;
        !            78: 
        !            79:        conn_log(cn);
        !            80: 
        !            81:        next_tk = &(cn->cn_tasklist);
        !            82:        for(tk=cn->cn_tasklist; tk!=NULLTASK; tk=(*next_tk))
        !            83:            {
        !            84:                if(tk->tk_timed)
        !            85:                {
        !            86:                    if(tk->tk_timeout <= timenow)
        !            87:                    {
        !            88: #ifdef DEBUG
        !            89:                        struct UTCtime    ut;
        !            90:                        struct UTCtime    ut2;
        !            91: 
        !            92:                        DLOG(log_dsap, LLOG_TRACE, ("task has timelimit of %ld", tk->tk_timeout));
        !            93:                        tm2ut(gmtime(&(tk->tk_timeout)), &ut);
        !            94:                        DLOG(log_dsap, LLOG_DEBUG, ("converted timelimit = %s", utct2str(&(ut))));
        !            95:                        tm2ut(gmtime(&(timenow)), &ut2);
        !            96:                        DLOG(log_dsap, LLOG_DEBUG, ("time now = %s", utct2str(&(ut2))));
        !            97: #endif
        !            98:                        (*next_tk) = tk->tk_next;
        !            99:                        timeout_task(tk);
        !           100:                        continue;
        !           101:                    }
        !           102:                    else
        !           103:                    {
        !           104:                        timeout_tmp = (int) tk->tk_timeout - timenow;
        !           105:                        if(((*secs_p) == NOTOK) || ((*secs_p) > timeout_tmp))
        !           106:                        {
        !           107:                            (*secs_p) = timeout_tmp;
        !           108:                        }
        !           109:                    }
        !           110:                }
        !           111: 
        !           112:                next_tk = &(tk->tk_next);
        !           113:        }
        !           114: 
        !           115:        if(cn->cn_state == CN_OPEN)
        !           116:        {
        !           117:            next_tk = &(cn->cn_tasklist);
        !           118:            for(tk=cn->cn_tasklist; tk!=NULLTASK; tk=(*next_tk))
        !           119:            {
        !           120:                next_tk = &(tk->tk_next);
        !           121: 
        !           122:                if(tk->tk_state == TK_ACTIVE)
        !           123:                {
        !           124:                    if(   (ret_tk == NULLTASK)
        !           125:                       || (tk->tk_prio > ret_tk->tk_prio)
        !           126:                       || (   (tk->tk_prio == ret_tk->tk_prio)
        !           127:                           && (   (!ret_tk->tk_timed)
        !           128:                               || (   (tk->tk_timed)
        !           129:                                   && (tk->tk_timeout < ret_tk->tk_timeout)
        !           130:                                  )
        !           131:                              )
        !           132:                          )
        !           133:                      )
        !           134:                    {
        !           135:                        ret_tk = tk;
        !           136:                    }
        !           137:                }
        !           138: 
        !           139:                if(tk->tk_state == TK_SUSPEND)
        !           140:                {
        !           141:                    /*
        !           142:                    *  A task suspended to allow the network to be polled.
        !           143:                    *  Set suspended to force polling.
        !           144:                    */
        !           145:                    tk->tk_state = TK_ACTIVE;
        !           146:                    suspended = TRUE;
        !           147:                }
        !           148:            }
        !           149: 
        !           150:            if(cn->cn_tasklist == NULLTASK)
        !           151:            {
        !           152:                if(cn->cn_initiator)
        !           153:                {
        !           154:                    if(cn->cn_operlist == NULLOPER)
        !           155:                    {
        !           156:                        if((cn->cn_last_used + conn_timeout) <= timenow)
        !           157:                        {
        !           158:                            do_timeout = TRUE;
        !           159:                        }
        !           160:                        else
        !           161:                        {
        !           162:                            timeout_tmp = (int) (cn->cn_last_used + conn_timeout) - timenow;
        !           163:                            if(((*secs_p) == NOTOK) || ((*secs_p) > timeout_tmp))
        !           164:                            {
        !           165:                                (*secs_p) = timeout_tmp;
        !           166:                            }
        !           167:                        }
        !           168:                    }
        !           169:                    else
        !           170:                    {
        !           171:                        timeout_tmp = conn_timeout;     /* safety catch */
        !           172:                        if ((tk = cn->cn_operlist->on_task) != NULLTASK) {
        !           173:                                if (tk->tk_timed) {
        !           174:                                        timeout_tmp = (int) tk->tk_timeout - timenow;
        !           175:                                        if (timeout_tmp < 0)
        !           176:                                                timeout_tmp = 0;
        !           177:                                }
        !           178:                        }
        !           179:                        if(((*secs_p) == NOTOK) || ((*secs_p) > timeout_tmp))
        !           180:                        {
        !           181:                                (*secs_p) = timeout_tmp;
        !           182:                        }
        !           183:                        cn->cn_last_used = timenow;
        !           184:                    }
        !           185:                }
        !           186:            }
        !           187:            else
        !           188:            {
        !           189:                cn->cn_last_used = timenow;
        !           190:                process_edbs = FALSE;
        !           191:            }
        !           192:        } else  {
        !           193:                if((cn->cn_last_used + nsap_timeout) <= timenow)
        !           194:                {
        !           195:                    if ((cn->cn_state == CN_CONNECTING1) || (cn->cn_state == CN_CONNECTING2))
        !           196:                            conn_retry(cn);
        !           197:                    else if (cn->cn_state == CN_CLOSING) {
        !           198:                            if (conn_release_retry(cn) == NOTOK) {
        !           199:                                /* had its chance - abort */
        !           200:                                do_ds_unbind(cn);
        !           201:                                conn_rel_abort (cn);
        !           202:                                conn_extract(cn);
        !           203:                            } 
        !           204:                    } else if (cn->cn_state == CN_OPENING) {
        !           205:                        /* something started to associate - then gave up !!! */
        !           206:                        conn_rel_abort (cn);
        !           207:                        conn_extract (cn);
        !           208:                    }
        !           209:                    (*secs_p) = nsap_timeout;
        !           210:                }
        !           211:                else
        !           212:                {
        !           213:                    timeout_tmp = (int) (cn->cn_last_used + nsap_timeout) - timenow;
        !           214:                    if(((*secs_p) == NOTOK) || ((*secs_p) > timeout_tmp))
        !           215:                    {
        !           216:                        (*secs_p) = timeout_tmp;
        !           217:                    }
        !           218:                }
        !           219:        }
        !           220: 
        !           221:        if(do_timeout)
        !           222:        {
        !           223:            LLOG(log_dsap, LLOG_NOTICE, ("Timing out connection %d",cn->cn_ad));
        !           224:            if (conn_release(cn) == NOTOK) {
        !           225:                    (*secs_p) = nsap_timeout;
        !           226:                    conns_used++;
        !           227:            }
        !           228:        }
        !           229:        else
        !           230:        {
        !           231:            conns_used++;
        !           232:        }
        !           233:     }
        !           234: 
        !           235: /*
        !           236: *  Open the connection with the highest priority operation
        !           237: *  waiting on it...
        !           238: *
        !           239: *  Get DSA Info operations are highest priority, followed by
        !           240: *  BIND_COMPARE, and X500, and finally GetEDB operations.
        !           241: */
        !           242:     next_cn = &(connwaitlist);
        !           243:     for(cn=connwaitlist; cn!=NULLCONN; cn=(*next_cn))
        !           244:     {
        !           245:        if(conns_used >= MAX_CONNS)
        !           246:            break;
        !           247: 
        !           248:        for(on=cn->cn_operlist; on!=NULLOPER; on=on->on_next_conn)
        !           249:        {
        !           250:            if(on->on_type == ON_TYPE_GET_DSA_INFO)
        !           251:            {
        !           252:                (*next_cn) = cn->cn_next;
        !           253:                if(conn_request(cn) == OK)
        !           254:                {
        !           255:                    conns_used++;
        !           256:                    cn->cn_next = connlist;
        !           257:                    connlist = cn;
        !           258:                    cn->cn_last_used = timenow;
        !           259:                    /* Do something with the operations */
        !           260:                }
        !           261:                else
        !           262:                {
        !           263:                    /* Do something with the operations */
        !           264:                }
        !           265:                break;
        !           266:            }
        !           267:        }
        !           268:        if(on == NULLOPER)
        !           269:            next_cn = &(cn->cn_next);
        !           270:     }
        !           271: 
        !           272:     next_cn = &(connwaitlist);
        !           273:     for(cn=connwaitlist; cn!=NULLCONN; cn=(*next_cn))
        !           274:     {
        !           275:        if(conns_used >= (MAX_CONNS - CONNS_RESERVED_DI))
        !           276:            break;
        !           277: 
        !           278:        for(on=cn->cn_operlist; on!=NULLOPER; on=on->on_next_conn)
        !           279:        {
        !           280:            if(on->on_type != ON_TYPE_GET_EDB)
        !           281:            {
        !           282:                (*next_cn) = cn->cn_next;
        !           283:                if(conn_request(cn) == OK)
        !           284:                {
        !           285:                    conns_used++;
        !           286:                    cn->cn_next = connlist;
        !           287:                    connlist = cn;
        !           288:                    cn->cn_last_used = timenow;
        !           289:                    /* Do something with the operations */
        !           290:                }
        !           291:                else
        !           292:                {
        !           293:                    /* Do something with the operations */
        !           294:                }
        !           295:                break;
        !           296:            }
        !           297:        }
        !           298:        if(on == NULLOPER)
        !           299:            next_cn = &(cn->cn_next);
        !           300:     }
        !           301: 
        !           302:     next_cn = &(connwaitlist);
        !           303:     for(cn=connwaitlist; cn!=NULLCONN; cn=(*next_cn))
        !           304:     {
        !           305:        if(conns_used >= (MAX_CONNS - CONNS_RESERVED_DI - CONNS_RESERVED_X500))
        !           306:            break;
        !           307: 
        !           308:        (*next_cn) = cn->cn_next;
        !           309:        if(conn_request(cn) == OK)
        !           310:        {
        !           311:            conns_used++;
        !           312:            cn->cn_next = connlist;
        !           313:            connlist = cn;
        !           314:            cn->cn_last_used = timenow;
        !           315:            /* Do something with the operations */
        !           316:        }
        !           317:        else
        !           318:        {
        !           319:            /* Do something with the operations */
        !           320:        }
        !           321:     }
        !           322: 
        !           323:     if(process_edbs)
        !           324:     {
        !           325:        /*
        !           326:        *  Nothing is happening that would be disturbed by writing back
        !           327:        *  a retrieved EDB so it is a good time to process them.
        !           328:        */
        !           329: 
        !           330:        next_edbon = &(get_edb_ops);
        !           331:        for(edbon=get_edb_ops; edbon!=NULLOPER; edbon=(*next_edbon))
        !           332:        {
        !           333:            if(edbon->on_state == ON_COMPLETE)
        !           334:            {
        !           335:                (*next_edbon) = edbon->on_next_task;
        !           336:                process_edb(edbon);
        !           337:                oper_conn_extract(edbon);
        !           338:                oper_free(edbon);
        !           339: 
        !           340:                (*secs_p) = 0; /* Give edb op's conn a chance to time out */
        !           341: 
        !           342:                continue;
        !           343:            } else if (edbon->on_state == ON_ABANDONED) {
        !           344:                LLOG (log_dsap,LLOG_NOTICE,("Get edb has been abandoned"));
        !           345:                (*next_edbon) = edbon->on_next_task;
        !           346:                oper_free(edbon);
        !           347:            }
        !           348: 
        !           349:            next_edbon = &(edbon->on_next_task);
        !           350:        }
        !           351: 
        !           352:        if ((get_edb_ops == NULLOPER) && startup_update ) {
        !           353:                /* see if cache timer has expired - if so resend edb ops... */
        !           354:                if ( (timenow - lastedb_update) >= slave_timeout )
        !           355:                        slave_update();
        !           356:        }
        !           357:     }
        !           358: 
        !           359:     if ((get_edb_ops == NULLOPER) && startup_update ) {
        !           360:        /* make sure we are awake for the next EDB update */
        !           361:        if ((timeout_tmp = lastedb_update + slave_timeout - timenow) >= 0)
        !           362:                if (((*secs_p) == NOTOK) || ((*secs_p) > timeout_tmp)) 
        !           363:                        (*secs_p) = timeout_tmp;
        !           364:     }
        !           365: 
        !           366:     if(suspended)
        !           367:     {
        !           368:        /*
        !           369:        *  A task suspended in order for the network to be checked.
        !           370:        *  Force this to happen by setting the selected task to NULL
        !           371:        *  and the polling time of the network to 0 secs.
        !           372:        */
        !           373:        ret_tk = NULLTASK;
        !           374:        (*secs_p) = 0;
        !           375:     }
        !           376: 
        !           377:     return(ret_tk);
        !           378: }
        !           379: 
        !           380: timeout_task(tk)
        !           381: struct task_act        * tk;
        !           382: {
        !           383:     struct oper_act    * on;
        !           384:     struct DSError     * err = &(tk->tk_resp.di_error.de_err);
        !           385:     struct ds_search_task *tmp;
        !           386: 
        !           387:     DLOG(log_dsap, LLOG_TRACE, ("timeout_task"));
        !           388:     for(on=tk->tk_operlist; on!=NULLOPER; on=on->on_next_task)
        !           389:     {
        !           390:        /* Time out operations started by task */
        !           391:        on->on_state = ON_ABANDONED;
        !           392:        on->on_task = NULLTASK;
        !           393:     }
        !           394: 
        !           395:     if(tk->tk_dx.dx_arg.dca_dsarg.arg_type != OP_SEARCH)
        !           396:     {
        !           397:        err->dse_type = DSE_SERVICEERROR;
        !           398:        if (tk->tk_timed == TRUE)
        !           399:                err->ERR_SERVICE.DSE_sv_problem = DSE_SV_TIMELIMITEXCEEDED;
        !           400:        else /* tk->tk_timed == 2 */
        !           401:                err->ERR_SERVICE.DSE_sv_problem = DSE_SV_ADMINLIMITEXCEEDED;
        !           402:        task_error(tk);
        !           403:        task_extract(tk);
        !           404:     }
        !           405:     else
        !           406:     {
        !           407:        /* Do search collation */
        !           408:        if ((tk->tk_state == TK_ACTIVE) && (tk->local_st == NULL_ST)) {
        !           409:                /* nothing happened yet... */
        !           410:                err->dse_type = DSE_SERVICEERROR;
        !           411:                if (tk->tk_timed == TRUE)
        !           412:                        err->ERR_SERVICE.DSE_sv_problem = DSE_SV_TIMELIMITEXCEEDED;
        !           413:                else /* tk->tk_timed == 2 */
        !           414:                        err->ERR_SERVICE.DSE_sv_problem = DSE_SV_ADMINLIMITEXCEEDED;
        !           415:                task_error(tk);
        !           416:        } else {
        !           417:                /* send the results we have got... */
        !           418:                tk->tk_result = &(tk->tk_resp.di_result.dr_res);
        !           419:                tk->tk_result->dcr_dsres.result_type = tk->tk_dx.dx_arg.dca_dsarg.arg_type;
        !           420:                tk->tk_resp.di_type = DI_RESULT;
        !           421:                if (tk->tk_timed == TRUE)
        !           422:                        tk->tk_resp.di_result.dr_res.dcr_dsres.res_sr.CSR_limitproblem = LSR_TIMELIMITEXCEEDED;
        !           423:                else /* tk->tk_timed == 2 */
        !           424:                        tk->tk_resp.di_result.dr_res.dcr_dsres.res_sr.CSR_limitproblem = LSR_ADMINSIZEEXCEEDED;
        !           425: 
        !           426:                /* Go through sub-tasks and add a POQ for each */
        !           427:                for(tmp=tk->referred_st; tmp!= NULL_ST; tmp=tmp->st_next)
        !           428:                        add_cref2poq (&tk->tk_result->dcr_dsres.res_sr,tmp->st_cr);
        !           429: 
        !           430:                task_result(tk);
        !           431:        }
        !           432:        task_extract(tk);
        !           433:     }
        !           434: 
        !           435: }
        !           436: 
        !           437: 

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.