X-Git-Url: http://git.kpe.io/?a=blobdiff_plain;f=clsql-oracle%2Falien-resources.cl;fp=clsql-oracle%2Falien-resources.cl;h=57d50bab5afdf4319ed72b39f5ddc87827f26dd4;hb=6141152b9819fc7fc9fed8eaf60d5aaa461f8463;hp=0000000000000000000000000000000000000000;hpb=42a951e9f7152e7c145958f4dfed41d4e865c9fd;p=clsql.git diff --git a/clsql-oracle/alien-resources.cl b/clsql-oracle/alien-resources.cl new file mode 100644 index 0000000..57d50ba --- /dev/null +++ b/clsql-oracle/alien-resources.cl @@ -0,0 +1,57 @@ +;;; -*- Mode: Lisp -*- +;;; $Id: alien-resources.cl,v 1.1 2002/08/01 03:06:26 kevin Exp $ + +;;; This is copyrighted software. See documentation for terms. +;;; +;;; oracle-sql.lisp --- SQL-Interface implementation for Oracle +;;; +;;; derived from postgresql.lisp + +(in-package :clsql-oracle) + +(declaim (optimize (speed 3) + (debug 1))) + +(defparameter *alien-resource-hash* (make-hash-table :test #'equal)) + +(defun %get-resource (type sizeof) + (let ((resources (gethash type *alien-resource-hash*))) + (car (member-if + #'(lambda (res) + (and (= (alien-resource-sizeof res) sizeof) + (not (alien-resource-in-use res)))) + resources)))) + +(defun %insert-alien-resource (type res) + (let ((resource (gethash type *alien-resource-hash*))) + (setf (gethash type *alien-resource-hash*) + (cons res (gethash type *alien-resource-hash*))))) + +(defmacro acquire-alien-resource (type &optional size) + `(let ((res (%get-resource ',type ,size))) + (unless res + (setf res (make-alien-resource + :type ',type :sizeof ,size + :buffer (make-alien ,type ,size))) + (%insert-alien-resource ',type res)) + (claim-alien-resource res))) + +(defstruct (alien-resource) + (type (error "Missing TYPE.") + :read-only t) + (sizeof (error "Missing SIZEOF.") + :read-only t) + (buffer (error "Missing BUFFER.") + :read-only t) + (in-use nil :type boolean)) + +(defun free-alien-resource (ares) + (setf (alien-resource-in-use ares) nil) + ares) + +(defun claim-alien-resource (ares) + (setf (alien-resource-in-use ares) t) + ares) + + +