picltree.c revision 2
2N/A * The contents of this file are subject to the terms of the 2N/A * Common Development and Distribution License (the "License"). 2N/A * You may not use this file except in compliance with the License. 2N/A * See the License for the specific language governing permissions 2N/A * and limitations under the License. 2N/A * When distributing Covered Code, include this CDDL HEADER in each 2N/A * If applicable, add the following below this CDDL HEADER, with the 2N/A * fields enclosed by brackets "[]" replaced with your own identifying 2N/A * information: Portions Copyright [yyyy] [name of copyright owner] 2N/A * Copyright (c) 2000, 2010, Oracle and/or its affiliates. All rights reserved. 2N/A * This module implements the PTree interface and the PICL to PTree calls 2N/A * PICL Node and Property Handles Table: 2N/A * A node or property in PICL tree has two handles: a ptree handle, which is 2N/A * used by plug-ins and the libpicltree interface, and a picl handle 2N/A * which is used by clients and the libpicl interface. 2N/A * The mapping of ptree handles to the internal PICL object (picl_obj_t) is 2N/A * kept in a ptree hash table (ptreetbl), and the mapping of a picl handle 2N/A * to its ptree handle is kept in the picl hash table (picltbl). 2N/A * The reader/writer lock, ptree_rwlock, is held when reading or modifying ptree 2N/A * hash table (ptreetbl) and/or the PICL tree structure (nodes and linkages 2N/A * between them). The reader/writer lock, picltbl_rwlock, is held when reading 2N/A * or modifying picl hash table (picltbl). 2N/A * The mutex, ptreehdl_lock, is used to control allocation of ptree handles. 2N/A * The mutex, piclhdl_lock, is used to control allocation of picl handles. 2N/A * The mutex, ptree_refresh_mutex, and the condition, ptree_refresh_cond, 2N/A * are used to synchronize PICL refreshes (ptree_refresh) and to wait/signal 2N/A * change in PICL tree structure. 2N/A * The counter, picl_hdl_hi, is the hi water mark for allocated picl handles. 2N/A * The counter, ptree_hdl_hi, is the hi water mark for allocated ptree handles. 2N/A * A stale handle error is returned for handle values below the hi water 2N/A * mark, and invalid handles are returned for handle values above the hi water 2N/A * mark or when the process id field of the handle does not match. 2N/A * The structure of the PICL tree is controlled by the ptree_rwlock. The 2N/A * properties of a node are controlled by individual node locks. The 2N/A * piclize-ing or unpiclize-ing of a node is controlled by picltbl_rwlock. 2N/A * Two-Phase Locking scheme: lock acquire phase and lock release phase. 2N/A * The ptree_rwlock and node locks are always acquired in the following order: 2N/A * There are three locks: 2N/A * ptree_rwlock: a reader lock is obtained to do ptree hash table 2N/A * lookups and traverse tree. A writer lock is obtained 2N/A * when creating or destroying nodes from the ptree, 2N/A * or when modifying node linkages: parent, peer, child. 2N/A * picltbl_rwlock: a reader lock is obtained for picl hash table lookups. 2N/A * A writer lock is obtained when piclize-ing or 2N/A * unpiclize-ing nodes or properties. 2N/A * A reader lock is obtained before reading property 2N/A * values. A writer lock is obtained when adding or 2N/A * removing properties and when modifying a property value. 2N/A * Never hold more than one node lock at a time. 2N/A * There are two locks: 2N/A * evtq_lock: this lock protects the event queue. It is obtained 2N/A * to queue events that are posted and to unqueue 2N/A * events to be dispatched. 2N/A * evtq_cv: condition variable is protected by evtq_lock. It is 2N/A * used by the ptree event thread to wait for events 2N/A * until eventqp is not NULL. 2N/A * evtq_empty: condition variable protected by evtq_lock. It is 2N/A * used to signal when the eventq becomes empty. The 2N/A * reinitialization process waits on this condition. 2N/A * evthandler_lock: this protects the event handler list. It is obtained 2N/A * to add event handlers on registration and to remove 2N/A * event handlers on unregistration. 2N/A * (handler)->cv: condition variable per handler protected by 2N/A * evthandler_lock. It is used to wait until the 2N/A * event handler completes execution (execflg == 0) 2N/A * before unregistering the handler. 2N/A * PICL daemon verbose level 2N/A * Event handler free functions 2N/A * queue_event to events queue 2N/A * unqueue_event from the specified eventq 2N/A * register an event handler by adding it to the list 2N/A * Initialize event handler entry 2N/A * add handler to the handler list 2N/A * unregister handler 2N/A * unlink handler from handler list 2N/A * If the handler is in execution, release the lock 2N/A * and wait for it to complete and retry. 2N/A * Unlink this handler from the linked list 2N/A * Call all registered handlers for the event 2N/A "ptree_evthr: Invoking completion hdlr:%p ename:%s\n",
2N/A dbg_print(
2,
"ptree_evthr: done completion hdlr:%p ename:%s\n",
2N/A * This function is called by a plug-in to post an event 2N/A * PICLTREE event thread 2N/A * Signal empty queue 2N/A * Create a new element 2N/A * Initialize a hash table by setting all entries to NULL 2N/A * Lock free function to add an entry in the hash table 2N/A * Lock free function to remove the handle from the hash table 2N/A * Returns -1 if element not found, 0 if successful 2N/A * Lock free function to lookup the hash table for a given handle 2N/A * Returns NULL if not found 2N/A * Is the PICL handle stale or invalid handle? 2N/A * Is the Ptree handle stale or invalid handle? 2N/A * For a PICL handle, return the PTree handle and the PICL object 2N/A * Locks and releases the PICL table. 2N/A * Allocate a ptree handle 2N/A * Allocate a picl handle 2N/A * A PICL handle is ptree_hdl value with 1 in MSB of handle value. 2N/A * If a ptree handle already has 1 in MSB, then it cannot be piclized 2N/A * and the daemon must be restarted. 2N/A * Allocate and add handle to PTree hash table 2N/A * Lock a picl node object 2N/A * Release the picl node object. 2N/A * This function may be called with a NULL object pointer. 2N/A * This function locks the node of a property and returns the node object 2N/A * and the property object. 2N/A * Get the property's or table entry's node object 2N/A * This function locks the node of a table and returns the node object 2N/A * and the table object. 2N/A * Get the property's or table entry's node object 2N/A * This locks the node of a table or a table entry and returns the 2N/A * node object and the table or table entry object 2N/A * Get the property's or table entry's node object 2N/A * Lock the node corresponding to the given handle and return its object 2N/A * Is the property name a restricted property name? 2N/A return (0);
/* not restricted */ 2N/A * Check the value size with the property size 2N/A * Return PICL_INVALIDARG if the size does not match exactly for strongly 2N/A * For charstring reads allow sizes that match the value size 2N/A * For bytearray return PICL_VALUETOOBIG 2N/A * if the size is greater than the buffer size. 2N/A * check size for non-volatile properties 2N/A /* fall through for reads */ 2N/A * The caller of the piclize() set of functions is assumed to hold 2N/A * the ptree_rwlock(). 2N/A * Function to create PICL handles for a subtree and add them to 2N/A /* go through the children */ 2N/A * Function to remove PICL handles 2N/A * Function to remove PICL handles for a subtree and its 2N/A /* go through the children */ 2N/A * The caller holds the lock on the ptree_lock when calling this. 2N/A * If ret is not NULL then this function returns the referenced object. 2N/A * The caller holds the lock on ptree_lock when calling this. 2N/A * If ret is not NULL, then this function returns the table object 2N/A * This function locks the ptree, verifies that the handle is a reference 2N/A * to a node of specified class name, releases the lock 2N/A * PICLTree Interface routines for plug-in modules 2N/A * Lock free create a property object 2N/A * Check for valid arguments, create a property object, 2N/A * Lock ptree_rwlock, add the new property handle, release the lock 2N/A * For reference properties and table properties, the handles are verified 2N/A * before creating the property. 2N/A * check valid reference handle for non-volatiles 2N/A * No locks held when you get here 2N/A * Lock free routine to destroy table entries 2N/A * This function removes the destroyed handles from the hash table 2N/A * Uses lock free routines: hash_lookup() and hash_remove() 2N/A /* Delete all entries */ 2N/A * Lock free function that frees up a property object and removes the 2N/A * handles from Ptree table 2N/A * This function destroys a previously deleted property. 2N/A * A deleted property does not have an associated node. 2N/A * All memory allocated for this property are freed 2N/A /* Is the prop still attached to a node? */ 2N/A * This function adds a property to the property list of a node and adds 2N/A * it to the PICL table if the node has a PICL handle. 2N/A * This function locks the picl_rwlock and ptree_rwlock. 2N/A * Verify property handle 2N/A * Exclusive Lock the node's properties 2N/A * check if prop already exists 2N/A * Verify property's value 2N/A * Add prop to beginning of list 2N/A * Lock free function that unlinks a property from its node 2N/A * This function deletes the specified property from the property list 2N/A * of its node and removes the handle from PICL table, if the node 2N/A * Lookup the property's node and lock it if there is one 2N/A * return the objects for the property and the node 2N/A /* Nothing to do - already deleted! */ 2N/A * Create a table object and return its handle 2N/A * Add the properties in <props> array as a row in the table 2N/A * Add PICL handles if the table has a valid PICL handle 2N/A * make sure all are either props or table handles 2N/A * Mark all props as table entries, set up row linkages 2N/A * This function returns the handle of the next property in the row 2N/A * proph could be a table handle or a table entry handle 2N/A * Look it up as a table entry handle first, check error code 2N/A * to see if it is a table handle 2N/A * proph could be a table handle or a table entry handle 2N/A * Look it up as a table entry handle first, check error code 2N/A * to see if it is a table handle 2N/A * This function creates node object and adds its handle to the Ptree 2N/A * Create the picl object for node 2N/A * create name property 2N/A * create picl classname property 2N/A * Removed destroyed objects' handles from PTree table 2N/A * destroy all properties associated with this node 2N/A * This function destroys a previously deleted node/subtree. All the properties 2N/A * are freed and removed from the PTree table. 2N/A * Only one destroy is in progress at any time. 2N/A * update parent's child list to repair the tree when 2N/A * parent is not null 2N/A * This function deletes a node/subtree from the tree and removes the handles 2N/A * This function adds a node as a child of another node 2N/A /* is chdh already a child? */ 2N/A * append child to children list 2N/A * This function returns the property information to a plug-in 2N/A * This function returns the property information to a plug-in 2N/A * This function must be called only after a lookup_prop_by_name() returns 2N/A * success and only if picl_restricted() returns true. 2N/A * Returns the property value in the buffer and releases the node and 2N/A * For volatile properties, this function releases the locks on ptree 2N/A * table and the node before calling the plug-in provided access function 2N/A * This function gets the credentials and calls get_propval_with_cred. 2N/A * This function retrieves a property's value by by its name 2N/A * For volatile properties, the locks on ptree and node are released 2N/A * before calling the plug-in provided access function 2N/A * This function is used by plugins to get a value of a property 2N/A * looking it up by its name. 2N/A * This function updates a property's value. 2N/A * For volatile properties, the locks on the node and the ptree table 2N/A * are released before calling the plug-in provided access function. 2N/A * Ptree function used by plug-ins to update a property's value 2N/A * calls update_propval_with_cred(), which releases locks for volatile props 2N/A * For volatile properties this function releases the locks on the 2N/A * node and the ptree table. 2N/A * This function updates the value of a property specified by its name 2N/A * This function retrieves the handle of a property by its name 2N/A * This function returns the handle of the first property 2N/A * This function returns the handle of next property in the list 2N/A * These functions are called by ptree_get_node_by_path() 2N/A * Append a prop expression entry to the list 2N/A * Add it to the end of list 2N/A * Free the property expression list 2N/A * get property expression 2N/A * create the prop list 2N/A * <prop>= is treated as void property 2N/A case sizeof (
float):
2N/A case sizeof (
double):
2N/A * compare device address with bus-addr prop first 2N/A * then with UnitAddress property 2N/A continue;
/* not match */ 2N/A * compare the property expression list 2N/A * This functions returns the handle of node specified by its path 2N/A * check if last token is empty or not 2N/A * eg. /a/b/c/ or /a/b/c 2N/A * Initialize propinfo 2N/A * Creates a property, adds it to the node, and returns the property 2N/A * handle to the caller if successful and proph is not NULL 2N/A * Creates a node, adds it to its parent node, and returns the node 2N/A * handle to the caller if successful 2N/A * recursively visit all nodes 2N/A * This function visits all the nodes in the subtree rooted at <rooth>. 2N/A * For each node that matches the class name specified, the callback 2N/A * function is invoked. 2N/A * This function traverses the subtree and finds a node that has a property 2N/A * of the specified name and type with the specified value. 2N/A * The matched node in the tree is returned in retnodeh. If there is 2N/A * no node with that property, then PICL_NODENOTFOUND is returned. 2N/A * This function gets the frutree parent for a given node. 2N/A * Traverse up the tree and look for the following properties: 2N/A * Frutree parent reference properties: 2N/A * If the frutree reference property is found, return its value. 2N/A * This function is called by plug-ins to register with the daemon 2N/A }
else {
/* add to end */ 2N/A * Call fini routines of the registered plugins 2N/A * Initialize the registered plug-in modules 2N/A * Dispatch events after all plug-ins have initialized 2N/A * Wait for eventq to become empty 2N/A * This function is called by the PICL daemon on behalf of clients to 2N/A * wait for a tree refresh