1 | /* GIO - GLib Input, Output and Streaming Library |
2 | * |
3 | * Copyright (C) 2006-2007 Red Hat, Inc. |
4 | * |
5 | * This library is free software; you can redistribute it and/or |
6 | * modify it under the terms of the GNU Lesser General Public |
7 | * License as published by the Free Software Foundation; either |
8 | * version 2.1 of the License, or (at your option) any later version. |
9 | * |
10 | * This library is distributed in the hope that it will be useful, |
11 | * but WITHOUT ANY WARRANTY; without even the implied warranty of |
12 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
13 | * Lesser General Public License for more details. |
14 | * |
15 | * You should have received a copy of the GNU Lesser General |
16 | * Public License along with this library; if not, see <http://www.gnu.org/licenses/>. |
17 | * |
18 | * Author: Alexander Larsson <alexl@redhat.com> |
19 | */ |
20 | |
21 | #include "config.h" |
22 | |
23 | #include "gasynchelper.h" |
24 | |
25 | |
26 | /*< private > |
27 | * SECTION:gasynchelper |
28 | * @short_description: Asynchronous Helper Functions |
29 | * @include: gio/gio.h |
30 | * @see_also: #GAsyncResult |
31 | * |
32 | * Provides helper functions for asynchronous operations. |
33 | * |
34 | **/ |
35 | |
36 | #ifdef G_OS_WIN32 |
37 | gboolean |
38 | _g_win32_overlap_wait_result (HANDLE hfile, |
39 | OVERLAPPED *overlap, |
40 | DWORD *transferred, |
41 | GCancellable *cancellable) |
42 | { |
43 | GPollFD pollfd[2]; |
44 | gboolean result = FALSE; |
45 | gint num, npoll; |
46 | |
47 | #if GLIB_SIZEOF_VOID_P == 8 |
48 | pollfd[0].fd = (gint64)overlap->hEvent; |
49 | #else |
50 | pollfd[0].fd = (gint)overlap->hEvent; |
51 | #endif |
52 | pollfd[0].events = G_IO_IN; |
53 | num = 1; |
54 | |
55 | if (g_cancellable_make_pollfd (cancellable, &pollfd[1])) |
56 | num++; |
57 | |
58 | loop: |
59 | npoll = g_poll (pollfd, num, -1); |
60 | if (npoll <= 0) |
61 | /* error out, should never happen */ |
62 | goto end; |
63 | |
64 | if (g_cancellable_is_cancelled (cancellable)) |
65 | { |
66 | /* CancelIO only cancels pending operations issued by the |
67 | * current thread and since we're doing only sync operations, |
68 | * this is safe.... */ |
69 | /* CancelIoEx is only Vista+. Since we have only one overlap |
70 | * operation on this thread, we can just use: */ |
71 | result = CancelIo (hfile); |
72 | g_warn_if_fail (result); |
73 | } |
74 | |
75 | result = GetOverlappedResult (overlap->hEvent, overlap, transferred, FALSE); |
76 | if (result == FALSE && |
77 | GetLastError () == ERROR_IO_INCOMPLETE && |
78 | !g_cancellable_is_cancelled (cancellable)) |
79 | goto loop; |
80 | |
81 | end: |
82 | if (num > 1) |
83 | g_cancellable_release_fd (cancellable); |
84 | |
85 | return result; |
86 | } |
87 | #endif |
88 | |