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