[slime-devel] Threads attributes

Terje Norderhaug terje at in-progress.com
Wed Jun 24 00:35:15 UTC 2009


On Jun 23, 2009, at 2:35 PM, Helmut Eller wrote:
> * Terje Norderhaug [2009-06-23 22:07+0200] writes:
>
>> Another possibility is to have the list-threads response include a
>> declaration of the structure of the items in the list. For example,
>> the first item could be a list of symbols labeling the data, as in
>> this amended response from swank:list-threads:
>>
>> ((id name status description)
>> (18 "worker" "Active" "")
>> (16 "repl-thread" "Semaphore timed wait" "")
>> (15 "auto-flush-thread" "Sleep" "")
>> (12 "reader-thread" "Active" "")
>> (11 "control-thread" "Semaphore timed wait" "")
>> (2 "Swank 0" "Active" "")
>> (1 "listener" "Active" "")
>> (0 "Initial" "Sleep" ""))
>>
>> Benefits of heading with such a declaration vs using a detailed
>> property list for each item includes less redundancy and that a swank
>> client can make decisions about how to present the items in the list
>> before processing the rest of the response.
>>
>> Implementations can then add process attributes like priority,
>> creation-time, total-run-time, last-run-time, idle-time etc,
>> preferably using consistent labels.
>>
>> -- Terje Norderhaug
>
> Yet another possibility would be to pass the interesting attributes
> as input to swank:list-threads.  E.g.
>
> (list-threads '(:id :name :status :description :priority :total- 
> runtime))
> =>  ((18 "worker" "Active" "" 10 0.2)
>      (16 "repl-thread" "Semaphore timed wait" "" 5 0.3))
>
> Perhaps complemented with a function to find out all possible  
> attribute
> names.

Having the client explicitly requesting which attributes it wants is  
a possibility worth consideration. A variation is to have the list- 
threads function declare the response and return as many attributes  
is available, but have a public function that can filter responses on  
the server before the result is passed back to the client, as in this  
request:

(filter '(id name status description priority total-runtime) (list- 
threads))

Sample demo:

(defun list-threads ()
   '((id name status description)
         (18 "worker" "Active" "")
         (16 "repl-thread" "Semaphore timed wait" "")
         (15 "auto-flush-thread" "Sleep" "")
         (12 "reader-thread" "Active" "")
         (11 "control-thread" "Semaphore timed wait" "")
         (2 "Swank 0" "Active" "")
         (1 "listener" "Active" "")
         (0 "Initial" "Sleep" "")))

(defun filter (wanted items)
   (loop
     with given = (first items)
     for item in (rest items)
     collect (loop
               for w in wanted
               for p = (position w given)
               collect (when p (nth p item)))))

(filter '(id status) (list-threads))
=>
((18 "Active") (16 "Semaphore timed wait") (15 "Sleep") (12 "Active")  
(11 "Semaphore timed wait") (2 "Active") (1 "Active") (0 "Sleep"))

(filter '(id name status description priority total-runtime) (list- 
threads))
=>
((18 "worker" "Active" "" NIL NIL) (16 "repl-thread" "Semaphore timed  
wait" "" NIL NIL) (15 "auto-flush-thread" "Sleep" "" NIL NIL) (12  
"reader-thread" "Active" "" NIL NIL) (11 "control-thread" "Semaphore  
timed wait" "" NIL NIL) (2 "Swank 0" "Active" "" NIL NIL) (1  
"listener" "Active" "" NIL NIL) (0 "Initial" "Sleep" "" NIL NIL))

Where do we go from here?

-- Terje Norderhaug







More information about the slime-devel mailing list