Lines Matching refs:descriptor

39 void dump_fd(int fd, struct file_descriptor *descriptor);
42 dump_fd(int fd,struct file_descriptor *descriptor)
45 fd, descriptor, (int)descriptor->type, (int)descriptor->ref_count, descriptor->ops,
46 descriptor->u.vnode, descriptor->u.mount, descriptor->cookie, (int)descriptor->open_mode, descriptor->pos);
56 struct file_descriptor *descriptor;
58 descriptor = (file_descriptor*)malloc(sizeof(struct file_descriptor));
59 if (descriptor == NULL)
62 descriptor->u.vnode = NULL;
63 descriptor->cookie = NULL;
64 descriptor->ref_count = 1;
65 descriptor->open_count = 0;
66 descriptor->open_mode = 0;
67 descriptor->pos = 0;
69 return descriptor;
91 * the specified descriptor into it.
95 new_fd_etc(struct io_context *context, struct file_descriptor *descriptor,
114 context->fds[fd] = descriptor;
116 fssh_atomic_add(&descriptor->open_count, 1);
126 new_fd(struct io_context *context, struct file_descriptor *descriptor)
128 return new_fd_etc(context, descriptor, 0);
132 /** Reduces the descriptor's reference counter, and frees all resources
137 put_fd(struct file_descriptor *descriptor)
139 int32_t previous = fssh_atomic_add(&descriptor->ref_count, -1);
141 TRACE(("put_fd(descriptor = %p [ref = %ld, cookie = %p])\n",
142 descriptor, descriptor->ref_count, descriptor->cookie));
144 // free the descriptor if we don't need it anymore
147 if (descriptor->ops != NULL && descriptor->ops->fd_free != NULL)
148 descriptor->ops->fd_free(descriptor);
150 free(descriptor);
151 } else if ((descriptor->open_mode & FSSH_O_DISCONNECTED) != 0
152 && previous - 1 == descriptor->open_count
153 && descriptor->ops != NULL) {
154 // the descriptor has been disconnected - it cannot
156 // currently accessing this descriptor)
158 if (descriptor->ops->fd_close)
159 descriptor->ops->fd_close(descriptor);
160 if (descriptor->ops->fd_free)
161 descriptor->ops->fd_free(descriptor);
163 // prevent this descriptor from being closed/freed again
164 descriptor->open_count = -1;
165 descriptor->ref_count = -1;
166 descriptor->ops = NULL;
167 descriptor->u.vnode = NULL;
169 // the file descriptor is kept intact, so that it's not
175 /** Decrements the open counter of the file descriptor and invokes
180 close_fd(struct file_descriptor *descriptor)
182 if (fssh_atomic_add(&descriptor->open_count, -1) == 1) {
183 vfs_unlock_vnode_if_locked(descriptor);
185 if (descriptor->ops != NULL && descriptor->ops->fd_close != NULL)
186 descriptor->ops->fd_close(descriptor);
191 /** This descriptor's underlying object will be closed and freed
193 * get_fd() will no longer succeed on this descriptor).
199 disconnect_fd(struct file_descriptor *descriptor)
201 descriptor->open_mode |= FSSH_O_DISCONNECTED;
206 inc_fd_ref_count(struct file_descriptor *descriptor)
208 fssh_atomic_add(&descriptor->ref_count, 1);
215 struct file_descriptor *descriptor = NULL;
223 descriptor = context->fds[fd];
225 if (descriptor != NULL) {
227 if (descriptor->open_mode & FSSH_O_DISCONNECTED)
228 descriptor = NULL;
230 inc_fd_ref_count(descriptor);
235 return descriptor;
239 /** Removes the file descriptor from the specified slot.
245 struct file_descriptor *descriptor = NULL;
253 descriptor = context->fds[fd];
255 if (descriptor) {
261 if (descriptor->open_mode & FSSH_O_DISCONNECTED)
262 descriptor = NULL;
267 return descriptor;
275 struct file_descriptor *descriptor;
281 descriptor = get_fd(context, fd);
282 if (descriptor == NULL)
286 status = new_fd(context, descriptor);
288 put_fd(descriptor);
362 // struct file_descriptor *descriptor;
367 // descriptor = get_fd(get_current_io_context(kernel), fd);
368 // if (descriptor == NULL)
371 // if (descriptor->ops->fd_select) {
372 // status = descriptor->ops->fd_select(descriptor, event, ref, sync);
379 // put_fd(descriptor);
389 // struct file_descriptor *descriptor;
394 // descriptor = get_fd(get_current_io_context(kernel), fd);
395 // if (descriptor == NULL)
398 // if (descriptor->ops->fd_deselect)
399 // status = descriptor->ops->fd_deselect(descriptor, event, sync);
403 // put_fd(descriptor);
418 struct file_descriptor *descriptor = get_fd(get_current_io_context(kernel), fd);
419 if (descriptor == NULL)
422 put_fd(descriptor);
428 fd_vnode(struct file_descriptor *descriptor)
430 switch (descriptor->type) {
435 return descriptor->u.vnode;
446 struct file_descriptor *descriptor = remove_fd(io, fd);
448 if (descriptor == NULL)
453 TRACE(("_user_close(descriptor = %p)\n", descriptor));
456 close_fd(descriptor);
457 put_fd(descriptor);
471 struct file_descriptor *descriptor;
474 descriptor = get_fd(get_current_io_context(true), fd);
475 if (!descriptor)
477 if ((descriptor->open_mode & FSSH_O_RWMASK) == FSSH_O_WRONLY) {
478 put_fd(descriptor);
483 pos = descriptor->pos;
485 if (descriptor->ops->fd_read) {
486 bytesRead = descriptor->ops->fd_read(descriptor, pos, buffer, &length);
493 descriptor->pos = pos + length;
498 put_fd(descriptor);
506 struct file_descriptor *descriptor;
511 descriptor = get_fd(get_current_io_context(true), fd);
512 if (!descriptor)
514 if ((descriptor->open_mode & FSSH_O_RWMASK) == FSSH_O_WRONLY) {
515 put_fd(descriptor);
520 pos = descriptor->pos;
522 if (descriptor->ops->fd_read) {
525 status = descriptor->ops->fd_read(descriptor, pos, vecs[i].iov_base, &length);
541 descriptor->pos = pos;
542 put_fd(descriptor);
550 struct file_descriptor *descriptor;
553 descriptor = get_fd(get_current_io_context(true), fd);
554 if (descriptor == NULL)
556 if ((descriptor->open_mode & FSSH_O_RWMASK) == FSSH_O_RDONLY) {
557 put_fd(descriptor);
562 pos = descriptor->pos;
564 if (descriptor->ops->fd_write) {
565 bytesWritten = descriptor->ops->fd_write(descriptor, pos, buffer, &length);
572 descriptor->pos = pos + length;
577 put_fd(descriptor);
585 struct file_descriptor *descriptor;
590 descriptor = get_fd(get_current_io_context(true), fd);
591 if (!descriptor)
593 if ((descriptor->open_mode & FSSH_O_RWMASK) == FSSH_O_RDONLY) {
594 put_fd(descriptor);
599 pos = descriptor->pos;
601 if (descriptor->ops->fd_write) {
604 status = descriptor->ops->fd_write(descriptor, pos, vecs[i].iov_base, &length);
620 descriptor->pos = pos;
621 put_fd(descriptor);
629 struct file_descriptor *descriptor;
631 descriptor = get_fd(get_current_io_context(true), fd);
632 if (!descriptor)
635 if (descriptor->ops->fd_seek)
636 pos = descriptor->ops->fd_seek(descriptor, pos, seekType);
640 put_fd(descriptor);
648 struct file_descriptor *descriptor;
653 descriptor = get_fd(get_current_io_context(true), fd);
654 if (descriptor == NULL)
657 if (descriptor->ops->fd_ioctl)
658 status = descriptor->ops->fd_ioctl(descriptor, op, buffer, length);
662 put_fd(descriptor);
670 struct file_descriptor *descriptor;
675 descriptor = get_fd(get_current_io_context(true), fd);
676 if (descriptor == NULL)
679 if (descriptor->ops->fd_read_dir) {
681 retval = descriptor->ops->fd_read_dir(descriptor, buffer, bufferSize, &count);
687 put_fd(descriptor);
695 struct file_descriptor *descriptor;
700 descriptor = get_fd(get_current_io_context(true), fd);
701 if (descriptor == NULL)
704 if (descriptor->ops->fd_rewind_dir)
705 status = descriptor->ops->fd_rewind_dir(descriptor);
709 put_fd(descriptor);