1+ #include " standard.h"
2+
3+ CallOpen::CallOpen (v8::Local<v8::String> filename, v8::Local<v8::Function> pcb): WSfilename(reinterpret_cast <wchar_t *>(v8::String::Value(filename).operator*())), pcb(v8::Persistent<v8::Function>::New(pcb)) {
4+ // typeNum = stypeNum;
5+ _InterlockedIncrement (&outStandingCallbacks);
6+ // PostQueuedCompletionStatus();
7+ // iocpCall.postEmptyLambda(static_cbfuncB, this);
8+ }
9+
10+ void CallOpen::call () {
11+ DWORD bytesWritten = 0 ;
12+ QueryPerformanceCounter (&tickStart);
13+ HANDLE handle;
14+ #define USE_OVERLAPPED
15+ #ifdef USE_OVERLAPPED
16+ mThrowFailure (handle = CreateFile (WSfilename.c_str (), GENERIC_WRITE, FILE_SHARE_DELETE | FILE_SHARE_READ | FILE_SHARE_WRITE, nullptr , CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL | FILE_ATTRIBUTE_TEMPORARY | FILE_FLAG_SEQUENTIAL_SCAN | FILE_FLAG_OVERLAPPED, nullptr ));
17+ #else
18+ mThrowFailure (handle = CreateFile (WSfilename.c_str (), GENERIC_WRITE, FILE_SHARE_DELETE | FILE_SHARE_READ | FILE_SHARE_WRITE, nullptr , CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL | FILE_ATTRIBUTE_TEMPORARY | FILE_FLAG_SEQUENTIAL_SCAN, nullptr ));
19+ #endif
20+ auto tcb = [this ]() {
21+ puts (" tcb" );
22+ DebugBreak ();
23+ };
24+ // iocpCall.addHandle(reinterpret_cast<HANDLE>(handle), reinterpret_cast<ULONG_PTR>(&tcb));
25+ #undef USE_OVERLAPPED
26+ mThrowFailure (QueryPerformanceCounter (&tickEnd));
27+ // _InterlockedAdd64(&totalCounter, tickEnd.QuadPart - tickStart.QuadPart);
28+ csIsolate->protectedScope ([this , handle](){
29+ v8::Isolate* isolate = v8::Isolate::GetCurrent (); v8::HandleScope scope (isolate);
30+ v8::Handle<v8::Value> args[2 ] = {v8::Undefined (isolate), v8::Uint32::NewFromUnsigned (isolate, reinterpret_cast <uint32_t >(handle))};
31+ auto cb = v8::Local<v8::Function>::New (isolate, pcb);
32+ pcb.Dispose ();
33+ delete this ;
34+ cb->Call (v8::Context::GetCurrent ()->Global (), ARRAYSIZE (args), args);
35+ _InterlockedDecrement (&outStandingCallbacks);
36+ });
37+ }
38+
39+ void CallOpen::empty () {
40+ }
41+
42+ void CallOpen::call (const v8::FunctionCallbackInfo<v8::Value>& info) {
43+ if (info.Length () < 3 ) { return ; }
44+ if (!info[0 ]->IsString ()) { return ; }
45+ if (!info[1 ]->IsString ()) { return ; }
46+ if (!info[2 ]->IsFunction ()) { return ; }
47+ v8::Isolate* isolate = v8::Isolate::GetCurrent (); v8::HandleScope scope (isolate);
48+ // push(new CallOpen(v8::Local<v8::String>::Cast(info[0]), v8::Local<v8::Function>::Cast(info[2])));
49+ auto item = new CallOpen (v8::Local<v8::String>::Cast (info[0 ]), v8::Local<v8::Function>::Cast (info[2 ]));
50+ iocpCall.postEmptyLambda ([](ULONG_PTR item){
51+ ((CallOpen*)item)->call ();
52+ }, (ULONG_PTR)item);
53+ // fixme
54+ return ;
55+ }
56+
57+ void CallOpen::cbfunc (DWORD bytes, ULONG_PTR key) {
58+ printf (" CallOpen(%p)::cbfunc(%u, %I64u);\n " , this , bytes, key);
59+ call ();
60+ }
61+
62+ void CallOpen::static_cbfunc (CallOpen *obj, DWORD bytes, ULONG_PTR key) {
63+ printf (" CallOpen::static_cbfunc(%p, %u, %I64u);\n " , obj, bytes, key);
64+ obj->cbfunc (bytes, key);
65+ }
66+
67+ void func_fs_openSync (const v8::FunctionCallbackInfo<v8::Value>& info) {
68+ if (info.Length () < 2 ) { return ; }
69+ if (!info[0 ]->IsString ()) { return ; }
70+ if (!info[1 ]->IsString ()) { return ; }
71+ v8::Isolate* isolate = v8::Isolate::GetCurrent (); v8::HandleScope scope (isolate);
72+
73+ HANDLE handle;
74+ mThrowFailure (handle = CreateFile (reinterpret_cast <wchar_t *>(v8::String::Value (v8::Local<v8::String>::Cast (info[0 ])).operator *()), GENERIC_WRITE, FILE_SHARE_DELETE | FILE_SHARE_READ | FILE_SHARE_WRITE, nullptr , CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL | FILE_ATTRIBUTE_TEMPORARY | FILE_FLAG_SEQUENTIAL_SCAN | FILE_FLAG_OVERLAPPED, nullptr ));
75+ return scope.Close (v8::Uint32::NewFromUnsigned (reinterpret_cast <uint32_t >(handle)));
76+ }
0 commit comments