This is the sento Reference Manual, version 3.4.0, generated automatically by Declt version 4.0 beta 2 "William Riker" on Sun Dec 15 05:00:32 2024 GMT+0.
sento/sento.asd
sento/src/atomic/atomic-api.lisp
sento/src/atomic/atomic.lisp
sento/src/config.lisp
sento/src/wheel-timer.lisp
sento/src/timeutils.lisp
sento/src/miscutils.lisp
sento/src/fcomputation.lisp
sento/src/dispatcher-api.lisp
sento/src/queue/queue.lisp
sento/src/queue/queue-locked.lisp
sento/src/mbox/message-box.lisp
sento/src/actor-cell.lisp
sento/src/actor-api.lisp
sento/src/eventstream-api.lisp
sento/src/actor-system-api.lisp
sento/src/actor-context-api.lisp
sento/src/fasync-completed.lisp
sento/src/actor.lisp
sento/src/agent.lisp
sento/src/eventstream.lisp
sento/src/fsm.lisp
sento/src/tasks.lisp
sento/src/router.lisp
sento/src/stash.lisp
sento/src/dispatcher.lisp
sento/src/actor-context.lisp
sento/src/actor-system.lisp
sento/src/agent-usecase/agent-usecase-commons.lisp
sento/src/agent-usecase/hash-agent.lisp
sento/src/agent-usecase/array-agent.lisp
sento/src/package.lisp
sento.config
sento.dispatcher
sento.timeutils
sento.queue
sento.wheel-timer
sento.async-future
sento.messageb
sento.stash
sento.atomic
sento.agent.array
sento.user
sento.agent.hash
sento.router
sento.miscutils
sento.agent.usecase-commons
sento.future
sento.actor-system
sento.eventstream
sento.tasks
sento.fsm
sento.actor-cell
sento.actor
sento.actor-context
sento.agent
The main system appears first, followed by any subsystem dependency.
sento
Actor framework featuring actors and agents for easy access to state and asynchronous operations.
Manfred Bergmann
Apache-2
3.4.0
alexandria
(system).
log4cl
(system).
bordeaux-threads
(system).
cl-speedy-queue
(system).
str
(system).
blackbird
(system).
binding-arrows
(system).
timer-wheel
(system).
local-time-duration
(system).
atomics
(system).
src
(module).
Modules are listed depth-first from the system components tree.
sento/src
sento
(system).
atomic
(module).
config.lisp
(file).
wheel-timer.lisp
(file).
timeutils.lisp
(file).
miscutils.lisp
(file).
fcomputation.lisp
(file).
dispatcher-api.lisp
(file).
queue
(module).
mbox
(module).
actor-cell.lisp
(file).
actor-api.lisp
(file).
eventstream-api.lisp
(file).
actor-system-api.lisp
(file).
actor-context-api.lisp
(file).
fasync-completed.lisp
(file).
actor.lisp
(file).
agent.lisp
(file).
eventstream.lisp
(file).
fsm.lisp
(file).
tasks.lisp
(file).
router.lisp
(file).
stash.lisp
(file).
dispatcher.lisp
(file).
actor-context.lisp
(file).
actor-system.lisp
(file).
agent-usecase
(module).
package.lisp
(file).
sento/src/atomic
src
(module).
atomic-api.lisp
(file).
atomic.lisp
(file).
sento/src/queue
dispatcher-api.lisp
(file).
src
(module).
queue.lisp
(file).
queue-locked.lisp
(file).
sento/src/mbox
queue
(module).
src
(module).
message-box.lisp
(file).
sento/src/agent-usecase
actor-system.lisp
(file).
src
(module).
agent-usecase-commons.lisp
(file).
hash-agent.lisp
(file).
array-agent.lisp
(file).
Files are sorted by type and then listed depth-first from the systems components trees.
sento/sento.asd
sento/src/atomic/atomic-api.lisp
sento/src/atomic/atomic.lisp
sento/src/config.lisp
sento/src/wheel-timer.lisp
sento/src/timeutils.lisp
sento/src/miscutils.lisp
sento/src/fcomputation.lisp
sento/src/dispatcher-api.lisp
sento/src/queue/queue.lisp
sento/src/queue/queue-locked.lisp
sento/src/mbox/message-box.lisp
sento/src/actor-cell.lisp
sento/src/actor-api.lisp
sento/src/eventstream-api.lisp
sento/src/actor-system-api.lisp
sento/src/actor-context-api.lisp
sento/src/fasync-completed.lisp
sento/src/actor.lisp
sento/src/agent.lisp
sento/src/eventstream.lisp
sento/src/fsm.lisp
sento/src/tasks.lisp
sento/src/router.lisp
sento/src/stash.lisp
sento/src/dispatcher.lisp
sento/src/actor-context.lisp
sento/src/actor-system.lisp
sento/src/agent-usecase/agent-usecase-commons.lisp
sento/src/agent-usecase/hash-agent.lisp
sento/src/agent-usecase/array-agent.lisp
sento/src/package.lisp
sento/src/atomic/atomic-api.lisp
atomic
(module).
atomic-cas
(generic function).
atomic-get
(generic function).
atomic-swap
(generic function).
sento/src/atomic/atomic.lisp
atomic
(module).
atomic-cas
(method).
atomic-cas
(method).
atomic-get
(method).
atomic-get
(method).
atomic-swap
(method).
atomic-swap
(method).
make-atomic-integer
(function).
make-atomic-reference
(function).
print-object
(method).
print-object
(method).
%make-atomic-integer
(function).
%make-atomic-reference
(function).
*the-int*
(special variable).
*the-ref*
(special variable).
atomic-integer
(structure).
atomic-integer-cell
(reader).
(setf atomic-integer-cell)
(writer).
atomic-integer-p
(function).
atomic-place
(macro).
atomic-reference
(structure).
atomic-reference-cell
(reader).
(setf atomic-reference-cell)
(writer).
atomic-reference-p
(function).
copy-atomic-integer
(function).
copy-atomic-reference
(function).
sento/src/config.lisp
atomic
(module).
src
(module).
config-from
(function).
merge-config
(function).
retrieve-keys
(function).
retrieve-section
(function).
retrieve-value
(function).
%merge-config
(function).
sento/src/wheel-timer.lisp
config.lisp
(file).
src
(module).
cancel
(function).
make-wheel-timer
(function).
print-object
(method).
schedule-once
(function).
schedule-recurring
(function).
shutdown-wheel-timer
(function).
wheel-timer
(class).
timer-hash
(reader method).
(setf timer-hash)
(writer method).
wheel
(reader method).
(setf wheel)
(writer method).
sento/src/timeutils.lisp
wheel-timer.lisp
(file).
src
(module).
ask-timeout
(condition).
cause
(reader method).
get-current-millis
(function).
make-timer
(function).
wait-cond
(function).
with-waitfor
(macro).
wait-time
(reader method).
sento/src/miscutils.lisp
timeutils.lisp
(file).
src
(module).
assert-cond
(function).
await-cond
(macro).
collect-backtrace
(function).
filter
(function).
mkstr
(function).
sento/src/fcomputation.lisp
miscutils.lisp
(file).
src
(module).
complete-p
(function).
error-p
(function).
fawait
(function).
fcompleted
(macro).
fmap
(macro).
frecover
(macro).
fresult
(function).
future
(class).
futurep
(function).
make-future
(function).
print-object
(method).
with-fut
(macro).
with-fut-resolve
(macro).
%fcompleted
(function).
%fmap
(function).
make-future-plain
(function).
sento/src/dispatcher-api.lisp
fcomputation.lisp
(file).
src
(module).
dispatch
(generic function).
dispatch-async
(generic function).
stop
(generic function).
workers
(generic function).
sento/src/queue/queue.lisp
queue
(module).
emptyq-p
(generic function).
initialize-instance
(method).
popq
(generic function).
pushq
(generic function).
queue-bounded
(class).
queue-full-error
(condition).
queued-count
(generic function).
queue
(reader method).
queue-base
(class).
sento/src/queue/queue-locked.lisp
queue
(module).
emptyq-p
(method).
popq
(method).
pushq
(method).
queue-unbounded
(class).
copy-queue
(function).
dequeue
(function).
emptyp
(function).
enqueue
(function).
make-queue
(function).
queue
(structure).
queue-head
(reader).
(setf queue-head)
(writer).
queue-p
(function).
queue-tail
(reader).
(setf queue-tail)
(writer).
sento/src/mbox/message-box.lisp
mbox
(module).
initialize-instance
(method).
initialize-instance
(method).
initialize-instance
(method).
message-box/bt
(class).
message-box/dp
(class).
print-object
(method).
stop
(generic function).
submit
(generic function).
call-handler-fun
(function).
copy-message-item/bt
(function).
copy-message-item/dp
(function).
dispatch/noreply
(function).
dispatch/reply
(function).
dispatch/reply/no-timeout
(function).
dispatch/reply/timeout
(function).
dispatcher
(reader method).
dispatcher-exec-fun
(function).
handle-popped-item
(function).
make-message-item/bt
(function).
make-message-item/dp
(function).
max-queue-size
(reader method).
message-box-base
(class).
message-item/bt
(structure).
message-item/bt-cancelled-p
(reader).
(setf message-item/bt-cancelled-p)
(writer).
message-item/bt-handler-fun-args
(reader).
(setf message-item/bt-handler-fun-args)
(writer).
message-item/bt-handler-result
(reader).
(setf message-item/bt-handler-result)
(writer).
message-item/bt-message
(reader).
(setf message-item/bt-message)
(writer).
message-item/bt-p
(function).
message-item/bt-time-out
(reader).
(setf message-item/bt-time-out)
(writer).
message-item/bt-withreply-cvar
(reader).
(setf message-item/bt-withreply-cvar)
(writer).
message-item/bt-withreply-lock
(reader).
(setf message-item/bt-withreply-lock)
(writer).
message-item/bt-withreply-p
(reader).
(setf message-item/bt-withreply-p)
(writer).
message-item/dp
(structure).
message-item/dp-cancelled-p
(reader).
(setf message-item/dp-cancelled-p)
(writer).
message-item/dp-handler-fun-args
(reader).
(setf message-item/dp-handler-fun-args)
(writer).
message-item/dp-handler-result
(reader).
(setf message-item/dp-handler-result)
(writer).
message-item/dp-message
(reader).
(setf message-item/dp-message)
(writer).
message-item/dp-p
(function).
message-item/dp-time-out
(reader).
(setf message-item/dp-time-out)
(writer).
message-processing-loop
(function).
name
(reader method).
pop-queue-and-process
(function).
process-queue-item
(function).
submit/no-reply
(function).
submit/reply
(function).
wait-and-probe-for-msg-handler-result
(function).
sento/src/actor-cell.lisp
mbox
(module).
src
(module).
*self*
(special variable).
*sender*
(special variable).
*state*
(special variable).
actor-cell
(class).
call
(function).
cast
(function).
handle-call
(generic function).
handle-cast
(generic function).
initialize-instance
(method).
msgbox
(reader method).
(setf msgbox)
(writer method).
name
(reader method).
print-object
(method).
running-p
(function).
state
(reader method).
stop
(generic function).
actor-cell-state
(structure).
actor-cell-state-p
(function).
actor-cell-state-running
(reader).
(setf actor-cell-state-running)
(writer).
copy-actor-cell-state
(function).
handle-message
(function).
handle-message-internal
(function).
handle-message-user
(function).
make-actor-cell-state
(function).
submit-message
(function).
with-sender
(macro).
sento/src/actor-api.lisp
actor-cell.lisp
(file).
src
(module).
actor
(class).
after-stop
(generic function).
ask
(generic function).
ask-s
(generic function).
become
(generic function).
context
(generic reader).
(setf context)
(writer method).
make-actor
(generic function).
path
(generic function).
pre-start
(generic function).
tell
(generic function).
unbecome
(generic function).
unwatch
(generic function).
watch
(generic function).
watchers
(generic reader).
receive
(reader method).
sento/src/eventstream-api.lisp
actor-api.lisp
(file).
src
(module).
publish
(generic function).
subscribe
(generic function).
unsubscribe
(generic function).
sento/src/actor-system-api.lisp
eventstream-api.lisp
(file).
src
(module).
*default-config*
(special variable).
sento/src/actor-context-api.lisp
actor-system-api.lisp
(file).
src
(module).
actor-name-exists
(condition).
actor-of
(generic function).
all-actors
(generic function).
find-actors
(generic function).
notify
(generic function).
shutdown
(generic function).
stop
(generic function).
name
(reader method).
sento/src/fasync-completed.lisp
actor-context-api.lisp
(file).
src
(module).
fasync-completed
(macro).
sento/src/actor.lisp
fasync-completed.lisp
(file).
src
(module).
*self*
(symbol macro).
*sender*
(symbol macro).
*state*
(symbol macro).
actor-of
(method).
after-stop
(method).
all-actors
(method).
ask
(method).
ask-s
(method).
become
(method).
find-actors
(method).
handle-call
(method).
handle-cast
(method).
make-actor
(method).
path
(method).
pre-start
(method).
print-object
(method).
publish
(method).
reply
(function).
stop
(method).
subscribe
(method).
system
(method).
tell
(method).
unbecome
(method).
unsubscribe
(method).
unwatch
(method).
watch
(method).
async-waitor-actor
(class).
finalize-initialization
(function).
name
(method).
notify-watchers-about-stop
(function).
stop-children
(function).
with-waiting-actor
(macro).
sento/src/agent.lisp
actor.lisp
(file).
src
(module).
agent
(class).
agent-get
(function).
agent-get-quick
(function).
agent-stop
(function).
agent-update
(function).
agent-update-and-get
(function).
make-agent
(function).
receive
(function).
sento/src/eventstream.lisp
agent.lisp
(file).
src
(module).
eventstream
(class).
make-eventstream
(function).
publish
(method).
subscribe
(method).
unsubscribe
(method).
ev-receive
(function).
subscribers
(reader method).
subscribers-for
(function).
sento/src/fsm.lisp
eventstream.lisp
(file).
src
(module).
*event-data*
(special variable).
*next-state-data*
(special variable).
*received-event*
(special variable).
*state-data*
(special variable).
fsm
(class).
goto-state
(macro).
make-fsm
(function).
on-event
(macro).
on-transition
(macro).
stay-on-state
(macro).
when-state
(macro).
when-unhandled
(macro).
%receive
(function).
%setup-timeouts
(function).
*current-state*
(special variable).
*event-was-handled-by-goto*
(special variable).
*event-was-handled-by-stay*
(special variable).
copy-fsm-state
(function).
event-handling-fun
(reader method).
fsm-state
(structure).
fsm-state-data
(reader).
(setf fsm-state-data)
(writer).
fsm-state-p
(function).
fsm-state-state
(reader).
(setf fsm-state-state)
(writer).
make-fsm-state
(function).
timeouts
(reader method).
sento/src/tasks.lisp
fsm.lisp
(file).
src
(module).
*task-context*
(special variable).
*task-dispatcher*
(special variable).
task
(class).
task-async
(function).
task-async-stream
(function).
task-await
(function).
task-shutdown
(function).
task-start
(function).
task-yield
(function).
with-context
(macro).
make-task
(function).
sento/src/router.lisp
tasks.lisp
(file).
src
(module).
add-routee
(function).
ask
(method).
ask-s
(method).
make-router
(function).
routees
(function).
router
(class).
stop
(function).
strategy-fun
(reader method).
tell
(method).
get-strategy-fun
(function).
get-strategy-index
(function).
make-random-strategy
(function).
make-round-robin-strategy
(function).
sento/src/stash.lisp
router.lisp
(file).
src
(module).
has-stashed-messages-p
(function).
stash
(function).
stashing
(class).
unstash-all
(function).
stashed-messages
(reader method).
sento/src/dispatcher.lisp
stash.lisp
(file).
src
(module).
dispatch
(method).
dispatch-async
(method).
dispatch-worker
(class).
dispatcher-base
(class).
identifier
(reader method).
initialize-instance
(method).
make-dispatcher
(function).
make-dispatcher-worker
(function).
print-object
(method).
shared-dispatcher
(class).
stop
(method).
workers
(method).
receive
(function).
sento/src/actor-context.lisp
dispatcher.lisp
(file).
src
(module).
actor-context
(class).
actor-of
(method).
all-actors
(method).
find-actors
(method).
id
(reader method).
make-actor-context
(function).
notify
(method).
shutdown
(method).
stop
(method).
system
(reader method).
%actor-of
(function).
%add-actor
(function).
%create-actor
(function).
%find-actor-by-name
(function).
%find-actors
(function).
%get-shared-dispatcher
(function).
%message-box-for-dispatcher-id
(function).
%remove-actor
(function).
%verify-actor
(function).
actors
(method).
sento/src/actor-system.lisp
actor-context.lisp
(file).
src
(module).
actor-of
(method).
actor-system
(class).
all-actors
(method).
dispatchers
(reader method).
evstream
(reader method).
find-actors
(method).
initialize-instance
(method).
make-actor-system
(function).
print-object
(method).
publish
(method).
register-dispatcher
(function).
register-new-dispatcher
(function).
scheduler
(reader method).
shutdown
(method).
stop
(method).
subscribe
(method).
unsubscribe
(method).
%actor-of
(function).
%all-actors
(function).
%find-actors
(function).
%get-dispatcher-config
(function).
%get-eventstream-config
(function).
%get-scheduler-config
(function).
%get-timeout-timer-config
(function).
%register-config
(function).
%register-dispatchers
(function).
%register-eventstream
(function).
%register-scheduler
(function).
%register-timeout-timer
(function).
actor-context-for-key
(function).
config
(reader method).
(setf config)
(writer method).
internal-actor-context
(reader method).
timeout-timer
(reader method).
user-actor-context
(reader method).
sento/src/agent-usecase/agent-usecase-commons.lisp
agent-usecase
(module).
make-model
(function).
model
(structure).
model-err-fun
(reader).
(setf model-err-fun)
(writer).
model-object
(reader).
(setf model-object)
(writer).
with-get-handler
(macro).
with-update-handler
(macro).
copy-model
(function).
model-p
(function).
sento/src/agent-usecase/hash-agent.lisp
agent-usecase
(module).
agent-clrhash
(function).
agent-dohash
(function).
(setf agent-gethash)
(setf expander).
agent-gethash
(function).
agent-remhash
(function).
make-hash-agent
(function).
agent-puthash
(function).
sento/src/agent-usecase/array-agent.lisp
agent-usecase
(module).
agent-delete
(function).
agent-doarray
(function).
(setf agent-elt)
(setf expander).
agent-elt
(function).
agent-pop
(function).
agent-push
(function).
agent-push-and-getidx
(function).
make-array-agent
(function).
agent-set
(function).
sento/src/package.lisp
agent-usecase
(module).
src
(module).
Packages are listed by definition order.
sento.config
sento.dispatcher
sento.timeutils
sento.queue
sento.wheel-timer
sento.async-future
sento.messageb
sento.stash
sento.atomic
sento.agent.array
sento.user
sento.agent.hash
sento.router
sento.miscutils
sento.agent.usecase-commons
sento.future
sento.actor-system
sento.eventstream
sento.tasks
sento.fsm
sento.actor-cell
sento.actor
sento.actor-context
sento.agent
sento.config
config
common-lisp
.
config-from
(function).
merge-config
(function).
retrieve-keys
(function).
retrieve-section
(function).
retrieve-value
(function).
%merge-config
(function).
sento.dispatcher
disp
common-lisp
.
dispatch
(generic function).
dispatch-async
(generic function).
dispatch-worker
(class).
dispatcher-base
(class).
identifier
(generic reader).
make-dispatcher
(function).
make-dispatcher-worker
(function).
shared-dispatcher
(class).
stop
(generic function).
workers
(generic function).
receive
(function).
sento.timeutils
timeutils
common-lisp
.
ask-timeout
(condition).
cause
(generic reader).
get-current-millis
(function).
make-timer
(function).
wait-cond
(function).
with-waitfor
(macro).
wait-time
(generic reader).
sento.queue
queue
common-lisp
.
emptyq-p
(generic function).
popq
(generic function).
pushq
(generic function).
queue-bounded
(class).
queue-full-error
(condition).
queue-unbounded
(class).
queued-count
(generic function).
copy-queue
(function).
dequeue
(function).
emptyp
(function).
enqueue
(function).
make-queue
(function).
queue
(generic reader).
queue
(structure).
queue-base
(class).
queue-head
(reader).
(setf queue-head)
(writer).
queue-p
(function).
queue-tail
(reader).
(setf queue-tail)
(writer).
sento.wheel-timer
wt
common-lisp
.
cancel
(function).
make-wheel-timer
(function).
schedule-once
(function).
schedule-recurring
(function).
shutdown-wheel-timer
(function).
wheel-timer
(class).
timer-hash
(generic reader).
(setf timer-hash)
(generic writer).
wheel
(generic reader).
(setf wheel)
(generic writer).
sento.async-future
async-future
common-lisp
.
sento.future
.
fasync-completed
(macro).
sento.messageb
mesgb
common-lisp
.
sento.queue
.
message-box/bt
(class).
message-box/dp
(class).
stop
(generic function).
submit
(generic function).
call-handler-fun
(function).
copy-message-item/bt
(function).
copy-message-item/dp
(function).
dispatch/noreply
(function).
dispatch/reply
(function).
dispatch/reply/no-timeout
(function).
dispatch/reply/timeout
(function).
dispatcher
(generic reader).
dispatcher-exec-fun
(function).
handle-popped-item
(function).
make-message-item/bt
(function).
make-message-item/dp
(function).
max-queue-size
(generic reader).
message-box-base
(class).
message-item/bt
(structure).
message-item/bt-cancelled-p
(reader).
(setf message-item/bt-cancelled-p)
(writer).
message-item/bt-handler-fun-args
(reader).
(setf message-item/bt-handler-fun-args)
(writer).
message-item/bt-handler-result
(reader).
(setf message-item/bt-handler-result)
(writer).
message-item/bt-message
(reader).
(setf message-item/bt-message)
(writer).
message-item/bt-p
(function).
message-item/bt-time-out
(reader).
(setf message-item/bt-time-out)
(writer).
message-item/bt-withreply-cvar
(reader).
(setf message-item/bt-withreply-cvar)
(writer).
message-item/bt-withreply-lock
(reader).
(setf message-item/bt-withreply-lock)
(writer).
message-item/bt-withreply-p
(reader).
(setf message-item/bt-withreply-p)
(writer).
message-item/dp
(structure).
message-item/dp-cancelled-p
(reader).
(setf message-item/dp-cancelled-p)
(writer).
message-item/dp-handler-fun-args
(reader).
(setf message-item/dp-handler-fun-args)
(writer).
message-item/dp-handler-result
(reader).
(setf message-item/dp-handler-result)
(writer).
message-item/dp-message
(reader).
(setf message-item/dp-message)
(writer).
message-item/dp-p
(function).
message-item/dp-time-out
(reader).
(setf message-item/dp-time-out)
(writer).
message-processing-loop
(function).
name
(generic reader).
pop-queue-and-process
(function).
process-queue-item
(function).
submit/no-reply
(function).
submit/reply
(function).
wait-and-probe-for-msg-handler-result
(function).
sento.stash
stash
common-lisp
.
has-stashed-messages-p
(function).
stash
(function).
stashing
(class).
unstash-all
(function).
stashed-messages
(generic reader).
sento.atomic
atomic
common-lisp
.
atomic-cas
(generic function).
atomic-get
(generic function).
atomic-swap
(generic function).
make-atomic-integer
(function).
make-atomic-reference
(function).
%make-atomic-integer
(function).
%make-atomic-reference
(function).
*the-int*
(special variable).
*the-ref*
(special variable).
atomic-integer
(structure).
atomic-integer-cell
(reader).
(setf atomic-integer-cell)
(writer).
atomic-integer-p
(function).
atomic-place
(macro).
atomic-reference
(structure).
atomic-reference-cell
(reader).
(setf atomic-reference-cell)
(writer).
atomic-reference-p
(function).
copy-atomic-integer
(function).
copy-atomic-reference
(function).
sento.agent.array
agtarray
common-lisp
.
sento.agent.usecase-commons
.
agent-delete
(function).
agent-doarray
(function).
(setf agent-elt)
(setf expander).
agent-elt
(function).
agent-pop
(function).
agent-push
(function).
agent-push-and-getidx
(function).
make-array-agent
(function).
agent-set
(function).
sento.agent.hash
agthash
common-lisp
.
sento.agent.usecase-commons
.
agent-clrhash
(function).
agent-dohash
(function).
(setf agent-gethash)
(setf expander).
agent-gethash
(function).
agent-remhash
(function).
make-hash-agent
(function).
agent-puthash
(function).
sento.router
router
common-lisp
.
add-routee
(function).
make-router
(function).
routees
(function).
router
(class).
stop
(function).
strategy-fun
(generic reader).
get-strategy-fun
(function).
get-strategy-index
(function).
make-random-strategy
(function).
make-round-robin-strategy
(function).
sento.miscutils
miscutils
common-lisp
.
assert-cond
(function).
await-cond
(macro).
collect-backtrace
(function).
filter
(function).
mkstr
(function).
sento.agent.usecase-commons
agent.usecase-commons
common-lisp
.
make-model
(function).
model
(structure).
model-err-fun
(reader).
(setf model-err-fun)
(writer).
model-object
(reader).
(setf model-object)
(writer).
with-get-handler
(macro).
with-update-handler
(macro).
copy-model
(function).
model-p
(function).
sento.future
future
blackbird
.
common-lisp
.
complete-p
(function).
error-p
(function).
fawait
(function).
fcompleted
(macro).
fmap
(macro).
frecover
(macro).
fresult
(function).
future
(class).
futurep
(function).
make-future
(function).
with-fut
(macro).
with-fut-resolve
(macro).
%fcompleted
(function).
%fmap
(function).
make-future-plain
(function).
sento.actor-system
asys
common-lisp
.
*default-config*
(special variable).
actor-system
(class).
dispatchers
(generic reader).
evstream
(generic reader).
make-actor-system
(function).
register-dispatcher
(function).
register-new-dispatcher
(function).
scheduler
(generic reader).
%actor-of
(function).
%all-actors
(function).
%find-actors
(function).
%get-dispatcher-config
(function).
%get-eventstream-config
(function).
%get-scheduler-config
(function).
%get-timeout-timer-config
(function).
%register-config
(function).
%register-dispatchers
(function).
%register-eventstream
(function).
%register-scheduler
(function).
%register-timeout-timer
(function).
actor-context-for-key
(function).
config
(generic reader).
(setf config)
(generic writer).
internal-actor-context
(generic reader).
timeout-timer
(generic reader).
user-actor-context
(generic reader).
sento.eventstream
ev
common-lisp
.
eventstream
(class).
make-eventstream
(function).
publish
(generic function).
subscribe
(generic function).
unsubscribe
(generic function).
ev-receive
(function).
subscribers
(generic reader).
subscribers-for
(function).
sento.tasks
tasks
common-lisp
.
*task-context*
(special variable).
*task-dispatcher*
(special variable).
task
(class).
task-async
(function).
task-async-stream
(function).
task-await
(function).
task-shutdown
(function).
task-start
(function).
task-yield
(function).
with-context
(macro).
make-task
(function).
sento.fsm
fsm
common-lisp
.
sento.actor
.
*event-data*
(special variable).
*next-state-data*
(special variable).
*received-event*
(special variable).
*state-data*
(special variable).
fsm
(class).
goto-state
(macro).
make-fsm
(function).
on-event
(macro).
on-transition
(macro).
stay-on-state
(macro).
when-state
(macro).
when-unhandled
(macro).
%receive
(function).
%setup-timeouts
(function).
*current-state*
(special variable).
*event-was-handled-by-goto*
(special variable).
*event-was-handled-by-stay*
(special variable).
copy-fsm-state
(function).
event-handling-fun
(generic reader).
fsm-state
(structure).
fsm-state-data
(reader).
(setf fsm-state-data)
(writer).
fsm-state-p
(function).
fsm-state-state
(reader).
(setf fsm-state-state)
(writer).
make-fsm-state
(function).
timeouts
(generic reader).
sento.actor-cell
act-cell
common-lisp
.
*self*
(special variable).
*sender*
(special variable).
*state*
(special variable).
actor-cell
(class).
call
(function).
cast
(function).
handle-call
(generic function).
handle-cast
(generic function).
msgbox
(generic reader).
(setf msgbox)
(generic writer).
name
(generic reader).
running-p
(function).
state
(generic reader).
stop
(generic function).
actor-cell-state
(structure).
actor-cell-state-p
(function).
actor-cell-state-running
(reader).
(setf actor-cell-state-running)
(writer).
copy-actor-cell-state
(function).
handle-message
(function).
handle-message-internal
(function).
handle-message-user
(function).
make-actor-cell-state
(function).
submit-message
(function).
with-sender
(macro).
sento.actor
act
common-lisp
.
!
(generic function).
*self*
(symbol macro).
*sender*
(symbol macro).
*state*
(symbol macro).
?
(generic function).
actor
(class).
after-stop
(generic function).
ask
(generic function).
ask-s
(generic function).
become
(generic function).
context
(generic reader).
(setf context)
(generic writer).
make-actor
(generic function).
path
(generic function).
pre-start
(generic function).
reply
(function).
tell
(generic function).
unbecome
(generic function).
unwatch
(generic function).
watch
(generic function).
watchers
(generic reader).
async-waitor-actor
(class).
finalize-initialization
(function).
name
(generic function).
notify-watchers-about-stop
(function).
receive
(generic reader).
stop-children
(function).
with-waiting-actor
(macro).
sento.actor-context
ac
common-lisp
.
actor-context
(class).
actor-name-exists
(condition).
actor-of
(generic function).
all-actors
(generic function).
find-actors
(generic function).
id
(generic reader).
make-actor-context
(function).
notify
(generic function).
shutdown
(generic function).
stop
(generic function).
system
(generic function).
%actor-of
(function).
%add-actor
(function).
%create-actor
(function).
%find-actor-by-name
(function).
%find-actors
(function).
%get-shared-dispatcher
(function).
%message-box-for-dispatcher-id
(function).
%remove-actor
(function).
%verify-actor
(function).
actors
(generic function).
name
(generic reader).
sento.agent
agt
common-lisp
.
sento.actor
.
agent
(class).
agent-get
(function).
agent-get-quick
(function).
agent-stop
(function).
agent-update
(function).
agent-update-and-get
(function).
make-agent
(function).
receive
(function).
Definitions are sorted by export status, category, package, and then by lexicographic order.
The default config used when creating an ‘asys:actor-system‘.
The actor-system constructor allows to provide custom config options that override the default.
Dynamically binds event data when msg/event was sent with data (‘cons’)
Dynamically binds the next state data (‘on-transition’).
Effectively same as ‘*event-data*’ but should be used in different context.
Dynamically binds the received event (message).
The ’own’ actor instance. Dynamically bound and available upon calling ‘receive‘ function.
The ‘*sender*‘ is dynamically bound and available in ‘receive‘ function, when it is known.
The ’state’ of the actor. Dynamically bound and available in ‘receive‘ function.
Dynamically binds the current state data.
Optionally set this globally to use the API without using ‘with-context‘.
Optionally set a dispatcher id. Same applies here as for ‘*task-context*‘.
Awaits condition. Probes repeatedly.
If after ‘max-time’ condition is not ‘t’ it is considered failed.
Asynchronous future completion handler.
This work essentially the same as ‘future:fcompleted‘ except that the completion function executes in a different execution context.
The ’execution-context’ is a dispatcher (‘disp:dispatcher‘) registered in ‘asys:actor-system‘.
It is here identified using ‘dispatcher-id‘ (the defailt dispatcher identifier is ‘:shared‘).
The additional parameter ‘context‘ can be the actor-system itself, an ‘ac:actor-context‘ or an ‘act:actor‘ instance.
If the completion handler should execute on the caller thread, then ‘future:fcompleted‘ should be used.
If the ‘future‘ is already complete then the ‘body‘ executes immediately.
‘result‘ represents the future result.
‘body‘ is executed when future completed.
Returns the future.
Example:
“‘
(fasync-completed (with-fut (sleep .5) 1) asys :shared
(result)
(format t "Future result ~a~%" result))
“‘
Completion handler on the given ‘future‘.
If the ‘future‘ is already complete then the ‘body‘ executes immediately.
‘result‘ represents the future result.
‘body‘ is executed when future completed.
Returns the future.
Notes on execution context:
By calling ‘fcompleted‘ a completion function is installed on the ‘future‘.
If the ‘future‘s execute function is not delaying or called by the same thread as the one calling ‘fcompleted‘,
then ‘body‘ is called by the callers thread.
If, however, the ‘future‘ is delaying and doing computation in another thread and later also resolving the ‘future‘ in that thread (this depends on how the ‘future‘ is defined), then the ‘body‘ form is executed by the thread that is resolving the ‘future‘.
Example:
“‘
(fcompleted (with-fut
(sleep .5)
1)
(result)
(format t "Future result ~a~%" result))
“‘
‘fmap‘ maps a future.
‘future‘ is the future that is mapped.
‘result‘ is the result of the future when it completed.
‘body‘ is the form that executes when the future is completed. The result of ‘body‘ generates a new future.
Notes on execution context:
By calling ‘fmap‘ a mapping function is installed on the ‘future‘.
If the ‘future‘s execute function is not delaying or called by the same thread as the one calling ‘fmap‘,
then ‘body‘ is called by the callers thread.
If, however, the ‘future‘ is delaying and doing computation in another thread and later also resolving the ‘future‘ in that thread (this depends on how the ‘future‘ is defined), then the ‘body‘ form is executed by the thread that is resolving the ‘future‘.
Example:
“‘
(fmap (with-fut 0) (result)
(1+ result))
“‘
Catch errors in futures using ‘frecover‘
It works similar to ‘handler-case‘.
Example:
“‘
(fresult
(frecover
(-> (with-fut 0)
(fmap (value)
(declare (ignore value))
(error "foo")))
(fmap (value)
(+ value 1))))
(error (c) (format nil "~a" c))))
“‘
‘goto-state‘ Macro
The ‘goto-state‘ macro is used to transition the FSM (Finite State Machine) to a specified state, with optional data setting for the state model. This macro simplifies state management by providing a direct mechanism to switch states and update state-specific data.
**Parameters**
- ‘state‘: The target state to which the FSM should transition. This can be a symbol or any other datatype representing the state, consistent with the FSM’s state representation.
- ‘data‘: An optional parameter to set the data associated with the new state. This allows for updating the state model with relevant information during the transition.
**Description**
The ‘goto-state‘ macro facilitates explicit state transitions and optionally updates the state model’s data. It is typically invoked in response to specific conditions or events, allowing dynamic integration with other FSM constructs like ‘when-state‘ or ‘on-event‘.
**Usage Example**
“‘lisp
(when-state (’idle :test #’eq :timeout-s 5)
(on-event (’start)
(goto-state ’active ’("Session ID: 123"))
(perform-initialization)))
(when-state (’active :test #’eq)
(on-event (’stop)
(goto-state ’idle ’("Clean exit"))
(perform-cleanup)))
“‘
In this example:
- The FSM transitions to the ‘active‘ state with associated data ‘"Session ID: 123"‘ upon receiving a ‘start‘ event while in the ‘idle‘ state, executing ‘perform-initialization‘.
- It transitions back to the ‘idle‘ state with data ‘"Clean exit"‘ when the ‘stop‘ event occurs while the FSM is in the ‘active‘ state, executing ‘perform-cleanup‘.
**Notes**
- Ensure that ‘state‘ is valid within the FSM’s state space and that the transition complies with the FSM’s logic and rules.
- The ‘data‘ parameter is optional, but when used, should be structured appropriately to fit the state model’s requirements.
The ‘goto-state‘ macro, with its optional ‘data‘ capability, enhances flexibility and precision in managing FSM state transitions and data updates. Adjust the usage examples and structure to align with your FSM’s specific needs and design.
‘on-event‘ Macro
The ‘on-event‘ macro defines actions to be executed when specific events occur within an FSM (Finite State Machine). It is often used within the ‘when-state‘ macro to enable conditional execution based on state and optional timeout constraints.
**Parameters**
- ‘event‘: The event name or identifier to be monitored. This argument specifies which event should trigger the execution of the provided body.
- ‘:state-timeout‘: A tag indicating that the execution of this event’s actions is subject to the ‘:timeout-s‘ specified in a surrounding ‘when-state‘ macro.
- ‘body‘: One or more expressions representing the actions to be executed when the specified event occurs.
**Description**
The ‘on-event‘ macro facilitates event-driven actions within FSMs. When used within a ‘when-state‘ block and tagged with ‘:state-timeout‘, it ensures that the actions are executed within a specified time period after the event occurs, contingent on the current state of the FSM.
**Usage Example**
“‘lisp
(when-state (’active :test #’eq :timeout-s 10)
(on-event ’start :state-timeout
(start-activity))
(on-event ’stop
(stop-activity)))
“‘
In this example:
- The ‘start-activity‘ action is executed when the ‘start‘ event occurs, provided the FSM is in the ‘active‘ state within the 10-second timeout duration.
- The ‘stop-activity‘ is triggered by a ‘stop‘ event without timeout constraints.
**Notes**
- ‘:state-timeout‘ indicates that the timeout from ‘when-state‘ should apply to this event’s execution.
- Ensure the event detection mechanism within your FSM can recognize and handle the specified ‘event‘ argument.
Use ‘on-event‘ macros within ‘when-state‘ to manage event responses systematically and within time constraints defined for specific states. Adjust the actions and logic as necessary for your FSM’s behavior.
‘on-transition‘ Macro
The ‘on-transition‘ macro defines actions to be executed when a specific state transition occurs within an FSM (Finite State Machine). It uses customizable test functions to determine when a transition has taken place.
**Parameters**
- ‘transition‘: A cons cell or similar paired structure representing the transition, with the car as the starting state and the cdr as the destination state.
- ‘:test‘: A key parameter specifying the function used to compare states. Defaults to ‘#’eq‘, allowing for custom comparison logic if needed.
- ‘body‘: One or more expressions that are executed when the specified transition is detected.
**Description**
The ‘on-transition‘ macro provides a mechanism for executing specific actions when the FSM undergoes a particular state transition, as identified by changes in the state model from a starting to an ending state. This macro depends on events being handled by a state transition (‘goto-state‘), and uses test functions to match state values.
**Usage Example**
“‘lisp
(on-transition ((’idle . ’active) :test #’eq)
(log:info "Transitioned from idle to active")
(initialize-resources))
(on-transition ((’active . ’completed) :test #’eq)
(log:info "Transitioned from active to completed")
(cleanup-resources))
“‘
In these examples:
- The first block logs the transition from ‘idle‘ to ‘active‘ and performs resource initialization when this transition occurs.
- The second block logs the transition from ‘active‘ to ‘completed‘ and performs cleanup.
**Notes**
- ‘:test‘: Customize the comparison logic to fit the FSM’s state representations, especially if using complex or non-standard states.
- The macro relies on transitions being marked by the handling of events through ‘goto-state‘.
Utilize the ‘on-transition‘ macro to effectively manage and isolate logic specific to state transitions, ensuring that your FSM operates smoothly and predictably through defined state changes. Adjust the body of transitions to align with the goals and behavior of your FSM system.
‘stay-on-state‘ Macro
The ‘stay-on-state‘ macro is used to maintain the FSM (Finite State Machine) in its current state, with an option to update the state’s associated data. This is useful for situations where the state needs to persist while its data is updated.
**Parameters**
- ‘data‘: An optional parameter to update the data related to the current state. This allows for modifying the state model with new information without changing the state itself.
**Description**
The ‘stay-on-state‘ macro provides a way to remain in the current state of an FSM while updating any associated data. It can be used in reaction to specific events or conditions, maintaining state continuity while making data adjustments.
**Usage Example**
“‘lisp
(when-state (’processing :test #’eq)
(on-event (’update)
(stay-on-state ’("Progress: 50%"))
(log-update)))
(when-state (’processing :test #’eq)
(on-event (’complete)
(goto-state ’completed ’("Finished successfully"))))
“‘
In this example:
- The ‘stay-on-state‘ macro is used to remain in the ‘processing‘ state while updating the progress data to ‘"Progress: 50%"‘ upon an ‘update‘ event.
- Transition to the ‘completed‘ state occurs when the ‘complete‘ event is triggered, updating the state and its data.
**Notes**
- The ‘data‘ parameter is optional but should be structured to fit the requirements of the state model.
- Use this macro to ensure state persistence with updated data when necessary.
Integrate the ‘stay-on-state‘ macro into your FSM to handle cases where the state should remain unchanged but its data requires updates. Adjust examples as needed to fit your FSM system.
‘when-state‘ Macro
The ‘when-state‘ macro is used to conditionally execute a body of code when a defined condition on the FSM’s (Finite State Machine) current state is met, with support for custom predicates and timeout management for nested ‘on-event‘ macros.
**Parameters**
- ‘state‘: An arbitrary value or structure that represents the state to be checked against the FSM’s current state. The usage and type should align with the ‘:test‘ function.
- ‘:test‘: A predicate function used to evaluate if the FSM’s current state matches the ‘state‘ argument. The default is ‘#’eq‘, but can be customized with other functions or lambdas.
- ‘:timeout-s‘: An optional timeout in seconds that is applied to ‘on-event‘ macro calls tagged with ‘:state-timeout‘ within the body.
- ‘body‘: One or more forms, typically including ‘on-event‘ macro definitions, executed if the state condition is satisfied.
**Description**
‘when-state‘ enables dynamic state-based programming within FSMs, allowing for flexible condition evaluation with customizable predicate functions. It also manages execution timeouts for actions specified within nested ‘on-event‘ calls. The ‘:timeout-s‘ parameter, when used with the ‘:state-timeout‘ tag, ensures operations are constrained to a specified period.
**Usage Example**
“‘lisp
(when-state (’active :test #’eq :timeout-s 10)
(on-event (’start) :state-timeout
(start-activity))
(on-event (’stop)
(stop-activity)))
“‘
In this example:
- ‘start-activity‘ is executed if the current FSM state is exactly ‘’active‘, using ‘:test #’eq‘, within the 10-second window specified by ‘:timeout-s‘ and tagged with ‘:state-timeout‘.
- ‘stop-activity‘ runs upon receiving a ‘stop‘ event, without timeout constraints.
**Notes**
- Adjust the ‘:test‘ predicate to suit the structure and type of your ‘state‘ input as needed.
- ‘:timeout-s‘ specifies a duration within which tagged events should occur, integrating with the ‘on-event‘ macro.
- Ensure that each ‘on-event‘ is properly enclosed in parentheses, reflecting its syntax.
Use the appropriate predicate function to match the ‘state‘ argument’s format, ensuring meaningful and effective FSM operations.
‘when-unhandled‘ Macro
The ‘when-unhandled‘ macro defines actions to be executed when an event has not been handled by any prior ‘stay-on-state‘ or ‘goto-state‘ operations within an FSM (Finite State Machine).
**Parameters**
- ‘event‘: The event that should trigger the body if it remains unhandled by other mechanisms in the FSM.
- ‘:test‘: A key parameter specifying the function used to compare the received event with the specified event. Defaults to ‘#’eq‘, allowing for custom comparison logic.
- ‘body‘: One or more expressions to execute when the specified event is unhandled by ‘stay-on-state‘ or ‘goto-state‘ actions.
**Description**
The ‘when-unhandled‘ macro is designed to catch events that have not been processed by ‘stay-on-state‘ or ‘goto-state‘. It provides a fallback mechanism that ensures specific actions are taken for such unhandled events, using a specified test function to determine event equivalency.
**Usage Example**
“‘lisp
(when-unhandled (’start :test #’eq)
(log:error "Start event was unhandled")
(notify-admin))
(when-unhandled (’disconnect :test #’eq)
(log:warn "Unhandled disconnect event")
(attempt-reconnect))
“‘
In these examples:
- The first block logs an error and notifies an admin if the ‘start‘ event remains unhandled, using the default ‘#’eq‘ function for testing.
- The second block logs a warning and attempts to reconnect for an unhandled ‘disconnect‘ event, also using ‘#’eq‘.
**Notes**
- Utilize the ‘test‘ parameter to customize how events are determined as equivalent when necessary.
- ‘when-unhandled‘ is essential for capturing and managing scenarios where standard state transitions do not account for all event possibilities.
- Is it possible to use ‘goto-state‘ in ‘body‘.
Integrate the ‘when-unhandled‘ macro to ensure your FSM handles any unexpected or default cases robustly and flexibly. Adjust the body actions and events as needed for your specific requirements and FSM design.
‘with-context‘ creates an environment where the ‘tasks‘ package functions should be used in.
‘context‘ can be either an ‘asys:actor-system‘, an ‘ac:actor-context‘, or an ‘act:actor‘ (or subclass).
‘dispatcher‘ specifies the dispatcher where the tasks is executed in (like thread-pool).
The tasks created using the ‘tasks‘ functions will then be created in the given context.
Example:
“‘elisp
;; create actor-system
(defparameter *sys* (make-actor-system))
(with-context (*sys*)
(task-yield (lambda () (+ 1 1))))
=> 2 (2 bits, #x2, #o2, #b10)
“‘
Since the default ‘:shared‘ dispatcher should mainly be used for the message dispatching,
but not so much for longer running tasks it is possible to create an actor system with additional
dispatchers. This additional dispatcher can be utilized for ‘tasks‘. Be aware that the config as used below is merged with the ‘asys:*default-config*‘ which means that the dispatcher ‘:foo‘ here is really an additional dispatcher.
“‘
;; create actor-system with additional (custom) dispatcher
(defparameter *sys* (asys:make-actor-system ’(:dispatchers (:foo (:workers 16)))))
(with-context (*sys* :foo)
(task-yield (lambda () (+ 1 1))))
“‘
Convenience macro for creating a ‘future‘.
The ‘future‘ will be resolved with the result of the body form.
Convenience macro for creating a ‘future‘ that must be resolved manually via ‘fresolve‘.
This allows to spawn threads or other asynchronous operations as part of ‘body‘. However, you have to ‘resolve‘ the future eventually by applying a result on ‘resolve‘.
Example:
“‘
(with-fut-resolve
(bt2:make-thread
(lambda ()
(let ((result (do-some-lengthy-calculation)))
(fresolve result)))))
“‘
Spawns thread with timeout. Blocks until computation is done, or timeout elapsed.
agent-gethash
(function).
agent-puthash
(function).
Adds a routee/actor to the router.
Clears the hash-table. See ‘cl:clrhash‘.
Deletes item from array. Internally uses ‘delete‘. Returns ‘T‘.
- ‘item‘: the item to delete.
- ‘array-agent‘: the array agent instance.
- ‘delete-args‘: any arguments passed on to ‘delete‘.
’Do’ arbitrary atomic operation on the array.
- ‘fun‘: is a 1-arity function taking the array. This function can operate on the array without interference from other threads. The result of this function must be an array which will be the new agent state.
- ‘array-agent‘: is the ‘array-agent‘ instance.
The result of ‘agent-doarray‘ is ‘T‘.
’Do’ arbitrary atomic operation on the hash-table.
- ‘fun‘: is a 1-arity function taking the hash-table. This function can operate on the hash-table without interference from other threads. The result of this function must be a hash-table.
- ‘hash-agent‘: is the ‘hash-agent‘ instance.
The result of ‘agent-dohash‘ is ‘T‘.
Retrieves the value of the specified index of the array. ‘agent-elt‘ allows ‘setf‘ing like:
“‘
(setf (agent-elt 0 cut) 11)
“‘
- ‘index‘: the index to retrieve.
- ‘array-agent‘: the array agent instance.
In case of error ‘agent-elt‘ returns the error condition that ‘elt‘ raises.
The ‘setf‘ functionality will call ‘err-fun‘ on error if it has been configured.
Gets the current state of the ‘agent‘.
‘get-fun‘ must accept one parameter. That is the current-state of the ‘agent‘.
To return the current state ‘get-fun‘ may be just the ‘identity‘ function.
Gets the current state with bypassing the messaging.
If you need consistent results this function should not be used.
Retrieves value from hash-table, or ‘nil‘ if it doesn’t exist.
See ‘cl:gethash‘ for more info.
This supports setting a hash using ‘setf‘ in the same way as with ‘cl:hash-table‘.
Returns any raised condition or the value from ‘gethash‘.
Pops from array and returns the popped value. Internally uses ‘vector-pop‘, so the array must have a ‘fill-pointer‘. In case of error from using ‘vector-pop‘ the condition is returned.
- ‘array-agent‘: the array agent instance.
Pushes a value to the array/vector. Internally uses ‘vector-push-extend‘, so the array must have a ‘fill-pointer‘.
‘item‘: item to push.
‘array-agent‘: the array agent instance.
On error it will call ‘err-fun‘ with the raised condition, if ‘err-fun‘ has been configured.
Pushes ‘item‘ to the array. This function is similar to ‘agent-push‘ but returns the index of the pushed value similar as ‘vector-push‘ does. Therefore it is based on the somewhat slower ‘ask-s‘ actor pattern. So if you don’t care about the new index of the pushed item use ‘agent-push‘ instead. But this one is able to immediately return error conditions that may occur on ‘vector-push‘.
- ‘item‘: item to push.
- ‘array-agent‘: the array agent instance.
Delete a hash-table entry. See ‘cl:remhash‘. Returns ‘T‘ if entry existed, ‘NIL‘ otherwise.
Stops the message handling of the agent.
Updates the ‘agent‘ state.
‘update-fun‘ must accept one parameter. That is the current state of the ‘agent‘. The return value of ‘update-fun‘ will be taken as the new state of the ‘agent‘.
Updates the ‘agent‘ state.
‘update-fun‘ must accept one parameter. That is the current state of the ‘agent‘. The return value of ‘update-fun‘ will be taken as the new state of the ‘agent‘. This function makes the update and returns the new value.
Obsolete, use ‘await-cond’ instead.
Send a message to a actor-cell instance and wait for a result.
Specify a timeout in seconds if you require a result within a certain period of time.
Be aware though that this is a resource intensive wait based on a waiting thread.
The result can be of different types.
Normal result: the last expression of ‘handle-call‘ (or ‘receive‘ in ‘act:actor‘) implementation.
Error result: ‘(cons :handler-error <condition>)’
In case of time-out the error condition is a bt2:timeout.
Cancels a timer with the given signature ‘sig‘.
Sends a message to a actor-cell asynchronously. There is no result. If a ‘sender’ is specified the result will be sent to the sender.
Is ‘future‘ completed? Returns either ‘t‘ or ‘nil‘.
Parses the given config-string, represented by common lisp s-expressions.
The config is composed of plists in a hierarchy.
This function parses (run through ‘cl:read‘) the given config string.
The config string can be generated by:
“‘
(let ((*print-case* :downcase))
(prin1-to-string ’(defconfig
(:foo 1
:bar 2))))
“‘
Or just be given by reading from a file.
Notice the ’config’ s-expr must start with the root ‘car‘ ’defconfig’.
Is ‘future‘ errored? Returns either ‘t‘ or ‘nil‘.
Wait for the future ‘FUT‘ to be ready. Returns ‘VALUES‘ with ‘result’ of the future and ‘FUT’.
If the future is not ready after ‘TIMEOUT‘ seconds the ‘result’ is ‘NIL’.
The ‘SLEEP-TIME‘ parameter specifies the time to sleep between checks of the future.
The wait is based on attempts. To be accurate in terms of ‘TIMEOUT‘ the ‘SLEEP-TIME‘ should be a divisor of ‘TIMEOUT‘.
Disclaimer: naive implementation. There may be better solutions.
Get the computation result. If not yet available ‘:not-ready‘ is returned.
Checks if type of ‘object‘ is ‘future‘.
Are there any stashed messages?
Creates an ‘actor-context‘. Requires a reference to ‘actor-system‘
‘id‘ is an optional value that can identify the ‘actor-context‘.
Creating an actor-context manually is usually not needed.
An ‘asys:actor-system‘ implements the ‘actor-context‘ protocol.
An ‘act:actor‘ contains an ‘actor-context‘.
Creates an ‘actor-system‘.
Allows to provide an optional configuration. See ‘asys:*default-config*‘.
If no config is provided the default config is used.
Is a config provided then it is merged with the default config.
Config options in the existing config override the default config.
See ‘config:config-from‘.
Makes a new ‘agent‘ instance.
- ‘state-fun‘ is a function that takes no parameter and provides the initial state of the ‘agent‘ as return value.
- ‘actor-context‘: optionally specify an ‘asys:actor-system‘ as ‘ac:actor-context‘. If specified the agent will be registered in the system and destroyed with it should the ‘asys:actor-system‘ be destroyed. In addition the agent will use the systems shared message dispatcher and will _not_ create it’s own.
- ‘dispatcher-id‘: the dispatcher is configurable. Default is ‘:shared‘. But you may use also ‘:pinned‘ or a custom configured one. Be aware that ‘:shared‘ of a custom dispatcher only works if an ‘actor-context‘ was specified.
Creates an agent that wraps a CL array/vector.
- ‘context‘: something implementing ‘ac:actor-context‘ protocol like ‘asys:actor-system‘. Specifying ‘nil‘ here creates an agent outside of an actor system. The user has to take care of that himself.
- ‘initial-array‘: specify an initial array/vector.
- ‘error-fun‘: a 1-arrity function taking a condition that was raised.
Use this to get notified of error when using the update functions of the agent.
- ‘dispatcher-id‘: a dispatcher. defaults to ‘:shared‘.
Default constructor.
This creates a ‘disp:shared-dispatcher‘ with the given dispatcher config, see ‘asys:*default-config*‘.
Each worker is based on a ‘:pinned‘ actor meaning that it has its own thread.
Specify an ‘ac:actor-context‘ where actors needed in the dispatcher are created in.
Constructor for creating a worker.
‘num‘ only has the purpose to give the worker a name which includes a number.
‘dispatcher-ident is the dispatcher identifier.
Creating an eventstream is done by the ‘asys:actor-system‘ which is then available system wide.
But in theory it can be created individually by just passing an ‘ac:actor-context‘ (though I don’t know what would be the reason to create an eventstream for the context of a single actor. Maybe to address only a certain hierarchy in the actor tree.)
- ‘actor-context‘: the ‘ac:actor-context‘ where the eventstream actor should be created in.
- ‘config‘: is a plist with the ‘:dispatcher-id‘ key and a dispatcher id as value. Defaults to ‘:shared‘. This dispatcher type should be used by the actor.
‘make-fsm‘ Function
Creates a finite state machine (FSM) within the given ‘actor-context‘.
**Parameters**
- ‘actor-context‘: Can be an actor, an actor-context (class), or an actor-system in which this FSM is created.
- ‘name‘: A string representing the name of the FSM. Must be a string.
- ‘start-with‘: A cons cell where the car is the initial state and the cdr is the initial data for the FSM. Must be a cons.
- ‘event-handling‘: An optional function for handling events. It can be ‘nil‘ if not provided. Must be either a function or ‘nil‘. If omitted, the FSM will effectively do nothing. The function body should be constructed using the provided FSM-related macros such as ‘on-event‘ and ‘on-transition‘.
- ‘type‘: The type of actor to create. Defaults to ‘’fsm‘.
- ‘dispatcher-id‘: Identifies the dispatcher for the FSM. Defaults to ‘:shared‘.
**Description**
The ‘make-fsm‘ function initializes an FSM actor with a specified initial state and associated data. The FSM’s behavior is defined by the ‘event-handling‘ function, which processes events if provided. This function should utilize the provided macros like ‘on-event‘ and ‘on-transition‘ to structure its body, enabling robust event handling and state transition management. Without this function, the FSM will not perform any actions.
This function configures the FSM within the given ‘actor-context‘, ensuring it is properly set up according to the parameters specified through the ‘ac:actor-of‘ function.
Creates a future. ‘execute-fun‘ is the lambda that is executed when the future is created.
‘execute-fun‘ takes a parameter which is the ‘execute-fun‘ funtion. ‘execute-fun‘ function
takes the ‘promise‘ as parameter which is the computed value. Calling ‘execute-fun‘ with the promise
will fulfill the ‘future‘.
Manually calling ‘execute-fun‘ to fulfill the ‘future‘ is in contrast to just fulfill the ‘future‘ from a return value. The benefit of the ‘execute-fun‘ is flexibility. In a multi-threaded environment ‘execute-fun‘ could spawn a thread, in which case ‘execute-fun‘ would return immediately but no promise-value can be given at that time. The ‘execute-fun‘ can be called from a thread and provide the promise.
Create a future with:
“‘elisp
(make-future (lambda (execute-fun)
(let ((promise (delayed-computation)))
(bt2:make-thread (lambda ()
(sleep 0.5)
(funcall execute-fun promise))))))
“‘
Creates an agent that wraps a CL hash-table.
- ‘context‘: something implementing ‘ac:actor-context‘ protocol like ‘asys:actor-system‘. Specifying ‘nil‘ here creates an agent outside of an actor system. The user has to take care of that himself.
- ‘initial-hash-table‘: specify an initial hash-table.
- ‘error-fun‘: a 1-arrity function taking a condition that was raised.
Use this to get notified of error when using the update functions of the agent.
- ‘dispatcher-id‘: a dispatcher. defaults to ‘:shared‘.
Default constructor of router.
Built-in strategies: ‘:random‘, ‘:round-robin‘.
Specify your own strategy by providing a function that takes a ‘fixnum‘ as parameter which represents the number of routees and returns a ‘fixnum‘ that represents the index of the routee to choose.
Specify ‘routees‘ if you know them upfront.
Creates a new ‘wt:wheel-timer‘.
‘config‘ is a parameter for a list of key parameters including:
- ‘:resolution‘ the timer time resolution in milliseconds. 100 milliseconds is a good default.
- ‘:max-size‘ the number of timer slots this wheel should have.
Note that an ‘asys:actor-system‘ includes an instance as ‘asys:scheduler‘ that can be used within actors. But you can also create your own instance.
Merges config.
‘config‘ specifies a config that overrides what exists in ‘fallback-config‘.
‘fallback-config‘ is a default. If something doesn’t exist in ‘config‘ it is taken from ‘fallback-config‘.
Both ‘config‘ and ‘fallback-config‘ must be plists, or a ’config’ that was the output of ‘config-from‘.
Converts all parameters to string and concatenates them.
Registers a dispatcher to the actor-system.
- ‘system‘: the actor-system
- ‘dispatcher‘: the dispatcher instance.
Makes and registers a new dispatcher.
- ‘system‘: the actor-system
- ‘dispatcher-id‘: the dispatcher identifier. Usually a global symbol like ‘:foo‘
- ‘:workers‘: key argument for the number of workers.
- ‘:strategy‘: key argument for the dispatcher strategy (:random or :round-robin)
Replies to a sender. Sender must exist.
Use this from within receive function to reply to a sender.
Retrieves all section keys
Retrieves the given named section which should be a (global) ‘symbol‘ (a key).
A section usually is a plist with additional configs or sub sections.
This function looks only in the root hierarchy of the given config.
Retrieves the value for the given key and section.
Returns the routees as list.
Returns true if this server is running. ‘nil‘ otherwise.
Schedule a function execution once:
- ‘wheel-timer‘ is the ‘wt:wheel-timer‘ instance.
- ‘delay‘ is the number of seconds (float) delay when ‘timer-fun‘ should be executed.
- ‘timer-fun‘ is a 0-arity function that is executed after ‘delay‘. BEWARE: the function is executed in the timer thread. Make sure that you off-load long running tasks to other threads, or to a custom dispatcher (i.e. ‘tasks‘).
- ‘sig‘ is an optional symbol or string that is used to identify the timer and is used for ‘cancel‘.
- ‘reuse-sig‘ is a boolean that indicates whether the signature should be cleaned up after the timer has been executed.
Returns: signature (symbol) that represents the timer and can be used to cancel the timer.
Schedule a recurring function execution:
- ‘wheel-timer‘ is the ‘wt:wheel-timer‘ instance.
- ‘initial-delay‘ is the number of seconds (float) delay when ‘timer-fun‘ is executed the first time.
- ‘delay‘ is the number of seconds (float) delay when ‘timer-fun‘ should be executed.
- ‘timer-fun‘ is a 0-arity function that is executed after ‘delay‘. BEWARE: the function is executed in the timer thread. Make sure that you off-load long running tasks to other threads, or to a custom dispatcher (i.e. ‘tasks‘).
- ‘sig‘ is an optional symbol or string that is used to identify the timer and is used for ‘cancel-recurring‘.
Returns the signature that was either passed in via ‘sig‘ or a generated one.
The signature can be used to cancel the timer via ‘cancel-recurring‘.
Shuts down the wheel timer and free resources.
Stash ‘msg‘ for later unstash.
On stashing a message the actor should respond with: ‘(cons :no-reply state)‘
to avoid returning a response to sender (if given).
This function is expected to be run from within ’receive’ function.
Stops all routees.
‘task-async‘ schedules the function ‘fun‘ for asynchronous execution.
‘fun‘ must be a 0-arity function.
‘on-complete-fun‘ is a 1-arity completion handler function. When called the result is delivered.
The completion handler function parameter may also be a ‘(cons :handler-error condition)‘ construct in case an error happened within the message handling.
Be aware about the execution of the completion function:
The completion function is, by a very high chance, executed by the thread that executed ‘fun‘ function.
Only in very rare cases it could be possible that the completion function is executed by the caller of ‘task-async‘. See ‘future:fcompleted‘ for more info.
Using ‘task-async‘ provides two alternatives:
- together with ‘task-await‘
- or with completion handler
In fact it is possible to call ‘task-await‘ as well, but then you probably don’t need a completion handler.
Using the completion handler makes the processing complete asynchronous.
The result of ‘task-async‘ is a ‘task‘.
Store this ‘task‘ for a call to ‘task-async‘ (even with or without using ‘on-complete-fun‘).
When _not_ using ‘on-complete-fun‘ users must call either ‘task-await‘ or ‘task-shutdown‘ for the task to be cleaned up.
When using ‘on-complete-fun‘ this is done for you.
Example:
“‘elisp
;; create actor-system
(defparameter *sys* (make-actor-system))
(with-context (*sys*)
(let ((x (task-async (lambda () (some bigger computation))))
(y 1))
(+ (task-await x) y)))
;; use-case with ‘on-complete-fun‘
(defun my-task-completion (result)
(do-something-with result))
(with-context (*sys*)
(task-async (lambda () (some-bigger-computation))
:on-complete-fun #’my-task-completion))
“‘
‘task-async-stream‘ concurrently applies ‘fun‘ on all elements of ‘lst‘.
‘fun‘ must be a one-arity function taking an element of ‘lst‘.
The concurrency depends on the number of available ‘:shared‘ dispatcher workers.
Each element of ‘lst‘ is processed by a worker of the ‘asys:actor-system‘s ‘:shared‘ dispatcher.
If all workers are busy then the computation of ‘fun‘ is queued.
Example:
“‘elisp
;; create actor-system
(defparameter *sys* (make-actor-system))
(with-context (*sys*)
(->>
’(1 2 3 4 5)
(task-async-stream #’1+)
(reduce #’+)))
=> 20 (5 bits, #x14, #o24, #b10100)
“‘
‘task-await‘ waits (by blocking) until a result has been generated for a previous ‘task-async‘ by passing the ‘task‘ result of ‘task-async‘ to ‘task-await‘.
Specify ‘time-out‘ in seconds. If ‘task-await‘ times out a ‘(cons :handler-error ’ask-timeout)‘ will be returned.
‘task-await‘ also stops the ‘task‘ that is the result of ‘task-async‘, so it is of no further use.
‘task-shutdown‘ shuts down a task in order to clean up resources.
‘task-start‘ runs the given function ‘fun‘ asynchronously.
‘fun‘ must be a 0-arity function.
Use this if you don’t care about any response or result, i.e. for I/O side-effects.
It returns ‘(values :ok <task>)‘. ‘<task> is in fact an actor given back as reference.
The task is automatically stopped and removed from the context and will not be able to handle requests.
‘task-yield‘ runs the given function ‘fun‘ by blocking and waiting for a response from the ‘task‘, or until the given timeout was elapsed.
‘fun‘ must be a 0-arity function.
A normal response from the actor is passed back as the response value.
If the timeout elapsed the response is: ‘(values :handler-error miscutils:ask-timeout)‘.
Example:
“‘elisp
;; create actor-system
(defparameter *sys* (make-actor-system))
(with-context (*sys*)
(task-yield (lambda () (+ 1 1))))
=> 2 (2 bits, #x2, #o2, #b10)
“‘
Unstash all messages.
Messages are re-submitted to the actor in the order they were stashed.
Resubmitting means they are added to the end of the queue like any ordinary message would.
This function is expected to be run from within ’receive’ function.
Waits until ‘cond-fun’ is not ‘nil’ or ‘max-time’ elapsed. This blocks the calling thread.
Sends a message to the ‘actor‘. ‘tell‘ is asynchronous.
‘tell‘ does not expect a result. If a ‘sender‘ is specified the receiver will be able to send a response.
Alternatively to the ‘tell‘ function one can equally use the ‘!‘ function designator.
tell
.
Sends a message to the ‘actor‘. A ‘future‘ is returned.
Specify ‘timeout‘ if a message is to be expected after a certain time.
An ‘:handler-error‘ with ‘timeout‘ condition will be returned is the call timed out.
An ‘ask‘ is similar to a ‘ask-s‘ in that the caller gets back a result
but it doesn’t have to actively wait for it. Instead a ‘future‘ wraps the result.
However, the internal message handling is based on ‘tell‘.
How this works is that the message to the target ‘actor‘ is not ’sent’ using the callers thread but instead an anonymous ‘actor‘ is started behind the scenes. This anonymous actor can weit for a response from the target actor. The response then fulfills the future.
Alternatively to the ‘ask‘ function one can equally use the ‘?‘ function designator.
ask
.
Interface for creating an actor.
**!!! Attention:** this factory function wraps the ‘act:make-actor‘ functionality to something more simple to use.
Using this function there is no need to use both ‘act:make-actor‘.
‘context‘ is either an ‘asys:actor-system‘, an ‘ac:actor-context‘, or an ‘act:actor‘ (any type of actor).
The new actor is created in the given context.
- ‘:receive‘ is required and must be a 1-arity function where the arguments is received message object.
The function can be just a lambda like ‘(lambda (msg) ...)‘.
- ‘:init‘: is an optional initialization function with one argument: the actor instance (self).
This represents a ’start’ hook that is called after the actor was fully initialized.
- ‘:destroy‘: is an optional destroy function also with the actor instance as argument.
This function allows to unsubsribe from event-stream or such.
- ‘:state‘ key can be used to initialize with a state.
- ‘:dispatcher‘ key can be used to define the message dispatcher manually.
Options that are available by default are ‘:shared‘ (default) and ‘:pinned‘. When you defined a custom dispatcher it can be specified here.
- ‘:type‘ can specify a custom actor class. See ‘act:make-actor‘ for more info.
- ‘:name‘ to set a specific name to the actor, otherwise a random name will be used.
Additional options:
- ‘:queue-size‘ limits the message-box’s size. By default, it is unbounded.
actor-system
) &rest rest &key receive init destroy dispatcher state type name &allow-other-keys) ¶See ‘ac:actor-of‘
actor-context
) &rest rest &key receive init destroy dispatcher state type name queue-size &allow-other-keys) ¶See ‘ac:actor-of‘.
Generic function definition that is called after the actor has stopped, that is after the message box is stopped.
No more messages are being processed.
Under normal circumstances one would provide an ‘destroy‘ function at construction of the actor instead (see above). This generic function is more meant to create specialized actors by providing different implementations.
Retrieves all actors of this context as a list
actor-system
)) ¶See ‘ac:all-actors‘
actor-context
)) ¶See ‘ac:all-actors‘
Sends a message to the ‘actor‘. A ‘future‘ is returned.
Specify ‘timeout‘ if a message is to be expected after a certain time.
An ‘:handler-error‘ with ‘timeout‘ condition will be returned is the call timed out.
An ‘ask‘ is similar to a ‘ask-s‘ in that the caller gets back a result
but it doesn’t have to actively wait for it. Instead a ‘future‘ wraps the result.
However, the internal message handling is based on ‘tell‘.
How this works is that the message to the target ‘actor‘ is not ’sent’ using the callers thread but instead an anonymous ‘actor‘ is started behind the scenes. This anonymous actor can weit for a response from the target actor. The response then fulfills the future.
Alternatively to the ‘ask‘ function one can equally use the ‘?‘ function designator.
Sends a message to the ‘actor‘. ‘ask-s‘ is synchronous and waits for a result.
Specify ‘timeout‘ if a message is to be expected after a certain time.
An ‘:handler-error‘ with ‘timeout‘ condition will be returned if the call timed out.
‘ask-s‘ assumes, no matter if ‘ask-s‘ is issued from outside or inside an actor, that the response is delivered back to the caller. That’s why ‘ask-s‘ does block the execution until the result is available. The ‘receive‘ function return value will be used as the result of ‘receive‘.
Set ‘new‘ value. The current value must be ‘extented‘.
atomic-integer
) expected new) ¶atomic-reference
) old new) ¶Synonym for COMPARE-AND-SWAP.
Atomically store NEW in the cell slot of REF if OLD is eq to the current value of cell slot.
Return non-NIL if this atomic operaion succeeded, or return NIL if it failed.
Retrieve value from atomic object.
atomic-integer
)) ¶atomic-reference
)) ¶Update the the atomic object to the value returned by calling function ‘fn‘ with the previous value of the atomic object and ‘args‘.
atomic-integer
) fn &rest args) ¶atomic-reference
) fn &rest args) ¶Updates the cell value of REF atomically to the value returned by calling function FN with ARGS and the previous cell value of REF. The first argument of FN should be the previous cell value of REF.
Changes the receive of the actor to the given ‘new-behavior‘ function.
The ‘new-behavior‘ function must accept 3 parameters: the actor instance, the message and the current state.
This function should be called from within the behavior receive function.
ask-timeout
)) ¶This is the ‘actor-context‘ every actor is composed of.
When the actor is created from scratch it has no ‘actor-context‘.
When created through the ‘actor-context‘s, or system’s ‘actor-of‘ function an ‘actor-context‘ will be set.
Dispatches a function (‘dispatch-exec-fun‘) to a worker of the dispatcher to execute there. ‘dispatch‘ does a ‘ask-s‘ to a ‘dispatcher‘ worker, which means this call will block. The parameter ‘dispatcher-exec-fun‘ if of the form: ‘(list (function <something>))‘
shared-dispatcher
) dispatch-exec-fun-args) ¶Dispatches a function to a worker of the dispatcher to execute there. ‘dispatch-async‘ does a ‘tell‘ to a ‘dispatcher‘ worker and is asynchronous.
shared-dispatcher
) dispatch-exec-fun-args) ¶actor-system
)) ¶Internal API: contains a list of available message dispatchers.
Returns ‘T’ if there is no element in the queue.
queue-unbounded
)) ¶queue-bounded
)) ¶actor-system
)) ¶The system event stream. See ‘ev:eventstream‘ for more info.
Returns actors to be found by the criteria of:
- ‘context‘: an ‘AC:ACTOR-CONTEXT‘, or an ‘ACT:ACTOR‘ or an ‘ASYS:ACTOR-SYSTEM‘ as all three implement ‘find-actors‘.
- ‘path‘: a path designator to be found. This can be just an actor name, like ’foo’, then ‘find-actors‘ will only look in the given context for the actor. It can also be: ’foo/bar’, a relative path, in which case ‘find-actors‘ will traverse the path (here ’bar’ is a child of ’foo’) to the last context and will try to find the actor by name there, ’bar’ in this case. Also possible is a root path like ’/user/foo/bar’ which will start traversing contexts started from the root context, which is the actor-system.
- ‘test‘: a 2-arity test function where the 1st argument is the ‘path‘, the 2nd is the a result of the ‘key‘ function (which defaults to ‘ACT-CELL:NAME‘, so the name of the actor). The default function for ‘test‘ is ‘STRING=‘. However, in case of a multi-subpath ‘path‘ both ‘test‘ and ‘key‘ only apply to the last path component, which designates the actor name to be found.
- ‘key‘: a 1-arity function applied on an actor instance. Defaults to ‘ACT-CELL:NAME‘.
Depending on ‘test‘ function the last path component can be used as a wildcard when using a ‘test‘ function like ‘STR:STARTS-WITH-P‘ or ‘STR:CONTAINSP‘ for example.
actor-system
) path &key test key) ¶See ‘ac:find-actors‘
actor-context
) path &key test key) ¶See ‘ac:find-actors‘
Handles calls to the server. Must be implemented by subclasses.
The result of the last expression of this function is returned back to the ’caller’.
State of the cell can be changed via ‘setf‘ing ‘*state*‘ variable.
Handles casts to the server. Must be implemented by subclasses. State of the cell can be changed via ‘setf‘ing ‘*state*‘ variable.
actor-context
)) ¶The id of this actor-context. Usually a string.
id
.
dispatcher-base
)) ¶Returns the identifier of the dispatcher.
Constructs an ‘actor‘.
Arguments:
- ‘receive‘: message handling function taking one argument, the message.
- ‘name‘: give the actor a name. Must be unique within an ‘ac:actor-context‘.
- ‘type‘: Specify a custom actor class as the ‘:type‘ key. Defaults to ’actor.
Say you have a custom actor ‘custom-actor‘ and want ‘make-actor‘ create an instance of it.
Then specify ‘:type ’custom-actor‘ on ‘make-actor‘ function.
If you have additional initializations to make you can do so in ‘initialize-instance‘.
- ‘state‘: initialize an actor with a state. (default is ‘nil‘)
- ‘init‘ and ‘destroy‘: are functions that take one argument, the actor instance. Those hooks are called on (after) initialization and (after) stop respectively.
actor-cell
)) ¶actor-cell
)) ¶The ‘message-box‘. By default the ‘actor‘/‘actor-cell‘ has no message-box.
When the actor is created through the ‘actor-context‘ of an actor, or the ‘actor-system‘
then it will be populated with a message-box.
actor-cell
)) ¶The name of the actor/actor-cell. If no name is specified a default one is applied.
name
.
Notify the ‘actor-context‘ about something that happened to an actor.
Current exists:
- ‘:stopped‘: this will remove the actor from the context.
actor-context
) actor notification) ¶The path of the actor, including the actor itself.
The path denotes a tree which starts at the system context.
Pops the first element. Blocks until an element arrives.
queue-unbounded
)) ¶queue-bounded
)) ¶Generic function definition called after initialization but before messages are accepted.
An ‘ac:actor-context‘ is available at this point as well as ‘act:*state*‘ variable definition.
Under normal circumstances one would provide an ‘init‘ function at construction of the actor instead (see above). This generic function is more meant to create specialized actors by providing different implementations.
Publish an event/message to the eventstream. Subscribers may receive notification if they registered for the right message pattern.
actor-system
) message) ¶Convenience. Allows to publish to ‘ev:eventstream‘ by just providing the ‘asys:actor-system‘.
eventstream
) message) ¶Publish to ‘ev:eventstream‘.
Pushes an element to the queue.
queue-unbounded
) element) ¶queue-bounded
) element) ¶Returns the number of elements in the queue.
queue-bounded
)) ¶actor-system
)) ¶A general purpose scheduler that can be used by actors.
See ‘wt:wheel-timer‘ for more info.
The scheduler defaults to a resolution of 100 milliseconds and a maximum of 500 entries.
It is possible to disable the scheduler, i.e. to safe a thread resource, by setting the ‘:enabled‘ key to ‘:false‘ in the ‘:scheduler‘ section of the configuration.
Stops all actors in this context.
When the context is an ‘actor-context‘ this still stop the actor context and all its actors.
For the ‘actor-system‘ it will stop the whole system with all actors.
Specify ‘wait‘ as ‘T‘ to block until all actors of the context are stopped (default ‘NIL‘).
actor-system
) &key wait) ¶See ‘ac:shutdown‘
actor-context
) &key wait) ¶See ‘ac:shutdown‘
actor-cell
)) ¶The encapsulated state.
Stops the dispatcher. Stops all workers.
shared-dispatcher
)) ¶Stops the message processing.
The message processing is not terminated while a message is still processed.
Rather it is a graceful stop by waiting until a message has been processed.
Provide ‘wait‘ EQ ‘T‘ to wait until the actor cell is stopped.
message-box/dp
) &optional wait) ¶Stop the message processing.
This discards further message processing on queued messages.
The message currently being processed will be processed to the end.
The ‘wait‘ flag has no consequence for the ‘dispatcher‘ message-box.
message-box/bt
) &optional wait) ¶message-box-base
) &optional wait) ¶Stops the actor-cells message processing.
There are the following ways to stop an actor (cell).
1. by calling this function.
The actor will finish processing the current message.
All queued messages will be discarded.
No new messages will be accepted.
‘wait‘: waits until the cell is stopped (only applied to ‘:pinned‘ dispatcher).
2. by sending ‘:terminate‘ to actor.
This is effectively the same as calling ‘stop‘ method.
3. by sending ‘:stop‘ to the actor (cell).
This won’t allow to wait when the actor is stopped, even not with ‘ask-s‘.
The ‘:stop‘ message (symbol) is normally processed by the actors message processing.
The actor will not accept more messages.
actor
) &optional wait) ¶If this actor has an ‘actor-context‘, also stop all children.
In any case stop the actor-cell. See ‘actor-cell:stop‘ for more info on stopping.
actor-cell
) &optional wait) ¶Stops the given actor on the context.
The context may either be an ‘actor-context‘, or an ‘actor-system‘.
The actor is then also removed from the context.
Specify ‘wait‘ as ‘T‘ to block until the actor is stopped (default ‘NIL‘).
actor-system
) actor &key wait) ¶See ‘ac:stop‘
actor-context
) actor &key wait) ¶See ‘ac:stop‘
router
)) ¶The router strategy function.
The ‘strategy‘ is a function with a ‘fixnum‘ as input and a ‘fixnum‘ as output.
The input represents the number of routees.
The output represents the index of the routee to choose by calling the function.
Submit a message to the mailbox to be queued and handled.
‘handler-fun-args‘: list with first element the function designator and rest arguments.
message-box/dp
) message withreply-p time-out handler-fun-args) ¶Submitting a message on a multi-threaded ‘dispatcher‘ is different as submitting on a single threaded message-box. On a single threaded message-box the order of message processing is guaranteed even when submitting from multiple threads. On the ‘dispatcher‘ this is not the case. The order cannot be guaranteed when messages are processed by different ‘dispatcher‘ threads. However, we still guarantee a ’single-threadedness’ regarding the state of the actor. This is achieved here by protecting the ‘handler-fun-args‘ execution with a lock.
The ‘time-out‘ with the ’dispatcher mailbox’ assumes that the message received the dispatcher queue
and the handler in a reasonable amount of time, so that the effective time-out applies on the actual
handling of the message on the dispatcher queue thread.
Returns the handler-result if ‘withreply-p’ is eq to ‘T’, otherwise the return is just ‘T’ and is usually ignored.
message-box/bt
) message withreply-p time-out handler-fun-args) ¶The ‘handler-fun-args‘ argument must contain a handler function as first list item. It will be apply’ed with the rest of the args when the message was ’popped’ from queue.
Subscribe to the eventstream to receive notifications of certain events or event types.
‘subscriber‘ must be an actor (or agent).
The ‘pattern‘ can be:
- nil: receive all events posted to the eventstream.
- a type, class type: this allows to get notifications when an instance of this type, or class type is posted.
I.e. if you want to listen to all string messages posted to the ev, thewn subscribe to ‘’string‘.
Or if you want to listen to all lists, subscribe with ‘’cons‘.
- a symbol or global symbol: if posted message is a symbol or global symbol then the symbols are compared (‘eq‘).
- a string: in which case an exact string comparison is made for a string message that is posted to the eventstream (‘string=‘).
- a list: if subscription if for a list structure, and the posted message is also a list structure, then a structure comparison (‘equalp‘) is made.
actor-system
) (subscriber actor
) &optional pattern) ¶Convenience. Allows to subscribe to ‘ev:eventstream‘ by just providing the ‘asys:actor-system‘.
eventstream
) (subscriber actor
) &optional pattern) ¶Subscribe to ‘ev:eventstream‘.
actor-context
)) ¶A reference to the ‘actor-system‘.
Sends a message to the ‘actor‘. ‘tell‘ is asynchronous.
‘tell‘ does not expect a result. If a ‘sender‘ is specified the receiver will be able to send a response.
Alternatively to the ‘tell‘ function one can equally use the ‘!‘ function designator.
Reverts any behavior applied via ‘become‘ back to the default ‘receive‘ function. This function should be called from within the behavior receive function.
Unsubscribe from the eventstream. No more events will be received then.
actor-system
) (unsubscriber actor
)) ¶Convenience. Allows to unsubscribe to ‘ev:eventstream‘ by just providing the ‘asys:actor-system‘.
eventstream
) (unsubscriber actor
)) ¶Unsubscribe to ‘ev:eventstream‘.
Unregisters ‘watcher‘ of ‘actor‘.
Registers ‘watcher‘ as a watcher of ‘actor‘.
Watching lets the watcher know about lifecycle changes of the actor being watched.
I.e.: when it stopped. The message being sent in this case is: ‘(cons :stopped actor-instance)‘
Returns a list of watchers of ‘actor‘.
Returns the workers of this dispatcher.
But better do not touch them.
Only use the defined interface here to talk to them.
shared-dispatcher
)) ¶shared-dispatcher
) &key num-workers strategy) ¶queue-bounded
) &key) ¶message-box/bt
) &key) ¶message-box/dp
) &key) ¶message-box-base
) &key) ¶actor-system
) &key) ¶actor-cell
) &key) ¶shared-dispatcher
) stream) ¶wheel-timer
) stream) ¶message-box-base
) stream) ¶atomic-reference
) stream) ¶atomic-integer
) stream) ¶actor-system
) stream) ¶actor-cell
) stream) ¶error
.
name
.
serious-condition
.
(quote nil)
:wait-time
This slot is read-only.
error
.
This is the ‘actor‘ class.
The ‘actor‘ does its message handling using the ‘receive‘ function.
The ‘receive‘ function takes one argument (the message). For backwards compatibility and for convenience it can still be used to provide an immediate return for ‘act:ask-s‘. ‘act:tell‘ and ‘act:ask‘ ignore a return value.
There is asynchronous ‘tell‘, a synchronous ‘ask-s‘ and asynchronous ‘ask‘ which all can be used to send messages to the actor. ‘ask-s‘ provides a synchronous return taken from the ‘receive‘ functions return value. ’ask’ provides a return wrapped in a future. But the actor has to explicitly use ‘*sender*‘ to formulate a response. ‘tell‘ is just fire and forget.
To stop an actors message processing in order to cleanup resouces you should ‘tell‘ (or ‘ask-s‘) the ‘:stop‘ message. It will respond with ‘:stopped‘ (in case of ‘ask(-s)‘).
‘receive‘ is a function that has to take 1 parameter:
- ‘msg‘: the received message
The ‘sender‘ of the message (if available) accessible with ‘act:*sender*‘ from within the receive function or a behavior.
(error "'receive' must be specified!")
:receive
This slot is read-only.
Behavior function applied via ‘act:become‘ and reverted via ‘act:unbecome‘ ‘act:behavior‘ function takes the same parameters as ‘act:receive‘.
Init hook.
Function is called when actor was initialized.
‘act:context‘ is ready setup at that time.
Parameter of the lambda is the actor itself.
:init
Destroy hook.
Function is called when actor was stopped.
Parameter of the lambda is the actor itself.
:destroy
The ‘ac:actor-context‘
‘actor-cell‘ is the base of the ‘actor‘.
It encapsulates state and can executes async operations.
State can be changed by ‘setf‘ing ‘*state*‘ special variable from inside ‘receive‘ function, via calling ‘call‘ or ‘cast‘.
Where ‘call‘ is waiting for a result and ‘cast‘ does not.
For each ‘call‘ and ‘cast‘ handlers must be implemented by subclasses.
It uses a ‘message-box‘ to processes the received messages.
When the ‘actor‘/‘actor-cell‘ was created ad-hoc (out of the ‘actor-system‘/‘actor-context‘),
it will not have a message-box and can’t process messages.
When the ‘actor‘ is created through the ‘actor-system‘ or ‘actor-context‘,
one can decide what kind of message-box/dispatcher should be used for the new ‘actor‘.
See ‘actor-context‘ ‘actor-of‘ method for more information on this.
To stop an ‘actor‘ message handling and you can send the ‘:stop‘ message
either via ‘call‘ (which will respond with ‘:stopped‘) or ‘cast‘.
This is to cleanup thread resources when the actor is not needed anymore.
Note: the ‘actor-cell‘ uses ‘call‘ and ‘cast‘ functions which translate to ‘ask-s‘ and ‘tell‘ on the ‘actor‘.
The name of the actor/actor-cell. If no name is specified a default one is applied.
(string (gensym "actor-"))
:name
name
.
This slot is read-only.
The encapsulated state.
:state
This slot is read-only.
The internal state of the server.
(sento.actor-cell::make-actor-cell-state)
The ‘message-box‘. By default the ‘actor‘/‘actor-cell‘ has no message-box.
When the actor is created through the ‘actor-context‘ of an actor, or the ‘actor-system‘
then it will be populated with a message-box.
‘actor-context‘ deals with creating and maintaining actors.
The ‘actor-system‘ and the ‘actor‘ itself are composed of an ‘actor-context‘.
actor-of
.
actors
.
all-actors
.
find-actors
.
id
.
notify
.
shutdown
.
stop
.
system
.
The id of this actor-context. Usually a string.
:id
id
.
This slot is read-only.
A list of actors.
This is internal API. Use ‘all-actors‘ or ‘find-actors‘ instead.
(sento.atomic:make-atomic-reference :value (quote nil))
An ‘actor-system‘ is the opening facility. The first thing you do is to create an ‘actor-system‘ using the main constructor ‘make-actor-system‘. With the ‘actor-system‘ you can create actors via the ‘ac:actor-context‘ protocol function: ‘ac:actor-of‘.
Internal API: contains a list of available message dispatchers.
(quote nil)
This slot is read-only.
Internal API: the actor-system configuration.
(quote nil)
Internal API: an actor context reserved for agents/actors used by the system.
This slot is read-only.
Internal API: an actor context for agents/actors created by the user.
This slot is read-only.
Internal API: A wheel-timer used for timeouts to make timeouts less resource expensive.
This shouldn’t be used freely. It is used internally by the system to support ‘act:ask‘ timeouts.
This slot is read-only.
The system event stream. See ‘ev:eventstream‘ for more info.
This slot is read-only.
A general purpose scheduler that can be used by actors.
See ‘wt:wheel-timer‘ for more info.
The scheduler defaults to a resolution of 100 milliseconds and a maximum of 500 entries.
It is possible to disable the scheduler, i.e. to safe a thread resource, by setting the ‘:enabled‘ key to ‘:false‘ in the ‘:scheduler‘ section of the configuration.
This slot is read-only.
Specialized ‘actor‘ class called ‘agent‘.
It is meant primarily to encapsulate state.
To access state it provides ‘agent-get‘ and ‘agent-update‘ to update state.
Stop an agent with ‘agent-stop‘ to free resources (threads).
Specialized ‘actor‘ used as ‘worker‘ is the message ‘dispatcher‘.
A ‘dispatcher‘ contains a pool of ‘actors‘ that operate as workers where work is dispatched to. However, the workers are created in the given ‘ac:actor-context‘.
Eventstream facility allows to post/publish messages/events in the ‘asys:actor-system‘ and actors that did subscribe, to listen on those events.
The eventstream is driven by an actor. The processing of the sent events is guaranteed to be as they arrive.
Events can be posted as plain strings, as lists, or as objects of classes.
The subscriber has a variaty of options to define what to listen for.
For example: a subscriber wants to listen to events/messages with the string "Foo".
The subscriber is then only notified when events are posted with the exact same string.
See more information at the ‘ev:subscribe‘ function.
FSM Class
The FSM class represents a Finite State Machine, a mathematical model of computation that transitions between a finite number of states in response to external inputs.
:event-handling
This slot is read-only.
The wrapped [blackbird](https://orthecreedence.github.io/blackbird/) ‘promise‘, here called ‘future‘.
Not all features of blackbird’s ‘promise‘ are supported.
This ‘future‘ wrapper changes the terminology. A ‘future‘ is a delayed computation.
A ‘promise‘ is the fulfillment of the delayed computation.
blackbird-base
.
Bordeaux-Threads based message-box with a single thread operating on a message queue.
This is used when the actor is created using a ‘:pinned‘ dispatcher type.
There is a limit on the maximum number of actors/agents that can be created with
this kind of queue because each message-box (and with that each actor) requires exactly one thread.
The thread that pops queue items.
This message box is a message-box that uses the ‘system‘s ‘dispatcher‘.
This has the advantage that an almost unlimited actors/agents can be created.
This message-box doesn’t ’own’ a thread. It uses the ‘dispatcher‘ to handle the message processing.
The ‘dispatcher‘ is kind of like a thread pool.
Bounded queue.
Unbounded queue.
A router combines a pool of actors and implements the actor-api protocol.
So a ‘tell‘, ‘ask-s‘ and ‘ask‘ is delegated to one of the routers routees.
While a router implements parts of the actor protocol it doesn’t implement all.
I.e. a router cannot be ‘watch‘ed.
A router ‘strategy‘ defines how one of the actors is determined as the forwarding target of the message.
ask
.
ask-s
.
strategy-fun
.
tell
.
The routees.
(make-array 2 :adjustable t :fill-pointer 0)
The router strategy function.
The ‘strategy‘ is a function with a ‘fixnum‘ as input and a ‘fixnum‘ as output.
The input represents the number of routees.
The output represents the index of the routee to choose by calling the function.
:strategy-fun
This slot is read-only.
A shared dispatcher.
Internally it uses a ‘router:router‘ to drive the ‘dispatch-worker‘s.
The default strategy of choosing a worker is ‘:random‘.
A ‘shared-dispatcher‘ is automatically setup by an ‘asys:actor-system‘.
‘stashing‘ is a mixin class to ‘act:actor‘.
It can ’stash’ away arriving messages which should not be handled now, but later, after the actor is ’able’ to handle them. Create an actor class that can stash like this:
“‘
(defclass stash-actor (actor stashing) ())
“‘
Then create an actor by specifying this type:
“‘
(actor-of system
:type ’stash-actor
:receive (lambda (msg)
...))
“‘
For stash and unstash see function descriptions below.
The main use-case is for ‘act:tell‘ and ‘act:ask‘. ‘act:ask-s‘ will not work.
timeouts are ignored because it is not clear how long stashed messages will reside in stash.
However the ‘sender‘, if given (on ‘act:tell‘), is preserved.
Stash is an unbounded list.
Stash items are a tuple (alist) of ‘msg’ and ‘sender’.
(quote nil)
This slot is read-only.
A dedicated ‘act:actor‘ subclass used for tasks.
Wheel timer class
dynamically binds the current state
special var used for CAS
special var used for CAS
Private API to create system actors. Context-key is either ‘:internal‘ or ‘:user‘ Users should use ‘actor-of‘.
See ‘ac:actor-of‘
Private API to find actors in both contexts the actor-system supports. Users should use ‘ac:find-actors‘.
Creates a plist of dispatchers for the ‘:dispatchers‘ configuration section.
Checks certain things on the actor before it is attached to the context.
Internal
Internal for ‘setf‘.
cell
.
cell
.
‘handler-fun-args’ is a list with a function at ‘car’ and args as ‘cdr’.
‘message’ is prepended to args.
This is used to break the environment possibly captured as closure at ’submit’ stage.
Used by ‘ask’.
Returns just ‘T’. Return is actually ignore.
Used by ‘ask-s’ Returns ‘handler-result’.
Returns dispatcher result.
Waits for ‘handler-result’ or timeout and returns ‘handler-result’.
This function is effectively executed on a dispatcher actor.
It knows the message-box of the origin actor and acts on it.
It pops the message from the message-boxes queue and applies the function in ‘handler-fun-args‘ on it.
The ‘handler-fun-args’ is part of the message item.
Private API: finalize initialization of the actor with a ‘mesgb:message-box‘ and an ‘ac:actor-context‘.
This function is submitted as ‘handler-fun‘ to message-box.
A ‘:stop‘ message will response with ‘:stopping‘ and the user handlers are not called. Otherwise the result is ‘:resume‘ to resume user message handling.
The user defined message handler.
Effectively this calls the ‘handle-call‘ or ‘handle-cast‘ functions.
Handles the popped message. Means: applies the function in ‘handler-fun-args‘ on the message.
The default, built-in strategy: random.
Returns a let-over-lambda that implements a round-robin strategy.
The message processing loop.
This blocks until a new queue item arrived.
The ‘time-out’ handling in here is to make sure that handling of the
message is ’interrupted’ when the message was ’cancelled’.
This should happen in conjunction with the outer time-out in ‘submit/reply’.
This function sets the result as ‘handler-result’ in ‘item’. The return of this function is not relevant.
head
.
tail
.
The worker receive function.
This is the agents actor receive function implementation.
This rarely (if at all) needs to change because the agent is very specific.
Submitting a message.
In case of ‘withreply-p‘, the ‘response‘ is filled because submitting to the message-box is synchronous.
Otherwise submitting is asynchronous and ‘response‘ is just ‘t‘.
In case the actor-cell was stopped it will respond with just ‘:stopped‘.
In case no messge-box is configured this function respnds with ‘:no-message-handling‘.
This is quite efficient, no locking necessary.
If the message was submitted with timeout then the timeout plays no role here, the message is handled anyhow.
The submitting code has to await the side-effect and possibly handle a timeout.
This function has to provide a result and so it has to wait until the queue thread has processed the message. Processing of the queue item is done in ‘process-queue-item’.
actor-context
)) ¶actor-system
)) ¶actor-system
)) ¶Internal API: the actor-system configuration.
message-box/dp
)) ¶The dispatcher from the system.
actor-system
)) ¶Internal API: an actor context reserved for agents/actors used by the system.
message-box-base
)) ¶0 or nil will make an unbounded queue.
A value ‘> 0‘ will make a bounded queue.
Don’t make it too small. A queue size of 1000 might be a good choice.
message-box-base
)) ¶The name of the message-box.
The default name is concatenated of "mesgb-" and a ‘gensym‘ generated random number.
name
.
actor-name-exists
)) ¶name
.
queue-full-error
)) ¶eventstream
)) ¶automatically generated reader method
actor-system
)) ¶Internal API: A wheel-timer used for timeouts to make timeouts less resource expensive.
This shouldn’t be used freely. It is used internally by the system to support ‘act:ask‘ timeouts.
wheel-timer
)) ¶wheel-timer
)) ¶Hash table of timers. Primarily used to cancel recurring timers.
actor-system
)) ¶Internal API: an actor context for agents/actors created by the user.
ask-timeout
)) ¶wheel-timer
)) ¶wheel-timer
)) ¶The wheel timer.
structure-object
.
boolean
t
Wrapper atomics package.
structure-object
.
Wrapper atomics package.
structure-object
.
Finite-state-machine state model.
structure-object
.
boolean
boolean
list
(quote sento.messageb::no-result)
structure-object
.
boolean
list
(quote sento.messageb::no-result)
The user does not need to create a message-box manually. It is automatically created and added to the ‘actor‘ when the actor is created through ‘ac:actor-of‘.
The name of the message-box.
The default name is concatenated of "mesgb-" and a ‘gensym‘ generated random number.
(string (gensym "mesgb-"))
:name
name
.
This slot is read-only.
0
Which type of queue will be used depends on the ‘max-queue-size‘ setting.
Flag that indicates whether the message processing should commence.
t
0 or nil will make an unbounded queue.
A value ‘> 0‘ will make a bounded queue.
Don’t make it too small. A queue size of 1000 might be a good choice.
0
:max-queue-size
This slot is read-only.
The base queue.
Jump to: | !
%
(
?
A B C D E F G H I M N O P Q R S T U W |
---|
Jump to: | !
%
(
?
A B C D E F G H I M N O P Q R S T U W |
---|
Jump to: | *
A B C D E F H I L M N O P Q R S T U W |
---|
Jump to: | *
A B C D E F H I L M N O P Q R S T U W |
---|
Jump to: | A C D E F H M P Q R S T W |
---|
Jump to: | A C D E F H M P Q R S T W |
---|