mirror of
https://github.com/jart/cosmopolitan.git
synced 2025-07-05 02:38:31 +00:00
Fix more things
- Update a couple unicode data files - Disable strace during logger calls - SQLite now uses pread() / pwrite() - pread() past EOF on NT now returns 0 - Make the NT mmap() and fork() code elegant - Give NT a big performance boost with memory - Add many more mmap() tests to prove it works
This commit is contained in:
parent
b90fa996b4
commit
98909b1391
36 changed files with 1034 additions and 318 deletions
|
@ -18,7 +18,11 @@
|
|||
╚─────────────────────────────────────────────────────────────────────────────*/
|
||||
#include "libc/calls/internal.h"
|
||||
#include "libc/errno.h"
|
||||
#include "libc/nt/createfile.h"
|
||||
#include "libc/nt/enum/accessmask.h"
|
||||
#include "libc/nt/enum/creationdisposition.h"
|
||||
#include "libc/nt/enum/fileflagandattributes.h"
|
||||
#include "libc/nt/enum/filesharemode.h"
|
||||
#include "libc/nt/enum/io.h"
|
||||
#include "libc/nt/errors.h"
|
||||
#include "libc/nt/files.h"
|
||||
|
@ -28,6 +32,48 @@
|
|||
#include "libc/nt/synchronization.h"
|
||||
#include "libc/sysv/consts/at.h"
|
||||
|
||||
/**
|
||||
* Performs synchronization on directory of pathname.
|
||||
*
|
||||
* This code is intended to help prevent subsequent i/o operations
|
||||
* from failing for no reason at all. For example a unit test that
|
||||
* repeatedly opens and unlinks the same filename.
|
||||
*/
|
||||
static textwindows int SyncDirectory(int df, char16_t path[PATH_MAX], int n) {
|
||||
int rc;
|
||||
int64_t fh;
|
||||
char16_t *p;
|
||||
if ((p = memrchr16(path, '\\', n))) {
|
||||
if (p - path == 2 && path[1] == ':') return 0; // XXX: avoid syncing volume
|
||||
*p = 0;
|
||||
} else {
|
||||
if (df != AT_FDCWD) {
|
||||
if (FlushFileBuffers(df)) {
|
||||
return 0;
|
||||
} else {
|
||||
return __winerr();
|
||||
}
|
||||
}
|
||||
path[0] = '.';
|
||||
path[1] = 0;
|
||||
}
|
||||
if ((fh = CreateFile(
|
||||
path, kNtFileGenericWrite,
|
||||
kNtFileShareRead | kNtFileShareWrite | kNtFileShareDelete, 0,
|
||||
kNtOpenExisting, kNtFileAttributeNormal | kNtFileFlagBackupSemantics,
|
||||
0)) != -1) {
|
||||
if (FlushFileBuffers(fh)) {
|
||||
rc = 0;
|
||||
} else {
|
||||
rc = __winerr();
|
||||
}
|
||||
CloseHandle(fh);
|
||||
} else {
|
||||
rc = __winerr();
|
||||
}
|
||||
return rc;
|
||||
}
|
||||
|
||||
static textwindows bool IsDirectorySymlink(const char16_t *path) {
|
||||
int64_t h;
|
||||
struct NtWin32FindData data;
|
||||
|
@ -67,16 +113,28 @@ static textwindows int sys_rmdir_nt(const char16_t *path) {
|
|||
}
|
||||
|
||||
static textwindows int sys_unlink_nt(const char16_t *path) {
|
||||
if (IsDirectorySymlink(path)) return sys_rmdir_nt(path);
|
||||
return DeleteFile(path) ? 0 : __winerr();
|
||||
if (IsDirectorySymlink(path)) {
|
||||
return sys_rmdir_nt(path);
|
||||
} else if (DeleteFile(path)) {
|
||||
return 0;
|
||||
} else {
|
||||
return __winerr();
|
||||
}
|
||||
}
|
||||
|
||||
textwindows int sys_unlinkat_nt(int dirfd, const char *path, int flags) {
|
||||
uint16_t path16[PATH_MAX];
|
||||
if (__mkntpathat(dirfd, path, 0, path16) == -1) return -1;
|
||||
if (flags & AT_REMOVEDIR) {
|
||||
return sys_rmdir_nt(path16);
|
||||
int n, rc;
|
||||
char16_t path16[PATH_MAX];
|
||||
if ((n = __mkntpathat(dirfd, path, 0, path16)) == -1) {
|
||||
rc = -1;
|
||||
} else if (flags & AT_REMOVEDIR) {
|
||||
rc = sys_rmdir_nt(path16);
|
||||
} else {
|
||||
return sys_unlink_nt(path16);
|
||||
rc = sys_unlink_nt(path16);
|
||||
if (rc != -1) {
|
||||
// TODO(jart): prove that it helps first
|
||||
// rc = SyncDirectory(dirfd, path16, n);
|
||||
}
|
||||
}
|
||||
return rc;
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue