Skip to content
This repository has been archived by the owner on May 4, 2018. It is now read-only.

Commit

Permalink
Browse files Browse the repository at this point in the history
windows: inline a couple of inline request functions
  • Loading branch information
piscisaureus committed Jun 2, 2012
1 parent ed30365 commit d402604
Show file tree
Hide file tree
Showing 17 changed files with 194 additions and 162 deletions.
1 change: 1 addition & 0 deletions src/win/async.c
Expand Up @@ -23,6 +23,7 @@

#include "uv.h"
#include "internal.h"
#include "req-inl.h"


/* Atomic set operation on char */
Expand Down
1 change: 1 addition & 0 deletions src/win/core.c
Expand Up @@ -28,6 +28,7 @@

#include "uv.h"
#include "internal.h"
#include "req-inl.h"


/* The only event loop we support right now */
Expand Down
7 changes: 4 additions & 3 deletions src/win/fs-event.c
Expand Up @@ -19,15 +19,16 @@
* IN THE SOFTWARE.
*/

#include "uv.h"
#include "internal.h"

#include <assert.h>
#include <malloc.h>
#include <errno.h>
#include <stdio.h>
#include <string.h>

#include "uv.h"
#include "internal.h"
#include "req-inl.h"


const unsigned int uv_directory_watcher_buffer_size = 4096;

Expand Down
2 changes: 2 additions & 0 deletions src/win/fs.c
Expand Up @@ -32,6 +32,8 @@

#include "uv.h"
#include "internal.h"
#include "req-inl.h"


#define UV_FS_ASYNC_QUEUED 0x0001
#define UV_FS_FREE_PATH 0x0002
Expand Down
1 change: 1 addition & 0 deletions src/win/getaddrinfo.c
Expand Up @@ -24,6 +24,7 @@

#include "uv.h"
#include "internal.h"
#include "req-inl.h"


/*
Expand Down
9 changes: 1 addition & 8 deletions src/win/internal.h
Expand Up @@ -146,15 +146,8 @@ void uv_handle_init(uv_loop_t* loop, uv_handle_t* handle);


/*
* Requests
* Requests (also see req-inl.h)
*/
void uv_req_init(uv_loop_t* loop, uv_req_t* req);

uv_req_t* uv_overlapped_to_req(OVERLAPPED* overlapped);

void uv_insert_pending_req(uv_loop_t* loop, uv_req_t* req);
void uv_process_reqs(uv_loop_t* loop);

#define POST_COMPLETION_FOR_REQ(loop, req) \
if (!PostQueuedCompletionStatus((loop)->iocp, \
0, \
Expand Down
1 change: 1 addition & 0 deletions src/win/pipe.c
Expand Up @@ -26,6 +26,7 @@

#include "uv.h"
#include "internal.h"
#include "req-inl.h"


/* A zero-size buffer for use by uv_pipe_read */
Expand Down
6 changes: 3 additions & 3 deletions src/win/poll.c
Expand Up @@ -19,12 +19,12 @@
* IN THE SOFTWARE.
*/

#include <assert.h>
#include <io.h>

#include "uv.h"
#include "internal.h"

#include <assert.h>
#include <io.h>
#include "req-inl.h"


static const GUID uv_msafd_provider_ids[UV_MSAFD_PROVIDER_COUNT] = {
Expand Down
8 changes: 4 additions & 4 deletions src/win/process.c
Expand Up @@ -19,15 +19,15 @@
* IN THE SOFTWARE.
*/

#include "uv.h"
#include "internal.h"

#include <assert.h>
#include <io.h>
#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <windows.h>

#include "uv.h"
#include "internal.h"
#include "req-inl.h"


#define SIGKILL 9
Expand Down
169 changes: 169 additions & 0 deletions src/win/req-inl.h
@@ -0,0 +1,169 @@
/* Copyright Joyent, Inc. and other Node contributors. All rights reserved.
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to
* deal in the Software without restriction, including without limitation the
* rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
* sell copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
* IN THE SOFTWARE.
*/

#include <assert.h>

#include "uv.h"
#include "internal.h"


INLINE static void uv_req_init(uv_loop_t* loop, uv_req_t* req) {
loop->counters.req_init++;
req->type = UV_UNKNOWN_REQ;
SET_REQ_SUCCESS(req);
}


INLINE static uv_req_t* uv_overlapped_to_req(OVERLAPPED* overlapped) {
return CONTAINING_RECORD(overlapped, uv_req_t, overlapped);
}


INLINE static void uv_insert_pending_req(uv_loop_t* loop, uv_req_t* req) {
req->next_req = NULL;
if (loop->pending_reqs_tail) {
req->next_req = loop->pending_reqs_tail->next_req;
loop->pending_reqs_tail->next_req = req;
loop->pending_reqs_tail = req;
} else {
req->next_req = req;
loop->pending_reqs_tail = req;
}
}


#define DELEGATE_STREAM_REQ(loop, req, method, handle_at) \
do { \
switch (((uv_handle_t*) (req)->handle_at)->type) { \
case UV_TCP: \
uv_process_tcp_##method##_req(loop, \
(uv_tcp_t*) ((req)->handle_at), \
req); \
break; \
\
case UV_NAMED_PIPE: \
uv_process_pipe_##method##_req(loop, \
(uv_pipe_t*) ((req)->handle_at), \
req); \
break; \
\
case UV_TTY: \
uv_process_tty_##method##_req(loop, \
(uv_tty_t*) ((req)->handle_at), \
req); \
break; \
\
default: \
assert(0); \
} \
} while (0)


