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