summaryrefslogtreecommitdiffhomepage
path: root/src/nxt_job_file.h
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--src/nxt_job_file.h74
1 files changed, 74 insertions, 0 deletions
diff --git a/src/nxt_job_file.h b/src/nxt_job_file.h
new file mode 100644
index 00000000..f61d517d
--- /dev/null
+++ b/src/nxt_job_file.h
@@ -0,0 +1,74 @@
+
+/*
+ * Copyright (C) Igor Sysoev
+ * Copyright (C) NGINX, Inc.
+ */
+
+#ifndef _NXT_JOB_FILE_H_INCLUDED_
+#define _NXT_JOB_FILE_H_INCLUDED_
+
+
+/*
+ * nxt_job_file_read() allows to open a file, to get its type, size, and
+ * modification time, to read or map file content to memory, and to close
+ * the file. It can be done as one operation for small file or as several
+ * operations for large file. On each operation completion ready_handler
+ * or error_handler completion handlers are called. Since they are job
+ * operations, they can be run by a thread pool.
+ *
+ * If a file is not opened then it is opened and its type, size, and
+ * modification time are got. Then file content starting from given offset
+ * is read or mapped in memory if there is a buffer supplied. The offset
+ * field is correspondingly updated.
+ *
+ * If there is no buffer but the read_ahead flag is set then the first
+ * byte is read to initiate read ahead operation.
+ *
+ * If the close flag is set then file descriptor is closed when the file
+ * is completely read.
+ *
+ * The complete flag is set by nxt_job_file_read() when the file is
+ * completely read.
+ *
+ * The test_before_open flag allows to save syscalls in some case, for
+ * example, not to open and then not to close a directory. It calls
+ * nxt_file_info() to get file type, size, and modification time before
+ * opening the file. A custom read_required() callback combined with this
+ * flag can also omit opening and reading on some conditions. However,
+ * if the callback forces opening then additional nxt_file_info() is
+ * called after opening. The default read_required() callback always
+ * forces opening and reading.
+ */
+
+
+typedef struct nxt_job_file_s nxt_job_file_t;
+
+struct nxt_job_file_s {
+ nxt_job_t job;
+
+ nxt_file_t file;
+
+ nxt_off_t offset;
+ nxt_buf_t *buffer;
+
+ nxt_work_handler_t ready_handler;
+ nxt_work_handler_t error_handler;
+
+ nxt_int_t (*read_required)(nxt_job_file_t *jbf);
+
+ uint16_t directory_end;
+
+ uint16_t close_before_open:1;
+ uint16_t test_before_open:1;
+ uint16_t read_ahead:1;
+ uint16_t close:1;
+ uint16_t complete:1;
+};
+
+
+NXT_EXPORT nxt_job_file_t *nxt_job_file_create(nxt_mem_pool_t *mp);
+NXT_EXPORT void nxt_job_file_init(nxt_job_file_t *jbf);
+NXT_EXPORT void nxt_job_file_read(nxt_thread_t *thr, nxt_job_t *job);
+
+
+#endif /* _NXT_JOB_FILE_H_INCLUDED_ */