Skip to content

Commit

Permalink
Temp save. Not complete.
Browse files Browse the repository at this point in the history
  • Loading branch information
ax-6 committed Aug 11, 2024
1 parent b6791fb commit 09d4dc5
Show file tree
Hide file tree
Showing 7 changed files with 105 additions and 31 deletions.
22 changes: 20 additions & 2 deletions aqvm/base/file/identifier/identifier.c
Original file line number Diff line number Diff line change
Expand Up @@ -14,8 +14,8 @@
#include "aqvm/base/file/identifier/windows/identifier.h"
#endif

int AqvmBaseFileIdentifier_GetIdentifier(const char* filename,
AqvmBaseFileIdentifier_Identifier* identifier) {
int AqvmBaseFileIdentifier_GetIdentifier(
const char* filename, AqvmBaseFileIdentifier_Identifier* identifier) {
if (filename == NULL || identifier == NULL) {
// TODO
return -1;
Expand Down Expand Up @@ -54,4 +54,22 @@ uint32_t AqvmBaseFileIdentifier_GetIdentifierHash(
// TODO
return 0;
#endif
}

bool AqvmBaseFileIdentifier_IsEqual(
const AqvmBaseFileIdentifier_Identifier* identifier1,
const AqvmBaseFileIdentifier_Identifier* identifier2) {
if (identifier1 == NULL || identifier2 == NULL) {
// TODO
return false;
}

#ifdef __unix__
return AqvmBaseFileIdentifierUnix_IsEqual(identifier1, identifier2);
#elif _WIN32
return AqvmBaseFileIdentifierWindows_IsEqual(identifier1, identifier2);
#else
// TODO
return false;
#endif
}
15 changes: 11 additions & 4 deletions aqvm/base/file/identifier/identifier.h
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
#ifndef AQ_AQVM_BASE_FILE_IDENTIFIER_IDENTIFIER_H_
#define AQ_AQVM_BASE_FILE_IDENTIFIER_IDENTIFIER_H_

#include <stdbool.h>
#include <stdint.h>

#ifdef __unix__
Expand All @@ -16,14 +17,20 @@
#ifdef __unix__
typedef AqvmBaseFileIdentifierUnix_Identifier AqvmBaseFileIdentifier_Identifier;
#elif _WIN32
typedef AqvmBaseFileIdentifierWindows_Identifier AqvmBaseFileIdentifier_Identifier;
typedef AqvmBaseFileIdentifierWindows_Identifier
AqvmBaseFileIdentifier_Identifier;
#else
typedef void AqvmBaseFileIdentifier_Identifier;
#endif

int AqvmBaseFileIdentifier_GetIdentifier(const char* filename,
AqvmBaseFileIdentifier_Identifier* identifier);
int AqvmBaseFileIdentifier_GetIdentifier(
const char* filename, AqvmBaseFileIdentifier_Identifier* identifier);

uint32_t AqvmBaseFileIdentifier_GetIdentifierHash(const AqvmBaseFileIdentifier_Identifier* identifier);
uint32_t AqvmBaseFileIdentifier_GetIdentifierHash(
const AqvmBaseFileIdentifier_Identifier* identifier);

bool AqvmBaseFileIdentifier_IsEqual(
const AqvmBaseFileIdentifier_Identifier* identifier1,
const AqvmBaseFileIdentifier_Identifier* identifier2);

#endif
17 changes: 15 additions & 2 deletions aqvm/base/file/identifier/unix/identifier.c
Original file line number Diff line number Diff line change
Expand Up @@ -10,8 +10,8 @@

#include "aqvm/base/hash/hash.h"

int AqvmBaseFileIdentifierUnix_GetIdentifier(const char* filename,
AqvmBaseFileIdentifierUnix_Identifier* identifier) {
int AqvmBaseFileIdentifierUnix_GetIdentifier(
const char* filename, AqvmBaseFileIdentifierUnix_Identifier* identifier) {
if (filename == NULL || identifier == NULL) {
// TODO
return -1;
Expand Down Expand Up @@ -44,4 +44,17 @@ uint32_t AqvmBaseFileIdentifierUnix_GetIdentifierHash(
return AqvmBaseHash_HashUnsignedIntArray(hash, 2);
}

bool AqvmBaseFileIdentifierUnix_IsEqual(
const AqvmBaseFileIdentifier_Identifier* identifier1,
const AqvmBaseFileIdentifier_Identifier* identifier2) {
if (identifier1 == NULL || identifier2 == NULL) {
// TODO
return false;
}

if (identifier1->st_dev == identifier2->st_dev ||
identifier1->st_ino == identifier2->st_ino) {
return true;
}
return false;
#endif
9 changes: 7 additions & 2 deletions aqvm/base/file/identifier/unix/identifier.h
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
#ifndef AQ_AQVM_BASE_FILE_IDENTIFIER_UNIX_IDENTIFIER_H_
#define AQ_AQVM_BASE_FILE_IDENTIFIER_UNIX_IDENTIFIER_H_

#include <stdbool.h>
#include <stdint.h>
#include <sys/stat.h>
#include <sys/types.h>
Expand All @@ -17,12 +18,16 @@ typedef struct {
ino_t st_ino;
} AqvmBaseFileIdentifierUnix_Identifier;

int AqvmBaseFileIdentifierUnix_GetIdentifier(const char* filename,
AqvmBaseFileIdentifierUnix_Identifier* identifier);
int AqvmBaseFileIdentifierUnix_GetIdentifier(
const char* filename, AqvmBaseFileIdentifierUnix_Identifier* identifier);

uint32_t AqvmBaseFileIdentifierUnix_GetIdentifierHash(
const AqvmBaseFileIdentifierUnix_Identifier* identifier);

bool AqvmBaseFileIdentifierUnix_IsEqual(
const AqvmBaseFileIdentifier_Identifier* identifier1,
const AqvmBaseFileIdentifier_Identifier* identifier2);

#endif

#endif
20 changes: 19 additions & 1 deletion aqvm/base/file/identifier/windows/identifier.c
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,8 @@
#include "aqvm/base/hash/hash.h"

int AqvmBaseFileIdentifierWindows_GetIdentifier(
const char* filename, AqvmBaseFileIdentifierWindows_Identifier* identifier) {
const char* filename,
AqvmBaseFileIdentifierWindows_Identifier* identifier) {
if (filename == NULL || identifier == NULL) {
// TODO
return -1;
Expand Down Expand Up @@ -55,4 +56,21 @@ uint32_t AqvmBaseFileIdentifierWindows_GetIdentifierHash(

return AqvmBaseHash_HashUnsignedIntArray(hash, 3);
}

bool AqvmBaseFileIdentifierWindows_IsEqual(
const AqvmBaseFileIdentifier_Identifier* identifier1,
const AqvmBaseFileIdentifier_Identifier* identifier2) {
if (identifier1 == NULL || identifier2 == NULL) {
// TODO
return false;
}

if (identifier1->dwVolumeSerialNumber == identifier2->dwVolumeSerialNumber ||
identifier1->nFileIndexHigh == identifier2->nFileIndexHigh ||
identifier1->nFileIndexLow == identifier2->nFileIndexLow) {
return true;
}
return false;
}

#endif
5 changes: 5 additions & 0 deletions aqvm/base/file/identifier/windows/identifier.h
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
#ifndef AQ_AQVM_BASE_FILE_IDENTIFIER_WINDOWS_IDENTIFIER_H_
#define AQ_AQVM_BASE_FILE_IDENTIFIER_WINDOWS_IDENTIFIER_H_

#include <stdbool.h>
#include <stdint.h>
#include <windows.h>

Expand All @@ -23,5 +24,9 @@ int AqvmBaseFileIdentifierWindows_GetIdentifier(
uint32_t AqvmBaseFileIdentifierWindows_GetIdentifierHash(
const AqvmBaseFileIdentifierWindows_Identifier* identifier);

bool AqvmBaseFileIdentifierWindows_IsEqual(
const AqvmBaseFileIdentifier_Identifier* identifier1,
const AqvmBaseFileIdentifier_Identifier* identifier2);

#endif
#endif
48 changes: 28 additions & 20 deletions aqvm/base/threading/file_lock/file_lock.c
Original file line number Diff line number Diff line change
Expand Up @@ -41,27 +41,33 @@ int AqvmBaseThreadingFileLock_AddFileLock(struct AqvmBaseFile_File* file) {
return -1;
}

struct AqvmBase_Pair* file_lock_pair =
(struct AqvmBase_Pair*)malloc(sizeof(struct AqvmBase_Pair));
if (file_lock_pair == NULL) {
// TODO
return -2;
}
file_lock_pair->key = file->identifier;
file_lock_pair->value = file->lock;
if (AqvmBaseLinkedList_AddNode(
&AqvmBaseThreadingFileLock_fileLockTable
.data[AqvmBaseFileIdentifier_GetIdentifierHash(
&file->identifier) %
1024],
file_lock_pair) != 0) {
// TODO
return -3;
file->lock = AqvmBaseThreadingFileLock_GetFileLock(file);
if (file->lock == NULL) {
struct AqvmBase_Pair* file_lock_pair =
(struct AqvmBase_Pair*)malloc(sizeof(struct AqvmBase_Pair));
if (file_lock_pair == NULL) {
// TODO
return -2;
}
file_lock_pair->key = file->identifier;
file_lock_pair->value = file->lock;
if (AqvmBaseLinkedList_AddNode(
&AqvmBaseThreadingFileLock_fileLockTable
.data[AqvmBaseFileIdentifier_GetIdentifierHash(
file->identifier) %
1024],
file_lock_pair) != 0) {
// TODO
free(file_lock_pair);
return -3;
}
}
++file->lock->lock_count;
return 0;
}

int AqvmBaseThreadingFileLock_RemoveFileLock(struct AqvmBaseFile_File* file) {
// TODO
if (file == NULL) {
// TODO
return -1;
Expand All @@ -77,15 +83,17 @@ AqvmBaseThreadingFileLock_GetFileLock(struct AqvmBaseFile_File* file) {

struct AqvmBaseLinkedList_LinkedList* linked_list =
&AqvmBaseThreadingFileLock_fileLockTable
.data[AqvmBaseFileIdentifier_GetIdentifierHash(&file->identifier) %
.data[AqvmBaseFileIdentifier_GetIdentifierHash(file->identifier) %
1024];
struct AqvmBaseLinkedList_Node* node = linked_list->head;

struct AqvmBaseFileReadWriteLock_ReadWriteLock* lock = NULL;
while (node != NULL) {
if (*file->identifier ==
*(AqvmBaseFileIdentifier_Identifier*)((struct AqvmBase_Pair*)node->data)
->key) {
if (AqvmBaseFileIdentifier_IsEqual(
file->identifier,
(AqvmBaseFileIdentifier_Identifier*)((struct AqvmBase_Pair*)
node->data)
->key)) {
lock = (struct
AqvmBaseFileReadWriteLock_ReadWriteLock*)((struct AqvmBase_Pair*)
node->data)
Expand Down

0 comments on commit 09d4dc5

Please sign in to comment.