1*2f698edbSchristos /* $NetBSD: pthread.c,v 1.3 2014/01/26 21:43:45 christos Exp $ */
2dbd550edSchristos /*-
3dbd550edSchristos * Copyright (c) 2000
4dbd550edSchristos * Sven Verdoolaege. All rights reserved.
5dbd550edSchristos *
6dbd550edSchristos * See the LICENSE file for redistribution information.
7dbd550edSchristos */
8dbd550edSchristos
9dbd550edSchristos #include "config.h"
10dbd550edSchristos
11*2f698edbSchristos #include <sys/cdefs.h>
12*2f698edbSchristos #if 0
13dbd550edSchristos #ifndef lint
14dbd550edSchristos static const char sccsid[] = "Id: pthread.c,v 1.4 2000/07/22 14:52:37 skimo Exp (Berkeley) Date: 2000/07/22 14:52:37 ";
15dbd550edSchristos #endif /* not lint */
16*2f698edbSchristos #else
17*2f698edbSchristos __RCSID("$NetBSD: pthread.c,v 1.3 2014/01/26 21:43:45 christos Exp $");
18*2f698edbSchristos #endif
19dbd550edSchristos
20dbd550edSchristos #include <sys/types.h>
21dbd550edSchristos #include <sys/queue.h>
22dbd550edSchristos
23dbd550edSchristos #include <bitstring.h>
24dbd550edSchristos #include <ctype.h>
25dbd550edSchristos #include <errno.h>
26dbd550edSchristos #include <stdio.h>
27dbd550edSchristos #include <stdlib.h>
28dbd550edSchristos #include <string.h>
29dbd550edSchristos #include <unistd.h>
30dbd550edSchristos
31dbd550edSchristos #include <pthread.h>
32dbd550edSchristos
33dbd550edSchristos #include "../common/common.h"
34dbd550edSchristos
35dbd550edSchristos static int vi_pthread_run __P((WIN *wp, void *(*fun)(void*), void *data));
36dbd550edSchristos static int vi_pthread_lock_init __P((WIN *, void **));
37dbd550edSchristos static int vi_pthread_lock_end __P((WIN *, void **));
38dbd550edSchristos static int vi_pthread_lock_try __P((WIN *, void **));
39dbd550edSchristos static int vi_pthread_lock_unlock __P((WIN *, void **));
40dbd550edSchristos
41dbd550edSchristos /*
42dbd550edSchristos * thread_init
43dbd550edSchristos *
44dbd550edSchristos * PUBLIC: void thread_init __P((GS *gp));
45dbd550edSchristos */
46dbd550edSchristos void
thread_init(GS * gp)47dbd550edSchristos thread_init(GS *gp)
48dbd550edSchristos {
49dbd550edSchristos gp->run = vi_pthread_run;
50dbd550edSchristos gp->lock_init = vi_pthread_lock_init;
51dbd550edSchristos gp->lock_end = vi_pthread_lock_end;
52dbd550edSchristos gp->lock_try = vi_pthread_lock_try;
53dbd550edSchristos gp->lock_unlock = vi_pthread_lock_unlock;
54dbd550edSchristos }
55dbd550edSchristos
56dbd550edSchristos static int
vi_pthread_run(WIN * wp,void * (* fun)(void *),void * data)57dbd550edSchristos vi_pthread_run(WIN *wp, void *(*fun)(void*), void *data)
58dbd550edSchristos {
59dbd550edSchristos pthread_t *t = malloc(sizeof(pthread_t));
60dbd550edSchristos pthread_create(t, NULL, fun, data);
61dbd550edSchristos return 0;
62dbd550edSchristos }
63dbd550edSchristos
64dbd550edSchristos static int
vi_pthread_lock_init(WIN * wp,void ** p)65dbd550edSchristos vi_pthread_lock_init (WIN * wp, void **p)
66dbd550edSchristos {
67dbd550edSchristos pthread_mutex_t *mutex;
68dbd550edSchristos int rc;
69dbd550edSchristos
70dbd550edSchristos MALLOC_RET(NULL, mutex, pthread_mutex_t *, sizeof(*mutex));
71dbd550edSchristos
72dbd550edSchristos if (rc = pthread_mutex_init(mutex, NULL)) {
73dbd550edSchristos free(mutex);
74dbd550edSchristos *p = NULL;
75dbd550edSchristos return rc;
76dbd550edSchristos }
77dbd550edSchristos *p = mutex;
78dbd550edSchristos return 0;
79dbd550edSchristos }
80dbd550edSchristos
81dbd550edSchristos static int
vi_pthread_lock_end(WIN * wp,void ** p)82dbd550edSchristos vi_pthread_lock_end (WIN * wp, void **p)
83dbd550edSchristos {
84dbd550edSchristos int rc;
85dbd550edSchristos pthread_mutex_t *mutex = (pthread_mutex_t *)*p;
86dbd550edSchristos
87dbd550edSchristos if (rc = pthread_mutex_destroy(mutex))
88dbd550edSchristos return rc;
89dbd550edSchristos
90dbd550edSchristos free(mutex);
91dbd550edSchristos *p = NULL;
92dbd550edSchristos return 0;
93dbd550edSchristos }
94dbd550edSchristos
95dbd550edSchristos static int
vi_pthread_lock_try(WIN * wp,void ** p)96dbd550edSchristos vi_pthread_lock_try (WIN * wp, void **p)
97dbd550edSchristos {
98dbd550edSchristos printf("try %p\n", *p);
99dbd550edSchristos fflush(stdout);
100dbd550edSchristos return 0;
101dbd550edSchristos return pthread_mutex_trylock((pthread_mutex_t *)*p);
102dbd550edSchristos }
103dbd550edSchristos
104dbd550edSchristos static int
vi_pthread_lock_unlock(WIN * wp,void ** p)105dbd550edSchristos vi_pthread_lock_unlock (WIN * wp, void **p)
106dbd550edSchristos {
107dbd550edSchristos printf("unlock %p\n", *p);
108dbd550edSchristos return 0;
109dbd550edSchristos return pthread_mutex_unlock((pthread_mutex_t *)*p);
110dbd550edSchristos }
111dbd550edSchristos
112