diff options
author | Corinna Vinschen <corinna@vinschen.de> | 2014-08-22 13:21:33 +0400 |
---|---|---|
committer | Corinna Vinschen <corinna@vinschen.de> | 2014-08-22 13:21:33 +0400 |
commit | 3f3bd10104550243781f0b4d9248975e35d91ac7 (patch) | |
tree | c7ac2839d2c3da2321bd9979a1574667ed39bc26 /winsup/cygwin/msg.cc | |
parent | 33ed7bb5bc2cb41259df064229968933d9c898ca (diff) |
* Throughout, use __try/__except/__endtry blocks, rather than myfault
handler.
* cygtls.cc (_cygtls::remove): Accommodate the fact that pathbufs
has been moved from _local_storage to _cygtls.
* cygtls.h (class tls_pathbuf): Add comment to hint to gendef usage
of counters. Change type of counters to uint32_t for clarity.
Remove _cygtls as friend class.
(struct _local_storage): Move pathbufs from here...
(struct _cygtls): ...to here, allowing to access it from _sigbe.
(class san): Only define on 32 bit. Remove errno, _c_cnt and _w_cnt
members.
(san::setup): Drop parameter. Don't initialize removed members.
(san::leave): Don't set removed members.
(class myfault): Only define on 32 bit.
(myfault::faulted): Only keep implementation not taking any parameter.
Drop argument in call to sebastian.setup.
(__try/__leave/__except/__endtry): Implement to support real SEH. For
now stick to SJLJ on 32 bit.
* dcrt0.cc (dll_crt0_0): Drop 64 bit call to
exception::install_myfault_handler.
* exception.h (exception_handler): Define with EXCEPTION_DISPOSITION
as return type.
(PDISPATCHER_CONTEXT): Define as void * on 32 bit. Define as pointer
to _DISPATCHER_CONTEXT on 64 bit.
(class exception): Define separately for 32 and 64 bit.
(exception::myfault): Add handler for myfault SEH handling on 64 bit.
(exception::exception): Fix mangled method name to account for change
in type of last parameter.
(exception::install_myfault_handler): Remove.
* exceptions.cc (exception::myfault_handle): Remove.
(exception::myfault): New SEH handler for 64 bit.
* gendef (_sigbe): Set tls_pathbuf counters to 0 explicitely when
returning to the caller.
* ntdll.h: Move a comment to a better place.
(struct _SCOPE_TABLE): Define on 64 bit.
* thread.cc (verifyable_object_isvalid): Remove gcc 4.7 workaround.
* tls_pbuf.cc (tls_pbuf): Fix to accommodate new place of pathbufs.
(tls_pathbuf::destroy): Change type of loop variables to uint32_t.
* tls_pbuf.h (class tmp_pathbuf): Change type of buffer counters to
uint32_t. Accommodate new place of pathbufs.
* tlsoffsets.h: Regenerate.
* tlsoffsets64.h: Regenerate.
Diffstat (limited to 'winsup/cygwin/msg.cc')
-rw-r--r-- | winsup/cygwin/msg.cc | 114 |
1 files changed, 61 insertions, 53 deletions
diff --git a/winsup/cygwin/msg.cc b/winsup/cygwin/msg.cc index f970121c9..5505dc453 100644 --- a/winsup/cygwin/msg.cc +++ b/winsup/cygwin/msg.cc @@ -1,6 +1,6 @@ /* msg.cc: XSI IPC interface for Cygwin. - Copyright 2002, 2003, 2004, 2005, 2008, 2009 Red Hat, Inc. + Copyright 2002, 2003, 2004, 2005, 2008, 2009, 2014 Red Hat, Inc. This file is part of Cygwin. @@ -91,38 +91,40 @@ client_request_msg::client_request_msg (int msqid, extern "C" int msgctl (int msqid, int cmd, struct msqid_ds *buf) { - syscall_printf ("msgctl (msqid = %d, cmd = %y, buf = %p)", - msqid, cmd, buf); - myfault efault; - if (efault.faulted (EFAULT)) - return -1; - switch (cmd) + syscall_printf ("msgctl (msqid = %d, cmd = %y, buf = %p)", msqid, cmd, buf); + __try { - case IPC_STAT: - break; - case IPC_SET: - break; - case IPC_RMID: - break; - case IPC_INFO: - break; - case MSG_INFO: - break; - default: - syscall_printf ("-1 [%d] = msgctl ()", EINVAL); - set_errno (EINVAL); - return -1; + switch (cmd) + { + case IPC_STAT: + break; + case IPC_SET: + break; + case IPC_RMID: + break; + case IPC_INFO: + break; + case MSG_INFO: + break; + default: + syscall_printf ("-1 [%d] = msgctl ()", EINVAL); + set_errno (EINVAL); + __leave; + } + client_request_msg request (msqid, cmd, buf); + if (request.make_request () == -1 || request.retval () == -1) + { + syscall_printf ("-1 [%d] = msgctl ()", request.error_code ()); + set_errno (request.error_code ()); + if (request.error_code () == ENOSYS) + raise (SIGSYS); + __leave; + } + return request.retval (); } - client_request_msg request (msqid, cmd, buf); - if (request.make_request () == -1 || request.retval () == -1) - { - syscall_printf ("-1 [%d] = msgctl ()", request.error_code ()); - set_errno (request.error_code ()); - if (request.error_code () == ENOSYS) - raise (SIGSYS); - return -1; - } - return request.retval (); + __except (EFAULT) {} + __endtry + return -1; } extern "C" int @@ -147,19 +149,22 @@ msgrcv (int msqid, void *msgp, size_t msgsz, long msgtyp, int msgflg) syscall_printf ("msgrcv (msqid = %d, msgp = %p, msgsz = %ld, " "msgtyp = %d, msgflg = %y)", msqid, msgp, msgsz, msgtyp, msgflg); - myfault efault; - if (efault.faulted (EFAULT)) - return -1; - client_request_msg request (msqid, msgp, msgsz, msgtyp, msgflg); - if (request.make_request () == -1 || request.rcvval () == -1) + __try { - syscall_printf ("-1 [%d] = msgrcv ()", request.error_code ()); - set_errno (request.error_code ()); - if (request.error_code () == ENOSYS) - raise (SIGSYS); - return -1; + client_request_msg request (msqid, msgp, msgsz, msgtyp, msgflg); + if (request.make_request () == -1 || request.rcvval () == -1) + { + syscall_printf ("-1 [%d] = msgrcv ()", request.error_code ()); + set_errno (request.error_code ()); + if (request.error_code () == ENOSYS) + raise (SIGSYS); + __leave; + } + return request.rcvval (); } - return request.rcvval (); + __except (EFAULT) {} + __endtry + return -1; } extern "C" int @@ -167,17 +172,20 @@ msgsnd (int msqid, const void *msgp, size_t msgsz, int msgflg) { syscall_printf ("msgsnd (msqid = %d, msgp = %p, msgsz = %ld, msgflg = %y)", msqid, msgp, msgsz, msgflg); - myfault efault; - if (efault.faulted (EFAULT)) - return -1; - client_request_msg request (msqid, msgp, msgsz, msgflg); - if (request.make_request () == -1 || request.retval () == -1) + __try { - syscall_printf ("-1 [%d] = msgsnd ()", request.error_code ()); - set_errno (request.error_code ()); - if (request.error_code () == ENOSYS) - raise (SIGSYS); - return -1; + client_request_msg request (msqid, msgp, msgsz, msgflg); + if (request.make_request () == -1 || request.retval () == -1) + { + syscall_printf ("-1 [%d] = msgsnd ()", request.error_code ()); + set_errno (request.error_code ()); + if (request.error_code () == ENOSYS) + raise (SIGSYS); + __leave; + } + return request.retval (); } - return request.retval (); + __except (EFAULT) {} + __endtry + return -1; } |