OSDN Git Service

b0a6dc337fdd961a88928ac297d901372990cfab
[pf3gnuchains/gcc-fork.git] / libgo / runtime / thread-sema.c
1 // Copyright 2009 The Go Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style
3 // license that can be found in the LICENSE file.
4
5 #include "runtime.h"
6
7 #include <errno.h>
8 #include <stdlib.h>
9 #include <time.h>
10 #include <semaphore.h>
11
12 /* Create a semaphore.  */
13
14 uintptr
15 runtime_semacreate(void)
16 {
17   sem_t *p;
18
19   /* Call malloc rather than runtime_malloc.  This will allocate space
20      on the C heap.  We can't call runtime_malloc here because it
21      could cause a deadlock.  */
22   p = malloc (sizeof (sem_t));
23   if (sem_init (p, 0, 0) != 0)
24     runtime_throw ("sem_init");
25   return (uintptr) p;
26 }
27
28 /* Acquire m->waitsema.  */
29
30 int32
31 runtime_semasleep (int64 ns)
32 {
33   int r;
34
35   if (ns >= 0)
36     {
37       struct timespec ts;
38
39       ns += runtime_nanotime ();
40       ts.tv_sec = ns / 1000000000LL;
41       ts.tv_nsec = ns % 1000000000LL;
42       r = sem_timedwait ((sem_t *) m->waitsema, &ts);
43       if (r != 0)
44         {
45           if (errno == ETIMEDOUT || errno == EINTR)
46             return -1;
47           runtime_throw ("sema_timedwait");
48         }
49       return 0;
50     }
51
52   while (sem_wait ((sem_t *) m->waitsema) != 0)
53     {
54       if (errno == EINTR)
55         continue;
56       runtime_throw ("sem_wait");
57     }
58
59   return 0;
60 }
61
62 /* Wake up mp->waitsema.  */
63
64 void
65 runtime_semawakeup (M *mp)
66 {
67   if (sem_post ((sem_t *) mp->waitsema) != 0)
68     runtime_throw ("sem_post");
69 }
70
71 void
72 runtime_osinit(void)
73 {
74 }