use weak list
This commit is contained in:
parent
ef2a08540a
commit
a440b8785b
|
@ -18,6 +18,8 @@
|
||||||
(define *object-table*
|
(define *object-table*
|
||||||
(make-value-weak-table))
|
(make-value-weak-table))
|
||||||
|
|
||||||
|
;;; ldap session as a fluid
|
||||||
|
|
||||||
(define $current-ldap-session (make-fluid #f))
|
(define $current-ldap-session (make-fluid #f))
|
||||||
|
|
||||||
(define (current-ldap-session)
|
(define (current-ldap-session)
|
||||||
|
@ -26,20 +28,32 @@
|
||||||
(define (with-ldap-session session thunk)
|
(define (with-ldap-session session thunk)
|
||||||
(let-fluid $current-ldap-session session thunk))
|
(let-fluid $current-ldap-session session thunk))
|
||||||
|
|
||||||
|
;;; free ldap session handles
|
||||||
|
|
||||||
(import-lambda-definition ldap-session-free
|
(import-lambda-definition ldap-session-free
|
||||||
(session)
|
(session)
|
||||||
"scsh_ldap_memfree")
|
"scsh_ldap_memfree")
|
||||||
|
|
||||||
|
(define (ldap-session-finalizer-free session)
|
||||||
|
(ddisplay 'ldap-session-finalizer-free session)
|
||||||
|
(remove-from-weak-table! *object-table*
|
||||||
|
(ldap-session-c-pointer session))
|
||||||
|
(ldap-session-free session))
|
||||||
|
|
||||||
(define (ldap-session-finalizer session)
|
(define (ldap-session-finalizer session)
|
||||||
(ddisplay "FREE ldap-session " session)
|
(ddisplay 'ldap-session-finalizer session)
|
||||||
(if (ldap-session-bound? session)
|
(if (ldap-session-bound? session)
|
||||||
(if (not (ldap-session-implicit-unbind-ok? session))
|
(if (not (ldap-session-implicit-unbind-ok? session))
|
||||||
(raise (condition
|
(raise (condition
|
||||||
(&ldap-implicit-unbind (code #f) (session session))))
|
(&ldap-implicit-unbind (code #f) (session session))))
|
||||||
(if (ldap-session-auto-unbind? session)
|
(if (ldap-session-auto-unbind? session)
|
||||||
(ldap-unbind session))))
|
(ldap-unbind session))))
|
||||||
(remove-from-weak-table! *object-table* (ldap-session-c-pointer session))
|
(ldap-session-weak-list-filter! session)
|
||||||
(ldap-session-free session))
|
(if (null? (ldap-session-weak-list session))
|
||||||
|
(add-finalizer! session ldap-session-finalizer-free)
|
||||||
|
(add-finalizer! session ldap-session-finalizer)))
|
||||||
|
|
||||||
|
;;; ldap init
|
||||||
|
|
||||||
(import-lambda-definition ldap-init-internal
|
(import-lambda-definition ldap-init-internal
|
||||||
(host port)
|
(host port)
|
||||||
|
@ -62,6 +76,7 @@
|
||||||
(add-finalizer! session ldap-session-finalizer)
|
(add-finalizer! session ldap-session-finalizer)
|
||||||
(set-ldap-session-bound?! session #f)
|
(set-ldap-session-bound?! session #f)
|
||||||
(set-ldap-session-options! session options)
|
(set-ldap-session-options! session options)
|
||||||
|
(set-ldap-session-weak-list! session '())
|
||||||
session))))
|
session))))
|
||||||
|
|
||||||
;;; SIMPLE_BIND_S
|
;;; SIMPLE_BIND_S
|
||||||
|
@ -169,6 +184,7 @@
|
||||||
(begin
|
(begin
|
||||||
(ddisplay "ldap-search new object " message)
|
(ddisplay "ldap-search new object " message)
|
||||||
(add-to-weak-table! *object-table* pointer message)
|
(add-to-weak-table! *object-table* pointer message)
|
||||||
|
(ldap-session-weak-list-add! session message)
|
||||||
(set-ldap-message-session! message session)
|
(set-ldap-message-session! message session)
|
||||||
(set-ldap-message-result! message #f)
|
(set-ldap-message-result! message #f)
|
||||||
(add-finalizer! message ldap-message-freeing-finalizer)
|
(add-finalizer! message ldap-message-freeing-finalizer)
|
||||||
|
@ -234,6 +250,7 @@
|
||||||
(or (lookup-in-weak-table *object-table* pointer)
|
(or (lookup-in-weak-table *object-table* pointer)
|
||||||
(begin
|
(begin
|
||||||
(add-to-weak-table! *object-table* pointer new-message)
|
(add-to-weak-table! *object-table* pointer new-message)
|
||||||
|
(ldap-session-weak-list-add! session new-message)
|
||||||
(set-ldap-message-session! new-message session)
|
(set-ldap-message-session! new-message session)
|
||||||
(add-finalizer! new-message ldap-message-freeing-finalizer)
|
(add-finalizer! new-message ldap-message-freeing-finalizer)
|
||||||
new-message)))))
|
new-message)))))
|
||||||
|
@ -254,6 +271,7 @@
|
||||||
(or (lookup-in-weak-table *object-table* pointer)
|
(or (lookup-in-weak-table *object-table* pointer)
|
||||||
(begin
|
(begin
|
||||||
(add-to-weak-table! *object-table* pointer new-message)
|
(add-to-weak-table! *object-table* pointer new-message)
|
||||||
|
(ldap-session-weak-list-add! session new-message)
|
||||||
(set-ldap-message-session! new-message session)
|
(set-ldap-message-session! new-message session)
|
||||||
(add-finalizer! new-message ldap-message-freeing-finalizer)
|
(add-finalizer! new-message ldap-message-freeing-finalizer)
|
||||||
new-message)))))
|
new-message)))))
|
||||||
|
@ -334,6 +352,7 @@
|
||||||
(values attribute-name be)))
|
(values attribute-name be)))
|
||||||
(else
|
(else
|
||||||
(ddisplay "NEW ber-element (ldap-first-attribute) " ber-element)
|
(ddisplay "NEW ber-element (ldap-first-attribute) " ber-element)
|
||||||
|
(ldap-session-weak-list-add! session ber-element)
|
||||||
(add-finalizer! ber-element ber-element-finalizer)
|
(add-finalizer! ber-element ber-element-finalizer)
|
||||||
(values attribute-name ber-element)))
|
(values attribute-name ber-element)))
|
||||||
(raise-ldap-condition
|
(raise-ldap-condition
|
||||||
|
@ -481,6 +500,7 @@
|
||||||
(ddisplay "NEW object (ldap-first-entry) result "
|
(ddisplay "NEW object (ldap-first-entry) result "
|
||||||
result " new-message " new-message)
|
result " new-message " new-message)
|
||||||
(add-to-weak-table! *object-table* pointer new-message)
|
(add-to-weak-table! *object-table* pointer new-message)
|
||||||
|
(ldap-session-weak-list-add! session new-message)
|
||||||
(set-ldap-message-session! new-message session)
|
(set-ldap-message-session! new-message session)
|
||||||
(set-ldap-message-result! new-message result)
|
(set-ldap-message-result! new-message result)
|
||||||
(add-finalizer! new-message ldap-message-unregister-object)
|
(add-finalizer! new-message ldap-message-unregister-object)
|
||||||
|
@ -504,6 +524,7 @@
|
||||||
;; don't add a finalizer in this case, because
|
;; don't add a finalizer in this case, because
|
||||||
;; libldap will free the memory itself.
|
;; libldap will free the memory itself.
|
||||||
(add-to-weak-table! *object-table* pointer new-message)
|
(add-to-weak-table! *object-table* pointer new-message)
|
||||||
|
(ldap-session-weak-list-add! session new-message)
|
||||||
(set-ldap-message-session! new-message session)
|
(set-ldap-message-session! new-message session)
|
||||||
(set-ldap-message-result! new-message (ldap-message-result entry))
|
(set-ldap-message-result! new-message (ldap-message-result entry))
|
||||||
(add-finalizer! new-message ldap-message-unregister-object)
|
(add-finalizer! new-message ldap-message-unregister-object)
|
||||||
|
@ -540,6 +561,7 @@
|
||||||
((ldap-first-reference-internal session message)
|
((ldap-first-reference-internal session message)
|
||||||
=> (lambda (new-message)
|
=> (lambda (new-message)
|
||||||
(add-finalizer! new-message ldap-message-freeing-finalizer)
|
(add-finalizer! new-message ldap-message-freeing-finalizer)
|
||||||
|
(ldap-session-weak-list-add! session new-message)
|
||||||
new-message))
|
new-message))
|
||||||
(else
|
(else
|
||||||
(let ((ret-obj (ldap-get-error-return-object session)))
|
(let ((ret-obj (ldap-get-error-return-object session)))
|
||||||
|
@ -553,6 +575,7 @@
|
||||||
((ldap-next-reference-internal session message)
|
((ldap-next-reference-internal session message)
|
||||||
=> (lambda (new-message)
|
=> (lambda (new-message)
|
||||||
(add-finalizer! new-message ldap-message-freeing-finalizer)
|
(add-finalizer! new-message ldap-message-freeing-finalizer)
|
||||||
|
(ldap-session-weak-list-add! session new-message)
|
||||||
new-message))
|
new-message))
|
||||||
(else
|
(else
|
||||||
(let ((ret-obj (ldap-get-error-return-object session)))
|
(let ((ret-obj (ldap-get-error-return-object session)))
|
||||||
|
|
Loading…
Reference in New Issue