Update Sparc ULPs.
[platform/upstream/glibc.git] / nptl_db / td_ta_clear_event.c
1 /* Globally disable events.
2    Copyright (C) 1999-2013 Free Software Foundation, Inc.
3    This file is part of the GNU C Library.
4    Contributed by Ulrich Drepper <drepper@redhat.com>, 1999.
5
6    The GNU C Library is free software; you can redistribute it and/or
7    modify it under the terms of the GNU Lesser General Public
8    License as published by the Free Software Foundation; either
9    version 2.1 of the License, or (at your option) any later version.
10
11    The GNU C Library is distributed in the hope that it will be useful,
12    but WITHOUT ANY WARRANTY; without even the implied warranty of
13    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14    Lesser General Public License for more details.
15
16    You should have received a copy of the GNU Lesser General Public
17    License along with the GNU C Library; if not, see
18    <http://www.gnu.org/licenses/>.  */
19
20 #include "thread_dbP.h"
21
22
23 td_err_e
24 td_ta_clear_event (ta_arg, event)
25      const td_thragent_t *ta_arg;
26      td_thr_events_t *event;
27 {
28   td_thragent_t *const ta = (td_thragent_t *) ta_arg;
29   td_err_e err;
30   psaddr_t eventmask = 0;
31   void *copy = NULL;
32
33   LOG ("td_ta_clear_event");
34
35   /* Test whether the TA parameter is ok.  */
36   if (! ta_ok (ta))
37     return TD_BADTA;
38
39   /* Fetch the old event mask from the inferior and modify it in place.  */
40   err = DB_GET_SYMBOL (eventmask, ta, __nptl_threads_events);
41   if (err == TD_OK)
42     err = DB_GET_STRUCT (copy, ta, eventmask, td_thr_events_t);
43   if (err == TD_OK)
44     {
45       uint32_t idx;
46       for (idx = 0; idx < TD_EVENTSIZE; ++idx)
47         {
48           psaddr_t word;
49           uint32_t mask;
50           err = DB_GET_FIELD_LOCAL (word, ta, copy,
51                                     td_thr_events_t, event_bits, idx);
52           if (err != TD_OK)
53             break;
54           mask = (uintptr_t) word;
55           mask &= ~event->event_bits[idx];
56           word = (psaddr_t) (uintptr_t) mask;
57           err = DB_PUT_FIELD_LOCAL (ta, copy,
58                                     td_thr_events_t, event_bits, idx, word);
59           if (err != TD_OK)
60             break;
61         }
62       if (err == TD_NOAPLIC)
63         {
64           err = TD_OK;
65           while (idx < TD_EVENTSIZE)
66             if (event->event_bits[idx++] != 0)
67               {
68                 err = TD_NOEVENT;
69                 break;
70               }
71         }
72       if (err == TD_OK)
73         /* Now write it back to the inferior.  */
74         err = DB_PUT_STRUCT (ta, eventmask, td_thr_events_t, copy);
75     }
76
77   return err;
78 }