mirror of
https://github.com/osnr/TabFS.git
synced 2024-05-17 21:16:35 +02:00
URL and title kind of work.
direct_io option makes it reliably change. Big speedup from... removing prints. Did I even need multithreading?
This commit is contained in:
parent
c8fad64066
commit
e734173e6f
|
@ -88,25 +88,31 @@ const router = {
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
async open(path) {
|
async open(path) {
|
||||||
return fhManager.allocate(await getTab(parseInt(pathComponent(path, -2))));
|
return 0;
|
||||||
},
|
},
|
||||||
async read(path, fh, size, offset) {
|
async read(path, fh, size, offset) {
|
||||||
const tab = fhManager.ref(fh);
|
const tab = await getTab(parseInt(pathComponent(path, -2)));
|
||||||
return tab.url.substr(offset, size);
|
return (tab.url + "\n").substr(offset, size);
|
||||||
},
|
},
|
||||||
async release(path, fh) {
|
async release(path, fh) {}
|
||||||
fhManager.free(fh);
|
},
|
||||||
}
|
"title": {
|
||||||
|
async getattr() {
|
||||||
|
return {
|
||||||
|
st_mode: unix.S_IFREG | 0444,
|
||||||
|
st_nlink: 1,
|
||||||
|
st_size: 1000 // FIXME
|
||||||
|
};
|
||||||
|
},
|
||||||
|
async open(path) {
|
||||||
|
return 0;
|
||||||
|
},
|
||||||
|
async read(path, fh, size, offset) {
|
||||||
|
const tab = await getTab(parseInt(pathComponent(path, -2)));
|
||||||
|
return (tab.title + "\n").substr(offset, size);
|
||||||
|
},
|
||||||
|
async release(path, fh) {}
|
||||||
},
|
},
|
||||||
/* "title": fileFromProperty('title'),
|
|
||||||
* "sources": folderFromResource(
|
|
||||||
* (tab, path) => new Promise(resolve => chrome.debugger.attach(
|
|
||||||
* { tabId: tab.id }, "1-3", resolve)),
|
|
||||||
* {
|
|
||||||
* readdir() {
|
|
||||||
|
|
||||||
* }
|
|
||||||
* }*/
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -160,7 +166,7 @@ ws.onmessage = async function(event) {
|
||||||
const req = JSON.parse(event.data);
|
const req = JSON.parse(event.data);
|
||||||
|
|
||||||
let response = { op: req.op, error: unix.EIO };
|
let response = { op: req.op, error: unix.EIO };
|
||||||
console.time(req.op + ':' + req.path);
|
/* console.time(req.op + ':' + req.path);*/
|
||||||
try {
|
try {
|
||||||
if (req.op === 'getattr') {
|
if (req.op === 'getattr') {
|
||||||
response = {
|
response = {
|
||||||
|
@ -202,7 +208,7 @@ ws.onmessage = async function(event) {
|
||||||
error: e instanceof UnixError ? e.error : unix.EIO
|
error: e instanceof UnixError ? e.error : unix.EIO
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
console.timeEnd(req.op + ':' + req.path);
|
/* console.timeEnd(req.op + ':' + req.path);*/
|
||||||
|
|
||||||
response.id = req.id;
|
response.id = req.id;
|
||||||
ws.send(JSON.stringify(response));
|
ws.send(JSON.stringify(response));
|
||||||
|
|
|
@ -29,11 +29,9 @@ clean:
|
||||||
rm -f $(TARGETS) *.o
|
rm -f $(TARGETS) *.o
|
||||||
rm -rf *.dSYM
|
rm -rf *.dSYM
|
||||||
|
|
||||||
remount: unmount mount
|
|
||||||
|
|
||||||
unmount:
|
unmount:
|
||||||
killall -9 hello || true
|
killall -9 hello || true
|
||||||
diskutil unmount force mnt || true
|
diskutil unmount force mnt || true
|
||||||
|
|
||||||
mount: hello
|
mount: hello
|
||||||
./hello -s -f mnt
|
./hello -odirect_io -f mnt
|
||||||
|
|
45
fs/hello.c
45
fs/hello.c
|
@ -29,8 +29,11 @@ enum request_response_state {
|
||||||
|
|
||||||
struct request_response {
|
struct request_response {
|
||||||
enum request_response_state state;
|
enum request_response_state state;
|
||||||
|
|
||||||
char *request;
|
char *request;
|
||||||
cJSON *response;
|
cJSON *response;
|
||||||
|
|
||||||
|
clock_t start;
|
||||||
};
|
};
|
||||||
|
|
||||||
#define REQUEST_RESPONSE_QUEUE_SIZE 128
|
#define REQUEST_RESPONSE_QUEUE_SIZE 128
|
||||||
|
@ -54,8 +57,9 @@ static request_id enqueue_request(cJSON *req) {
|
||||||
queue[id].state = SEND_REQUEST;
|
queue[id].state = SEND_REQUEST;
|
||||||
queue[id].request = cJSON_Print(req);
|
queue[id].request = cJSON_Print(req);
|
||||||
queue[id].response = NULL;
|
queue[id].response = NULL;
|
||||||
|
queue[id].start = clock();
|
||||||
|
|
||||||
printf("%s\n", queue[id].request);
|
/* printf("%s\n", queue[id].request); */
|
||||||
|
|
||||||
pthread_mutex_unlock(&queue_mutex);
|
pthread_mutex_unlock(&queue_mutex);
|
||||||
|
|
||||||
|
@ -96,6 +100,8 @@ static cJSON *await_response(request_id id) {
|
||||||
queue[id].state = EMPTY;
|
queue[id].state = EMPTY;
|
||||||
queue[id].response = NULL;
|
queue[id].response = NULL;
|
||||||
|
|
||||||
|
/* printf("Elapsed: %f seconds\n", (double)(clock() - queue[id].start) / CLOCKS_PER_SEC); */
|
||||||
|
|
||||||
pthread_mutex_unlock(&queue_mutex);
|
pthread_mutex_unlock(&queue_mutex);
|
||||||
|
|
||||||
return resp;
|
return resp;
|
||||||
|
@ -143,7 +149,6 @@ static int
|
||||||
hello_getattr(const char *path, struct stat *stbuf)
|
hello_getattr(const char *path, struct stat *stbuf)
|
||||||
{
|
{
|
||||||
memset(stbuf, 0, sizeof(struct stat));
|
memset(stbuf, 0, sizeof(struct stat));
|
||||||
printf("\n\ngetattr(%s)\n", path);
|
|
||||||
|
|
||||||
MAKE_REQ("getattr", {
|
MAKE_REQ("getattr", {
|
||||||
cJSON_AddStringToObject(req, "path", path);
|
cJSON_AddStringToObject(req, "path", path);
|
||||||
|
@ -151,7 +156,6 @@ hello_getattr(const char *path, struct stat *stbuf)
|
||||||
JSON_GET_PROP_INT(stbuf->st_mode, "st_mode");
|
JSON_GET_PROP_INT(stbuf->st_mode, "st_mode");
|
||||||
JSON_GET_PROP_INT(stbuf->st_nlink, "st_nlink");
|
JSON_GET_PROP_INT(stbuf->st_nlink, "st_nlink");
|
||||||
JSON_GET_PROP_INT(stbuf->st_size, "st_size");
|
JSON_GET_PROP_INT(stbuf->st_size, "st_size");
|
||||||
printf("returning re getattr(%s)\n", path);
|
|
||||||
|
|
||||||
ret = 0;
|
ret = 0;
|
||||||
});
|
});
|
||||||
|
@ -175,8 +179,6 @@ static int
|
||||||
hello_readdir(const char *path, void *buf, fuse_fill_dir_t filler,
|
hello_readdir(const char *path, void *buf, fuse_fill_dir_t filler,
|
||||||
off_t offset, struct fuse_file_info *fi)
|
off_t offset, struct fuse_file_info *fi)
|
||||||
{
|
{
|
||||||
printf("\n\nreaddir(%s)\n", path);
|
|
||||||
|
|
||||||
// send {op: "readdir", path} to the websocket handler
|
// send {op: "readdir", path} to the websocket handler
|
||||||
MAKE_REQ("readdir", {
|
MAKE_REQ("readdir", {
|
||||||
cJSON_AddStringToObject(req, "path", path);
|
cJSON_AddStringToObject(req, "path", path);
|
||||||
|
@ -185,7 +187,6 @@ hello_readdir(const char *path, void *buf, fuse_fill_dir_t filler,
|
||||||
cJSON *entry;
|
cJSON *entry;
|
||||||
cJSON_ArrayForEach(entry, entries) {
|
cJSON_ArrayForEach(entry, entries) {
|
||||||
filler(buf, cJSON_GetStringValue(entry), NULL, 0);
|
filler(buf, cJSON_GetStringValue(entry), NULL, 0);
|
||||||
printf("entry: [%s]\n", cJSON_GetStringValue(entry));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
ret = 0;
|
ret = 0;
|
||||||
|
@ -265,11 +266,11 @@ websocket_frame(struct wby_con *connection, const struct wby_frame *frame, void
|
||||||
unsigned char data[131072] = {0};
|
unsigned char data[131072] = {0};
|
||||||
|
|
||||||
int i = 0;
|
int i = 0;
|
||||||
printf("WebSocket frame incoming\n");
|
/* printf("WebSocket frame incoming\n"); */
|
||||||
printf(" Frame OpCode: %d\n", frame->opcode);
|
/* printf(" Frame OpCode: %d\n", frame->opcode); */
|
||||||
printf(" Final frame?: %s\n", (frame->flags & WBY_WSF_FIN) ? "yes" : "no");
|
/* printf(" Final frame?: %s\n", (frame->flags & WBY_WSF_FIN) ? "yes" : "no"); */
|
||||||
printf(" Masked? : %s\n", (frame->flags & WBY_WSF_MASKED) ? "yes" : "no");
|
/* printf(" Masked? : %s\n", (frame->flags & WBY_WSF_MASKED) ? "yes" : "no"); */
|
||||||
printf(" Data Length : %d\n", (int) frame->payload_length);
|
/* printf(" Data Length : %d\n", (int) frame->payload_length); */
|
||||||
|
|
||||||
if ((unsigned long) frame->payload_length > sizeof(data)) {
|
if ((unsigned long) frame->payload_length > sizeof(data)) {
|
||||||
printf("Data too long!\n");
|
printf("Data too long!\n");
|
||||||
|
@ -282,17 +283,17 @@ websocket_frame(struct wby_con *connection, const struct wby_frame *frame, void
|
||||||
size_t read_size = remain > (int) sizeof buffer ? sizeof buffer : (size_t) remain;
|
size_t read_size = remain > (int) sizeof buffer ? sizeof buffer : (size_t) remain;
|
||||||
size_t k;
|
size_t k;
|
||||||
|
|
||||||
printf("%08x ", (int) i);
|
/* printf("%08x ", (int) i); */
|
||||||
if (0 != wby_read(connection, buffer, read_size))
|
if (0 != wby_read(connection, buffer, read_size))
|
||||||
break;
|
break;
|
||||||
for (k = 0; k < read_size; ++k)
|
/* for (k = 0; k < read_size; ++k) */
|
||||||
printf("%02x ", buffer[k]);
|
/* printf("%02x ", buffer[k]); */
|
||||||
for (k = read_size; k < 16; ++k)
|
/* for (k = read_size; k < 16; ++k) */
|
||||||
printf(" ");
|
/* printf(" "); */
|
||||||
printf(" | ");
|
/* printf(" | "); */
|
||||||
for (k = 0; k < read_size; ++k)
|
/* for (k = 0; k < read_size; ++k) */
|
||||||
printf("%c", isprint(buffer[k]) ? buffer[k] : '?');
|
/* printf("%c", isprint(buffer[k]) ? buffer[k] : '?'); */
|
||||||
printf("\n");
|
/* printf("\n"); */
|
||||||
for (k = 0; k < read_size; ++k)
|
for (k = 0; k < read_size; ++k)
|
||||||
data[i + k] = buffer[k];
|
data[i + k] = buffer[k];
|
||||||
i += (int)read_size;
|
i += (int)read_size;
|
||||||
|
@ -313,7 +314,7 @@ websocket_frame(struct wby_con *connection, const struct wby_frame *frame, void
|
||||||
request_id id = id_item->valueint;
|
request_id id = id_item->valueint;
|
||||||
|
|
||||||
pthread_mutex_lock(&queue_mutex);
|
pthread_mutex_lock(&queue_mutex);
|
||||||
printf("got resp");
|
|
||||||
if (queue[id].state != RECEIVE_RESPONSE) {
|
if (queue[id].state != RECEIVE_RESPONSE) {
|
||||||
printf("Got response to request in wrong state!\n");
|
printf("Got response to request in wrong state!\n");
|
||||||
exit(1);
|
exit(1);
|
||||||
|
@ -337,7 +338,7 @@ websocket_closed(struct wby_con *connection, void *userdata)
|
||||||
static void
|
static void
|
||||||
test_log(const char* text)
|
test_log(const char* text)
|
||||||
{
|
{
|
||||||
printf("[debug] %s\n", text);
|
/* printf("[debug] %s\n", text); */
|
||||||
}
|
}
|
||||||
|
|
||||||
void *websocket_main(void *threadid)
|
void *websocket_main(void *threadid)
|
||||||
|
|
Loading…
Reference in a new issue