xref: /netbsd-src/external/bsd/nvi/dist/common/pthread.c (revision 2f698edb5c1cb2dcd9e762b0abb50c41dde8b6b7)
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