summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGrapheneCt2020-07-21 17:39:17 -0400
committerReiko Asakura2020-07-21 17:39:17 -0400
commitcd9c1ead26ec0c0ab590cc570862e6d5d99195ed (patch)
tree6861968973333f8c2bfdc6c2278b92b4566fc4ed
parentRefactor userland SceIofilemgr headers (diff)
downloadvds-libraries-cd9c1ead26ec0c0ab590cc570862e6d5d99195ed.tar.gz
Add async IO functions for userland
All credits go to https://github.com/GrapheneCt/
-rw-r--r--include/user/kernel/iofilemgr.h221
-rw-r--r--include/user/kernel/iofilemgr/async.h103
-rw-r--r--include/user/kernel/iofilemgr/dirent.h32
-rw-r--r--include/user/kernel/iofilemgr/stat.h46
4 files changed, 401 insertions, 1 deletions
diff --git a/include/user/kernel/iofilemgr.h b/include/user/kernel/iofilemgr.h
index 33f79d0..87ad029 100644
--- a/include/user/kernel/iofilemgr.h
+++ b/include/user/kernel/iofilemgr.h
@@ -2,6 +2,7 @@
#define _DOLCESDK_PSP2_KERNEL_IOFILEMGR_H_
#include <psp2/kernel/types.h>
+#include <psp2/kernel/iofilemgr/async.h>
#include <psp2/kernel/iofilemgr/stat.h>
#include <psp2/kernel/iofilemgr/dirent.h>
@@ -288,6 +289,226 @@ SceSSize sceIoPwrite(SceUID fd, const void *buf, SceSize nbyte, SceOff offset);
*/
int sceIoSyncByFd(SceUID fd, int flag);
+/*--------------------Async IO--------------------*/
+
+/**
+ * Remove directory entry (asynchronous)
+ *
+ * @param file - Path to the file to remove
+ * @param asyncParam - parameters related to async operation.
+ *
+ * @return A non-negative integer is a valid op handle, anything else an error
+ */
+int sceIoRemoveAsync(const char *file, SceIoAsyncParam* asyncParam);
+
+/**
+ * Change the name of a file (asynchronous)
+ *
+ * @param oldname - The old filename
+ * @param newname - The new filename
+ * @param asyncParam - parameters related to async operation.
+ *
+ * @return A non-negative integer is a valid op handle, anything else an error
+ */
+SceUID sceIoRenameAsync(const char *oldname, const char *newname, SceIoAsyncParam* asyncParam);
+
+/**
+ * Open or create a file for reading or writing (asynchronous)
+ *
+ * @param file - Pointer to a string holding the name of the file to open
+ * @param flags - Libc styled flags that are or'ed together
+ * @param mode - File access mode (One or more ::SceIoMode).
+ * @param asyncParam - parameters related to async operation.
+ *
+ * @return A non-negative integer is a valid op handle, anything else an error
+ */
+SceUID sceIoOpenAsync(const char *file, int flags, SceMode mode, SceIoAsyncParam* asyncParam);
+
+/**
+ * Delete a descriptor (asynchronous)
+ *
+ * @param fd - File descriptor to close
+ * @param asyncParam - parameters related to async operation.
+ *
+ * @return A non-negative integer is a valid op handle, anything else an error
+ */
+SceUID sceIoCloseAsync(SceUID fd, SceIoAsyncParam* asyncParam);
+
+/**
+ * Read input (asynchronous)
+ *
+ * @param fd - Opened file descriptor to read from
+ * @param data - Pointer to the buffer where the read data will be placed
+ * @param size - Size of the read in bytes
+ * @param asyncParam - parameters related to async operation.
+ *
+ * @return A non-negative integer is a valid op handle, anything else an error
+ */
+SceUID sceIoReadAsync(SceUID fd, void *data, SceSize size, SceIoAsyncParam* asyncParam);
+
+/**
+ * Read input at offset (asynchronous)
+ *
+ * @param fd - Opened file descriptor to read from
+ * @param data - Pointer to the buffer where the read data will be placed
+ * @param size - Size of the read in bytes
+ * @param offset - Offset to read
+ * @param asyncParam - parameters related to async operation.
+ *
+ * @return A non-negative integer is a valid op handle, anything else an error
+ */
+SceUID sceIoPreadAsync(SceUID fd, void *data, SceSize size, SceOff offset, SceIoAsyncParam* asyncParam);
+
+/**
+ * Write output (asynchronous)
+ *
+ * @param fd - Opened file descriptor to write to
+ * @param data - Pointer to the data to write
+ * @param size - Size of data to write
+ * @param asyncParam - parameters related to async operation.
+ *
+ * @return A non-negative integer is a valid op handle, anything else an error
+ */
+SceUID sceIoWriteAsync(SceUID fd, const void *data, SceSize size, SceIoAsyncParam* asyncParam);
+
+/**
+ * Write output at offset (asynchronous)
+ *
+ * @param fd - Opened file descriptor to write to
+ * @param data - Pointer to the data to write
+ * @param size - Size of data to write
+ * @param offset - Offset to write
+ * @param asyncParam - parameters related to async operation.
+ *
+ * @return A non-negative integer is a valid op handle, anything else an error
+ */
+SceUID sceIoPwriteAsync(SceUID fd, const void *data, SceSize size, SceOff offset, SceIoAsyncParam* asyncParam);
+
+/**
+ * Reposition read/write file descriptor offset (asynchronous)
+ *
+ * @param fd - Opened file descriptor with which to seek
+ * @param offset - Relative offset from the start position given by whence
+ * @param whence - One of ::SceIoSeekMode.
+ * @param asyncParam - parameters related to async operation.
+ *
+ * @return A non-negative integer is a valid op handle, anything else an error
+ */
+SceUID sceIoLseekAsync(SceUID fd, SceOff offset, int whence, SceIoAsyncParam* asyncParam);
+
+/**
+ * Synchronize device state with state of file or directory being opened
+ *
+ * @param fd - Opened file descriptor to sync
+ * @param fd - Device-dependent flag
+ * @param asyncParam - parameters related to async operation.
+ *
+ * @return A non-negative integer is a valid op handle, anything else an error
+ */
+SceUID sceIoSyncByFdAsync(SceUID fd, int flag, SceIoAsyncParam* asyncParam);
+
+/**
+ * Synchronize device state with memory state
+ *
+ * @param fd - Device name
+ * @param fd - Device-dependent flag
+ * @param asyncParam - parameters related to async operation.
+ *
+ * @return A non-negative integer is a valid op handle, anything else an error
+ */
+SceUID sceIoSyncAsync(const char* device, int flag, SceIoAsyncParam* asyncParam);
+
+/*--------------------IO Priority--------------------*/
+
+/*Valid priority values range: 1 (highest) - 15 (lowest). Default priority value is 14*/
+
+/**
+ * Set IO operations priority for file descriptor
+ *
+ * @param fd - File UID
+ * @param priority - IO operations priority
+ *
+ * @return < 0 on error.
+ */
+int sceIoSetPriority(SceUID fd, int priority);
+
+/**
+ * Set IO operations priority for file descriptor for non-game application
+ *
+ * @param fd - File UID
+ * @param priority - IO operations priority
+ *
+ * @return < 0 on error.
+ */
+int sceIoSetPriorityForSystem(SceUID fd, int priority);
+
+/**
+ * Get IO operations priority for file descriptor
+ *
+ * @param fd - File UID
+ *
+ * @return A non-negative integer is a valid priority, anything else an error
+ */
+int sceIoGetPriority(SceUID fd);
+
+/**
+ * Get IO operations priority for file descriptor for non-game application
+ *
+ * @param fd - File UID
+ *
+ * @return A non-negative integer is a valid priority, anything else an error
+ */
+int sceIoGetPriorityForSystem(SceUID fd);
+
+/**
+ * Set IO operations priority for caller process (will be default for all new IO operations)
+ *
+ * @param priority - New default IO operations priority
+ *
+ * @return < 0 on error.
+ */
+int sceIoSetProcessDefaultPriority(int priority);
+
+/**
+ * Get IO operations priority for process
+ *
+ * @return A non-negative integer is a valid priority, anything else an error
+ */
+int sceIoGetProcessDefaultPriority(void);
+
+/**
+ * Set IO operations priority for caller thread (will be default for all new IO operations)
+ *
+ * @param priority - New default IO operations priority
+ *
+ * @return < 0 on error.
+ */
+int sceIoSetThreadDefaultPriority(int priority);
+
+/**
+ * Set IO operations priority for caller thread for non-game
+ * application (will be default for all new IO operations)
+ *
+ * @param priority - New default IO operations priority
+ *
+ * @return < 0 on error.
+ */
+int sceIoSetThreadDefaultPriorityForSystem(int priority);
+
+/**
+ * Get IO operations priority for thread
+ *
+ * @return A non-negative integer is a valid priority, anything else an error
+ */
+int sceIoGetThreadDefaultPriority(void);
+
+/**
+ * Get IO operations priority for thread for non-game application
+ *
+ * @return A non-negative integer is a valid priority, anything else an error
+ */
+int sceIoGetThreadDefaultPriorityForSystem(void);
+
#ifdef __cplusplus
}
#endif
diff --git a/include/user/kernel/iofilemgr/async.h b/include/user/kernel/iofilemgr/async.h
new file mode 100644
index 0000000..d60f7ca
--- /dev/null
+++ b/include/user/kernel/iofilemgr/async.h
@@ -0,0 +1,103 @@
+#ifndef _DOLCESDK_PSP2_KERNEL_IOFILEMGR_ASYNC_H_
+#define _DOLCESDK_PSP2_KERNEL_IOFILEMGR_ASYNC_H_
+
+#include <psp2/kernel/threadmgr.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/**
+ * Async IO operations are scheduled automatically, similar to FIOS2.
+ * You can make calls to sceIoOpenAsync(), sceIoReadAsync(),
+ * sceIoCloseAsync() right after each other, they will be put in a schedule
+ * and performed automatically.
+ *
+ * All async IO functions return UID of operation handle, not file descriptor UID.
+ */
+
+/**
+ * Cancel an asynchronous operation.
+ *
+ * @param opHandle - The operation handle to perform cancel on.
+ *
+ * @return < 0 on error. If operation has been canceled(finished) already, returns 0x80010002
+ */
+int sceIoCancel(SceUID opHandle);
+
+/**
+ * Complete an asynchronous operation.
+ *
+ * @param opHandle - The operation handle to complete.
+ *
+ * @return < 0 on error.
+ */
+int sceIoComplete(SceUID opHandle);
+
+/**
+ * Complete multiple asynchronous operations.
+ *
+ * @param asyncParam - Array of ::SceIoAsyncParam representing IO operations to complete. retVal member must have opHandle value assigned to it.
+ * @param numOfParam - Number of ::SceIoAsyncParam structs in asyncParam array
+ * @param numOfCompleted - Number of operations that has been completed successfully
+ *
+ * @return < 0 on last encountered error.
+ */
+int sceIoCompleteMultiple(SceIoAsyncParam* asyncParam, int numOfParam, int* numOfCompleted);
+
+/**
+ * Wait until asynchronous operation has been finished.
+ *
+ * @param opHandle - The operation handle to wait for.
+ *
+ * @return < 0 on error.
+ */
+inline
+int sceIoWaitAsync(SceUID opHandle)
+{
+ int ret = sceKernelWaitEvent(opHandle, 1, NULL, NULL, NULL);
+ if (ret == 0)
+ return sceIoComplete(opHandle);
+ else
+ return ret;
+}
+
+/**
+ * Wait until asynchronous operation has been finished with callbacks.
+ *
+ * @param opHandle - The operation handle to wait for.
+ *
+ * @return < 0 on error.
+ */
+inline
+int sceIoWaitAsyncCB(SceUID opHandle)
+{
+ int ret = sceKernelWaitEventCB(opHandle, 1, NULL, NULL, NULL);
+ if (ret == 0)
+ return sceIoComplete(opHandle);
+ else
+ return ret;
+}
+
+/**
+ * Poll asynchronous operation status.
+ *
+ * @param opHandle - The operation handle to poll status for.
+ *
+ * @return < 0 on error or if operation is not finished.
+ */
+inline
+int sceIoPollAsync(SceUID opHandle)
+{
+ int ret = sceKernelPollEvent(opHandle, 1, NULL, NULL);
+ if (ret == 0)
+ return sceIoComplete(opHandle);
+ else
+ return ret;
+}
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _DOLCESDK_PSP2_KERNEL_IOFILEMGR_ASYNC_H_ */
diff --git a/include/user/kernel/iofilemgr/dirent.h b/include/user/kernel/iofilemgr/dirent.h
index e343910..1d06ffd 100644
--- a/include/user/kernel/iofilemgr/dirent.h
+++ b/include/user/kernel/iofilemgr/dirent.h
@@ -1,6 +1,7 @@
#ifndef _DOLCESDK_PSP2_KERNEL_IOFILEMGR_DIRENT_H_
#define _DOLCESDK_PSP2_KERNEL_IOFILEMGR_DIRENT_H_
+#include <psp2/kernel/iofilemgr/async.h>
#include <psp2/kernel/iofilemgr/stat.h>
#ifdef __cplusplus
@@ -51,6 +52,37 @@ int sceIoDclose(SceUID fd);
*/
int sceIoDread(SceUID fd, SceIoDirent *buf);
+/**
+ * Open a directory (asynchronous)
+ *
+ * @param dirname - The directory to open for reading.
+ * @param asyncParam - parameters related to async operation.
+ *
+ * @return If >= 0 then a valid op handle, otherwise a Sony error code.
+ */
+SceUID sceIoDopenAsync(const char *dirname, SceIoAsyncParam* asyncParam);
+
+/**
+ * Reads an entry from an opened file descriptor (asynchronous)
+ *
+ * @param fd - Already opened file descriptor (using ::sceIoDopen or ::sceIoDopenAsync)
+ * @param dir - Pointer to a ::SceIoDirent structure to hold the file information
+ * @param asyncParam - parameters related to async operation.
+ *
+ * @return If >= 0 then a valid op handle, otherwise a Sony error code.
+ */
+SceUID sceIoDreadAsync(SceUID fd, SceIoDirent *dir, SceIoAsyncParam* asyncParam);
+
+/**
+ * Close an opened directory file descriptor (asynchronous)
+ *
+ * @param fd - Already opened file descriptor (using ::sceIoDopen or ::sceIoDopenAsync)
+ * @param asyncParam - parameters related to async operation.
+ *
+ * @return If >= 0 then a valid op handle, otherwise a Sony error code.
+ */
+SceUID sceIoDcloseAsync(SceUID fd, SceIoAsyncParam* asyncParam);
+
#ifdef __cplusplus
}
#endif
diff --git a/include/user/kernel/iofilemgr/stat.h b/include/user/kernel/iofilemgr/stat.h
index 03b880f..e2fa913 100644
--- a/include/user/kernel/iofilemgr/stat.h
+++ b/include/user/kernel/iofilemgr/stat.h
@@ -2,7 +2,7 @@
#define _DOLCESDK_PSP2_KERNEL_IOFILEMGR_STAT_H_
#include <psp2/kernel/types.h>
-#include <psp2/types.h>
+#include <psp2/kernel/iofilemgr/async.h>
#ifdef __cplusplus
extern "C" {
@@ -82,6 +82,50 @@ int sceIoGetstatByFd(SceUID fd, SceIoStat *buf);
*/
int sceIoChstatByFd(SceUID fd, const SceIoStat *buf, unsigned int cbit);
+/**
+ * Make a directory file (asynchronous)
+ *
+ * @param dir - The path to the directory
+ * @param mode - Access mode (One or more ::SceIoAccessMode).
+ * @param asyncParam - parameters related to async operation.
+ *
+ * @return A non-negative integer is a valid op handle, anything else an error
+ */
+SceUID sceIoMkdirAsync(const char *dir, SceMode mode, SceIoAsyncParam* asyncParam);
+
+/**
+ * Remove a directory file (asynchronous)
+ *
+ * @param path - Removes a directory file pointed by the string path
+ * @param asyncParam - parameters related to async operation.
+ *
+ * @return A non-negative integer is a valid op handle, anything else an error
+ */
+SceUID sceIoRmdirAsync(const char *path, SceIoAsyncParam* asyncParam);
+
+/**
+ * Get the status of a file (asynchronous)
+ *
+ * @param file - The path to the file.
+ * @param stat - A pointer to a ::SceIoStat structure.
+ * @param asyncParam - parameters related to async operation.
+ *
+ * @return A non-negative integer is a valid op handle, anything else an error
+ */
+SceUID sceIoGetstatAsync(const char *file, SceIoStat *stat, SceIoAsyncParam* asyncParam);
+
+/**
+ * Change the status of a file (asynchronous)
+ *
+ * @param file - The path to the file.
+ * @param stat - A pointer to a ::SceIoStat structure.
+ * @param bits - Bitmask defining which bits to change.
+ * @param asyncParam - parameters related to async operation.
+ *
+ * @return A non-negative integer is a valid op handle, anything else an error
+ */
+SceUID sceIoChstatAsync(const char *file, SceIoStat *stat, int bits, SceIoAsyncParam* asyncParam);
+
#ifdef __cplusplus
}
#endif