1 /* $FreeBSD$ */
2 #include <sys/types.h>
3 #include <sys/stat.h>
4 #include <sys/ioctl.h>
5 #include <sys/mman.h>
6 #include <fcntl.h>
7 #include <stdlib.h>
8 #include <stdio.h>
9 #include <stdarg.h>
10 #include <string.h>
11 #include <unistd.h>
12 #include <errno.h>
13 #include <net/netmap_user.h>
14 #include <pthread.h>
15 #include "libnetmap.h"
16 
17 struct nmctx_pthread {
18 	struct nmctx up;
19 	pthread_mutex_t mutex;
20 };
21 
22 static struct nmctx_pthread nmctx_pthreadsafe;
23 
24 static void
25 nmctx_pthread_lock(struct nmctx *ctx, int lock)
26 {
27 	struct nmctx_pthread *ctxp =
28 		(struct nmctx_pthread *)ctx;
29 	if (lock) {
30 		pthread_mutex_lock(&ctxp->mutex);
31 	} else {
32 		pthread_mutex_unlock(&ctxp->mutex);
33 	}
34 }
35 
36 void __attribute__ ((constructor))
37 nmctx_set_threadsafe(void)
38 {
39 	struct nmctx *old;
40 
41 	pthread_mutex_init(&nmctx_pthreadsafe.mutex, NULL);
42 	old = nmctx_set_default(&nmctx_pthreadsafe.up);
43 	nmctx_pthreadsafe.up = *old;
44 	nmctx_pthreadsafe.up.lock = nmctx_pthread_lock;
45 }
46 
47 int nmctx_threadsafe;
48