Lines Matching refs:descriptor

49 static void deselect_select_infos(file_descriptor* descriptor,
57 void dump_fd(int fd, struct file_descriptor* descriptor);
60 dump_fd(int fd,struct file_descriptor* descriptor)
65 fd, descriptor, descriptor->type, descriptor->ref_count,
66 descriptor->ops, descriptor->u.vnode, descriptor->u.mount,
67 descriptor->cookie, descriptor->open_mode, descriptor->pos);
77 file_descriptor* descriptor
79 if (descriptor == NULL)
82 descriptor->u.vnode = NULL;
83 descriptor->cookie = NULL;
84 descriptor->ref_count = 1;
85 descriptor->open_count = 0;
86 descriptor->open_mode = 0;
87 descriptor->pos = -1;
89 return descriptor;
111 inserts the specified descriptor into it.
114 new_fd_etc(struct io_context* context, struct file_descriptor* descriptor,
136 TFD(NewFD(context, fd, descriptor));
138 context->fds[fd] = descriptor;
140 atomic_add(&descriptor->open_count, 1);
150 new_fd(struct io_context* context, struct file_descriptor* descriptor)
152 return new_fd_etc(context, descriptor, 0);
156 /*! Reduces the descriptor's reference counter, and frees all resources
160 put_fd(struct file_descriptor* descriptor)
162 int32 previous = atomic_add(&descriptor->ref_count, -1);
164 TFD(PutFD(descriptor));
166 TRACE(("put_fd(descriptor = %p [ref = %" B_PRId32 ", cookie = %p])\n",
167 descriptor, descriptor->ref_count, descriptor->cookie));
169 // free the descriptor if we don't need it anymore
172 if (descriptor->ops != NULL && descriptor->ops->fd_free != NULL)
173 descriptor->ops->fd_free(descriptor);
175 object_cache_free(sFileDescriptorCache, descriptor, 0);
176 } else if ((descriptor->open_mode & O_DISCONNECTED) != 0
177 && previous - 1 == descriptor->open_count
178 && descriptor->ops != NULL) {
179 // the descriptor has been disconnected - it cannot
181 // currently accessing this descriptor)
183 if (descriptor->ops->fd_close)
184 descriptor->ops->fd_close(descriptor);
185 if (descriptor->ops->fd_free)
186 descriptor->ops->fd_free(descriptor);
188 // prevent this descriptor from being closed/freed again
189 descriptor->ops = NULL;
190 descriptor->u.vnode = NULL;
192 // the file descriptor is kept intact, so that it's not
198 /*! Decrements the open counter of the file descriptor and invokes
202 close_fd(struct io_context* context, struct file_descriptor* descriptor)
204 // POSIX advisory locks need to be released when any file descriptor closes
205 if (descriptor->type == FDTYPE_FILE)
206 vfs_release_posix_lock(context, descriptor);
208 if (atomic_add(&descriptor->open_count, -1) == 1) {
209 vfs_unlock_vnode_if_locked(descriptor);
211 if (descriptor->ops != NULL && descriptor->ops->fd_close != NULL)
212 descriptor->ops->fd_close(descriptor);
220 struct file_descriptor* descriptor = remove_fd(context, fd);
222 if (descriptor == NULL)
225 close_fd(context, descriptor);
226 put_fd(descriptor);
233 /*! This descriptor's underlying object will be closed and freed as soon as
235 succeed on this descriptor).
240 disconnect_fd(struct file_descriptor* descriptor)
242 descriptor->open_mode |= O_DISCONNECTED;
247 inc_fd_ref_count(struct file_descriptor* descriptor)
249 atomic_add(&descriptor->ref_count, 1);
259 struct file_descriptor* descriptor = context->fds[fd];
261 if (descriptor != NULL) {
263 if (descriptor->open_mode & O_DISCONNECTED)
266 TFD(GetFD(context, fd, descriptor));
267 inc_fd_ref_count(descriptor);
270 return descriptor;
288 file_descriptor* descriptor = get_fd_locked(context, fd);
289 if (descriptor == NULL)
292 atomic_add(&descriptor->open_count, 1);
294 return descriptor;
298 /*! Removes the file descriptor from the specified slot.
303 struct file_descriptor* descriptor = NULL;
311 descriptor = context->fds[fd];
316 if (descriptor != NULL) {
318 TFD(RemoveFD(context, fd, descriptor));
327 disconnected = (descriptor->open_mode & O_DISCONNECTED);
331 deselect_select_infos(descriptor, selectInfos, true);
335 return disconnected ? NULL : descriptor;
343 struct file_descriptor* descriptor;
349 descriptor = get_fd(context, fd);
350 if (descriptor == NULL)
354 status = new_fd(context, descriptor);
356 put_fd(descriptor);
451 // get the file descriptor
452 file_descriptor* descriptor = get_fd(fromContext, fd);
453 if (descriptor == NULL)
455 FileDescriptorPutter descriptorPutter(descriptor);
458 int result = new_fd(get_current_io_context(kernel), descriptor);
460 // the descriptor reference belongs to the slot, now
471 FileDescriptorPutter descriptor(get_fd(get_current_io_context(kernelFD), fd));
472 if (!descriptor.IsSet())
476 if (descriptor->ops->fd_ioctl)
477 status = descriptor->ops->fd_ioctl(descriptor.Get(), op, buffer, length);
489 deselect_select_infos(file_descriptor* descriptor, select_info* infos,
492 TRACE(("deselect_select_infos(%p, %p)\n", descriptor, infos));
500 if (descriptor->ops->fd_deselect != NULL && eventsToDeselect != 0) {
503 descriptor->ops->fd_deselect(descriptor, event,
525 FileDescriptorPutter descriptor;
531 descriptor.SetTo(get_fd_locked(context, fd));
532 if (!descriptor.IsSet())
537 if (descriptor->ops->fd_select == NULL) {
549 atomic_add(&descriptor->open_count, 1);
558 && descriptor->ops->fd_select(descriptor.Get(), event,
569 if (context->fds[fd] != descriptor.Get()) {
573 deselect_select_infos(descriptor.Get(), info, false);
575 // Release our open reference of the descriptor.
576 close_fd(context, descriptor.Get());
590 // since as long as the descriptor is associated with the slot,
592 atomic_add(&descriptor->open_count, -1);
604 FileDescriptorPutter descriptor;
610 descriptor.SetTo(get_fd_locked(context, fd));
611 if (!descriptor.IsSet())
630 if (descriptor->ops->fd_deselect != NULL && eventsToDeselect != 0) {
633 descriptor->ops->fd_deselect(descriptor.Get(), event,
652 struct file_descriptor* descriptor
654 if (descriptor == NULL)
657 put_fd(descriptor);
663 fd_vnode(struct file_descriptor* descriptor)
665 switch (descriptor->type) {
670 return descriptor->u.vnode;
690 FileDescriptorPutter descriptor(get_fd(get_current_io_context(false), fd));
691 if (!descriptor.IsSet())
694 if (write ? (descriptor->open_mode & O_RWMASK) == O_RDONLY
695 : (descriptor->open_mode & O_RWMASK) == O_WRONLY) {
700 if (pos == -1 && descriptor->pos != -1) {
701 pos = descriptor->pos;
705 if (write ? descriptor->ops->fd_write == NULL
706 : descriptor->ops->fd_read == NULL) {
719 status = descriptor->ops->fd_write(descriptor.Get(), pos, buffer, &length);
721 status = descriptor->ops->fd_read(descriptor.Get(), pos, buffer, &length);
727 descriptor->pos = write && (descriptor->open_mode & O_APPEND) != 0
728 ? descriptor->ops->fd_seek(descriptor.Get(), 0, SEEK_END) : pos + length;
748 FileDescriptorPutter descriptor(get_fd(get_current_io_context(false), fd));
749 if (!descriptor.IsSet())
752 if (write ? (descriptor->open_mode & O_RWMASK) == O_RDONLY
753 : (descriptor->open_mode & O_RWMASK) == O_WRONLY) {
758 if (pos == -1 && descriptor->pos != -1) {
759 pos = descriptor->pos;
763 if (write ? descriptor->ops->fd_write == NULL
764 : descriptor->ops->fd_read == NULL) {
777 status = descriptor->ops->fd_write(descriptor.Get(), pos,
780 status = descriptor->ops->fd_read(descriptor.Get(), pos, vecs[i].iov_base,
803 descriptor->pos = write && (descriptor->open_mode & O_APPEND) != 0
804 ? descriptor->ops->fd_seek(descriptor.Get(), 0, SEEK_END) : pos;
856 FileDescriptorPutter descriptor(get_fd(get_current_io_context(false), fd));
857 if (!descriptor.IsSet())
860 TRACE(("user_seek(descriptor = %p)\n", descriptor));
862 if (descriptor->ops->fd_seek)
863 pos = descriptor->ops->fd_seek(descriptor.Get(), pos, seekType);
904 FileDescriptorPutter descriptor(get_fd(ioContext, fd));
905 if (!descriptor.IsSet())
908 if (descriptor->ops->fd_read_dir == NULL)
921 status_t status = descriptor->ops->fd_read_dir(ioContext, descriptor.Get(),
951 FileDescriptorPutter descriptor(get_fd(get_current_io_context(false), fd));
952 if (!descriptor.IsSet())
956 if (descriptor->ops->fd_rewind_dir)
957 status = descriptor->ops->fd_rewind_dir(descriptor.Get());
995 FileDescriptorPutter descriptor(get_fd(get_current_io_context(true), fd));
997 if (!descriptor.IsSet())
999 if ((descriptor->open_mode & O_RWMASK) == O_WRONLY)
1003 if (pos == -1 && descriptor->pos != -1) {
1004 pos = descriptor->pos;
1010 if (descriptor->ops->fd_read == NULL)
1013 ssize_t bytesRead = descriptor->ops->fd_read(descriptor.Get(), pos, buffer,
1022 descriptor->pos = pos + length;
1037 FileDescriptorPutter descriptor(get_fd(get_current_io_context(true), fd));
1039 if (!descriptor.IsSet())
1041 if ((descriptor->open_mode & O_RWMASK) == O_WRONLY)
1045 if (pos == -1 && descriptor->pos != -1) {
1046 pos = descriptor->pos;
1050 if (descriptor->ops->fd_read == NULL)
1059 status = descriptor->ops->fd_read(descriptor.Get(), pos,
1075 descriptor->pos = pos;
1087 FileDescriptorPutter descriptor(get_fd(get_current_io_context(true), fd));
1089 if (!descriptor.IsSet())
1091 if ((descriptor->open_mode & O_RWMASK) == O_RDONLY)
1095 if (pos == -1 && descriptor->pos != -1) {
1096 pos = descriptor->pos;
1100 if (descriptor->ops->fd_write == NULL)
1105 ssize_t bytesWritten = descriptor->ops->fd_write(descriptor.Get(), pos,
1114 descriptor->pos = pos + length;
1129 FileDescriptorPutter descriptor(get_fd(get_current_io_context(true), fd));
1131 if (!descriptor.IsSet())
1133 if ((descriptor->open_mode & O_RWMASK) == O_RDONLY)
1137 if (pos == -1 && descriptor->pos != -1) {
1138 pos = descriptor->pos;
1142 if (descriptor->ops->fd_write == NULL)
1151 status = descriptor->ops->fd_write(descriptor.Get(), pos,
1167 descriptor->pos = pos;
1176 FileDescriptorPutter descriptor(get_fd(get_current_io_context(true), fd));
1177 if (!descriptor.IsSet())
1180 if (descriptor->ops->fd_seek)
1181 pos = descriptor->ops->fd_seek(descriptor.Get(), pos, seekType);
1208 FileDescriptorPutter descriptor(get_fd(ioContext, fd));
1209 if (!descriptor.IsSet())
1213 if (descriptor->ops->fd_read_dir) {
1215 retval = descriptor->ops->fd_read_dir(ioContext, descriptor.Get(), buffer,
1231 FileDescriptorPutter descriptor(get_fd(get_current_io_context(true), fd));
1232 if (!descriptor.IsSet())
1236 if (descriptor->ops->fd_rewind_dir)
1237 status = descriptor->ops->fd_rewind_dir(descriptor.Get());