Changeset 79ae36dd in mainline for uspace/srv/vfs/vfs_node.c


Ignore:
Timestamp:
2011-06-08T19:01:55Z (14 years ago)
Author:
Martin Decky <martin@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
0eff68e
Parents:
764d71e
Message:

new async framework with integrated exchange tracking

  • strict isolation between low-level IPC and high-level async framework with integrated exchange tracking
    • each IPC connection is represented by an async_sess_t structure
    • each IPC exchange is represented by an async_exch_t structure
    • exchange management is either based on atomic messages (EXCHANGE_ATOMIC), locking (EXCHANGE_SERIALIZE) or connection cloning (EXCHANGE_CLONE)
  • async_obsolete: temporary compatibility layer to keep old async clients working (several pieces of code are currently broken, but only non-essential functionality)
  • IPC_M_PHONE_HANGUP is now method no. 0 (for elegant boolean evaluation)
  • IPC_M_DEBUG_ALL has been renamed to IPC_M_DEBUG
  • IPC_M_PING has been removed (VFS protocol now has VFS_IN_PING)
  • console routines in libc have been rewritten for better abstraction
  • additional use for libc-private header files (FILE structure opaque to the client)
  • various cstyle changes (typos, indentation, missing externs in header files, improved comments, etc.)
File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/srv/vfs/vfs_node.c

    r764d71e r79ae36dd  
    104104        bool free_vfs_node = false;
    105105        bool free_fs_node = false;
    106 
    107         fibril_mutex_lock(&nodes_mutex);
     106       
     107        fibril_mutex_lock(&nodes_mutex);
     108       
    108109        if (node->refcnt-- == 1) {
     110               
    109111                /*
    110112                 * We are dropping the last reference to this node.
    111113                 * Remove it from the VFS node hash table.
    112114                 */
     115               
    113116                unsigned long key[] = {
    114117                        [KEY_FS_HANDLE] = node->fs_handle,
     
    116119                        [KEY_INDEX] = node->index
    117120                };
     121               
    118122                hash_table_remove(&nodes, key, 3);
    119123                free_vfs_node = true;
     124               
    120125                if (!node->lnkcnt)
    121126                        free_fs_node = true;
    122127        }
    123         fibril_mutex_unlock(&nodes_mutex);
    124 
     128       
     129        fibril_mutex_unlock(&nodes_mutex);
     130       
    125131        if (free_fs_node) {
    126                 /*
     132               
     133                /*
    127134                 * The node is not visible in the file system namespace.
    128135                 * Free up its resources.
    129136                 */
    130                 int phone = vfs_grab_phone(node->fs_handle);
    131                 sysarg_t rc;
    132                 rc = async_req_2_0(phone, VFS_OUT_DESTROY,
    133                     (sysarg_t)node->devmap_handle, (sysarg_t)node->index);
     137               
     138                async_exch_t *exch = vfs_exchange_grab(node->fs_handle);
     139                sysarg_t rc = async_req_2_0(exch, VFS_OUT_DESTROY,
     140                    (sysarg_t) node->devmap_handle, (sysarg_t)node->index);
     141               
    134142                assert(rc == EOK);
    135                 vfs_release_phone(node->fs_handle, phone);
     143                vfs_exchange_release(exch);
    136144        }
     145       
    137146        if (free_vfs_node)
    138147                free(node);
Note: See TracChangeset for help on using the changeset viewer.