INLINE static void uv_process_reqs(uv_loop_t* loop) {
uv_req_t* req;
uv_req_t* first;
uv_req_t* next;

if (loop->pending_reqs_tail == NULL) {
return;
}

first = loop->pending_reqs_tail->next_req;
next = first;
loop->pending_reqs_tail = NULL;

while (next != NULL) {
req = next;
next = req->next_req != first ? req->next_req : NULL;

switch (req->type) {
case UV_READ:
DELEGATE_STREAM_REQ(loop, req, read, data);
break;

case UV_WRITE:
DELEGATE_STREAM_REQ(loop, (uv_write_t*) req, write, handle);
break;

case UV_ACCEPT:
DELEGATE_STREAM_REQ(loop, req, accept, data);
break;

case UV_CONNECT:
DELEGATE_STREAM_REQ(loop, (uv_connect_t*) req, connect, handle);
break;

case UV_SHUTDOWN:
/* Tcp shutdown requests don't come here. */
assert(((uv_shutdown_t*) req)->handle->type == UV_NAMED_PIPE);
uv_process_pipe_shutdown_req(
loop,
(uv_pipe_t*) ((uv_shutdown_t*) req)->handle,
(uv_shutdown_t*) req);
break;

case UV_UDP_RECV:
uv_process_udp_recv_req(loop, (uv_udp_t*) req->data, req);
break;

case UV_UDP_SEND:
uv_process_udp_send_req(loop,
((uv_udp_send_t*) req)->handle,
(uv_udp_send_t*) req);
break;

case UV_WAKEUP:
uv_process_async_wakeup_req(loop, (uv_async_t*) req->data, req);
break;

case UV_POLL_REQ:
uv_process_poll_req(loop, (uv_poll_t*) req->data, req);
break;

case UV_GETADDRINFO:
uv_process_getaddrinfo_req(loop, (uv_getaddrinfo_t*) req);
break;

case UV_PROCESS_EXIT:
uv_process_proc_exit(loop, (uv_process_t*) req->data);
break;

case UV_PROCESS_CLOSE:
uv_process_proc_close(loop, (uv_process_t*) req->data);
break;

case UV_FS:
uv_process_fs_req(loop, (uv_fs_t*) req);
break;

case UV_WORK:
uv_process_work_req(loop, (uv_work_t*) req);
break;

case UV_FS_EVENT_REQ:
uv_process_fs_event_req(loop, req, (uv_fs_event_t*) req->data);
break;

default:
assert(0);
}
}
}

0 comments on commit d402604

Please sign in to comment.