/*********************************************************************** * add_fd_to_cache * * Caller must hold fd_cache_section. */ static int add_fd_to_cache( HANDLE handle, int fd, enum server_fd_type type, unsigned int access, unsigned int options ) { unsigned int entry, idx = handle_to_index( handle, &entry ); int prev_fd; if (entry >= FD_CACHE_ENTRIES) { FIXME( "too many allocated handles, not caching %p\n", handle ); return 0; } if (!fd_cache[entry]) /* do we need to allocate a new block of entries? */ { if (!entry) fd_cache[0] = fd_cache_initial_block; else { void *ptr = wine_anon_mmap( NULL, FD_CACHE_BLOCK_SIZE * sizeof(struct fd_cache_entry), PROT_READ | PROT_WRITE, 0 ); if (ptr == MAP_FAILED) return 0; fd_cache[entry] = ptr; } } /* store fd+1 so that 0 can be used as the unset value */ prev_fd = interlocked_xchg( &fd_cache[entry][idx].fd, fd + 1 ) - 1; fd_cache[entry][idx].type = type; fd_cache[entry][idx].access = access; fd_cache[entry][idx].options = options; if (prev_fd != -1) close( prev_fd ); return 1; }
/*********************************************************************** * server_remove_fd_from_cache */ int server_remove_fd_from_cache( HANDLE handle ) { unsigned int entry, idx = handle_to_index( handle, &entry ); int fd = -1; if (entry < FD_CACHE_ENTRIES && fd_cache[entry]) fd = interlocked_xchg( &fd_cache[entry][idx].fd, 0 ) - 1; return fd; }
/*********************************************************************** * get_cached_fd * * Caller must hold fd_cache_section. */ static inline int get_cached_fd( HANDLE handle, enum server_fd_type *type, unsigned int *access, unsigned int *options ) { unsigned int entry, idx = handle_to_index( handle, &entry ); int fd = -1; if (entry < FD_CACHE_ENTRIES && fd_cache[entry]) { fd = fd_cache[entry][idx].fd - 1; if (type) *type = fd_cache[entry][idx].type; if (access) *access = fd_cache[entry][idx].access; if (options) *options = fd_cache[entry][idx].options; } return fd; }
/* return a handle entry, or NULL if the handle is invalid */ static struct handle_entry *get_handle( struct process *process, obj_handle_t handle ) { struct handle_table *table = process->handles; struct handle_entry *entry; int index; if (handle_is_global(handle)) { handle = handle_global_to_local(handle); table = global_table; } if (!table) return NULL; index = handle_to_index( handle ); if (index < 0) return NULL; if (index > table->last) return NULL; entry = table->entries + index; if (!entry->ptr) return NULL; return entry; }
const GrGLShaderVar& GrGLShaderBuilder::getUniformVariable(UniformHandle u) const { return fUniforms[handle_to_index(u)].fVariable; }