X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=libraries%2Flibldap_r%2Frq.c;h=5ea15c2222c86898fe83d36159293c82f4b6fb79;hb=4fda9bbafa1b1650d5670edc5454863f22ec8052;hp=f1fe099361b00c4bb822ab23bb366c2d327e136f;hpb=35d1bd68b955ec9a4c94fbb33765d08a8e8128ae;p=openldap diff --git a/libraries/libldap_r/rq.c b/libraries/libldap_r/rq.c index f1fe099361..5ea15c2222 100644 --- a/libraries/libldap_r/rq.c +++ b/libraries/libldap_r/rq.c @@ -1,39 +1,79 @@ /* $OpenLDAP$ */ +/* This work is part of OpenLDAP Software . + * + * Copyright 2003-2007 The OpenLDAP Foundation. + * Portions Copyright 2003 IBM Corporation. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted only as authorized by the OpenLDAP + * Public License. + * + * A copy of this license is available in file LICENSE in the + * top-level directory of the distribution or, alternatively, at + * . + */ +/* This work was initially developed by Jong Hyuk Choi for inclusion + * in OpenLDAP Software. + */ + #include "portable.h" #include #include #include +#include +#include #include #include -#include #include "ldap-int.h" #include "ldap_pvt_thread.h" #include "ldap_queue.h" #include "ldap_rq.h" -#ifdef LDAP_SYNCREPL - -void +struct re_s * ldap_pvt_runqueue_insert( struct runqueue_s* rq, time_t interval, ldap_pvt_thread_start_t *routine, - void *arg + void *arg, + char *tname, + char *tspec ) { struct re_s* entry; - entry = (struct re_s *) ch_calloc( 1, sizeof( struct re_s )); - entry->interval.tv_sec = interval; - entry->interval.tv_usec = 0; - entry->next_sched.tv_sec = time( NULL ); - entry->next_sched.tv_usec = 0; - entry->routine = routine; - entry->arg = arg; - LDAP_STAILQ_INSERT_HEAD( &rq->task_list, entry, tnext ); + entry = (struct re_s *) LDAP_CALLOC( 1, sizeof( struct re_s )); + if ( entry ) { + entry->interval.tv_sec = interval; + entry->interval.tv_usec = 0; + entry->next_sched.tv_sec = time( NULL ); + entry->next_sched.tv_usec = 0; + entry->routine = routine; + entry->arg = arg; + entry->tname = tname; + entry->tspec = tspec; + LDAP_STAILQ_INSERT_HEAD( &rq->task_list, entry, tnext ); + } + return entry; +} + +struct re_s * +ldap_pvt_runqueue_find( + struct runqueue_s *rq, + ldap_pvt_thread_start_t *routine, + void *arg +) +{ + struct re_s* e; + + LDAP_STAILQ_FOREACH( e, &rq->task_list, tnext ) { + if ( e->routine == routine && e->arg == arg ) + return e; + } + return NULL; } void @@ -49,28 +89,26 @@ ldap_pvt_runqueue_remove( break; } - assert ( e == entry ); + assert( e == entry ); LDAP_STAILQ_REMOVE( &rq->task_list, entry, re_s, tnext ); - ch_free( entry ); - + LDAP_FREE( entry ); } struct re_s* ldap_pvt_runqueue_next_sched( struct runqueue_s* rq, - struct timeval** next_run + struct timeval* next_run ) { struct re_s* entry; entry = LDAP_STAILQ_FIRST( &rq->task_list ); - if ( entry == NULL ) { - *next_run = NULL; + if ( entry == NULL || entry->next_sched.tv_sec == 0 ) { return NULL; } else { - *next_run = &entry->next_sched; + *next_run = entry->next_sched; return entry; } } @@ -81,7 +119,7 @@ ldap_pvt_runqueue_runtask( struct re_s* entry ) { - LDAP_STAILQ_INSERT_HEAD( &rq->run_list, entry, rnext ); + LDAP_STAILQ_INSERT_TAIL( &rq->run_list, entry, rnext ); } void @@ -112,7 +150,8 @@ ldap_pvt_runqueue_isrunning( void ldap_pvt_runqueue_resched( struct runqueue_s* rq, - struct re_s* entry + struct re_s* entry, + int defer ) { struct re_s* prev; @@ -127,22 +166,56 @@ ldap_pvt_runqueue_resched( LDAP_STAILQ_REMOVE( &rq->task_list, entry, re_s, tnext ); - entry->next_sched.tv_sec = time( NULL ) + entry->interval.tv_sec; + if ( !defer ) { + entry->next_sched.tv_sec = time( NULL ) + entry->interval.tv_sec; + } else { + entry->next_sched.tv_sec = 0; + } + if ( LDAP_STAILQ_EMPTY( &rq->task_list )) { LDAP_STAILQ_INSERT_HEAD( &rq->task_list, entry, tnext ); + } else if ( entry->next_sched.tv_sec == 0 ) { + LDAP_STAILQ_INSERT_TAIL( &rq->task_list, entry, tnext ); } else { prev = NULL; LDAP_STAILQ_FOREACH( e, &rq->task_list, tnext ) { - if ( e->next_sched.tv_sec > entry->next_sched.tv_sec ) { + if ( e->next_sched.tv_sec == 0 ) { + if ( prev == NULL ) { + LDAP_STAILQ_INSERT_HEAD( &rq->task_list, entry, tnext ); + } else { + LDAP_STAILQ_INSERT_AFTER( &rq->task_list, prev, entry, tnext ); + } + return; + } else if ( e->next_sched.tv_sec > entry->next_sched.tv_sec ) { if ( prev == NULL ) { LDAP_STAILQ_INSERT_HEAD( &rq->task_list, entry, tnext ); } else { LDAP_STAILQ_INSERT_AFTER( &rq->task_list, prev, entry, tnext ); } + return; } prev = e; } + LDAP_STAILQ_INSERT_TAIL( &rq->task_list, entry, tnext ); + } +} + +int +ldap_pvt_runqueue_persistent_backload( + struct runqueue_s* rq +) +{ + struct re_s* e; + int count = 0; + + ldap_pvt_thread_mutex_lock( &rq->rq_mutex ); + if ( !LDAP_STAILQ_EMPTY( &rq->task_list )) { + LDAP_STAILQ_FOREACH( e, &rq->task_list, tnext ) { + if ( e->next_sched.tv_sec == 0 ) + count++; + } } + ldap_pvt_thread_mutex_unlock( &rq->rq_mutex ); + return count; } -#endif