1 2 /*--------------------------------------------------------------------*/ 3 /*--- Generic scheduler lock implementation sched-lock-generic.c ---*/ 4 /*--- ---*/ 5 /*--- This implementation does not guarantee fair scheduling on ---*/ 6 /*--- multicore systems but is sufficient to make the Valgrind ---*/ 7 /*--- scheduler work reasonably. ---*/ 8 /*--------------------------------------------------------------------*/ 9 10 /* 11 This file is part of Valgrind, a dynamic binary instrumentation 12 framework. 13 14 Copyright (C) 2011-2015 Bart Van Assche <bvanassche (at) acm.org>. 15 16 This program is free software; you can redistribute it and/or 17 modify it under the terms of the GNU General Public License as 18 published by the Free Software Foundation; either version 2 of the 19 License, or (at your option) any later version. 20 21 This program is distributed in the hope that it will be useful, but 22 WITHOUT ANY WARRANTY; without even the implied warranty of 23 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 24 General Public License for more details. 25 26 You should have received a copy of the GNU General Public License 27 along with this program; if not, write to the Free Software 28 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 29 02111-1307, USA. 30 31 The GNU General Public License is contained in the file COPYING. 32 */ 33 34 #include "pub_core_basics.h" 35 #include "pub_core_mallocfree.h" 36 #include "priv_sema.h" 37 #include "priv_sched-lock.h" 38 #include "priv_sched-lock-impl.h" 39 40 struct sched_lock { 41 vg_sema_t sema; 42 }; 43 44 static const HChar *get_sched_lock_name(void) 45 { 46 return "generic"; 47 } 48 49 static struct sched_lock *create_sched_lock(void) 50 { 51 struct sched_lock *p; 52 53 p = VG_(malloc)("sched_lock", sizeof(*p)); 54 ML_(sema_init)(&p->sema); 55 return p; 56 } 57 58 static void destroy_sched_lock(struct sched_lock *p) 59 { 60 ML_(sema_deinit)(&p->sema); 61 VG_(free)(p); 62 } 63 64 static int get_sched_lock_owner(struct sched_lock *p) 65 { 66 return p->sema.owner_lwpid; 67 } 68 69 static void acquire_sched_lock(struct sched_lock *p) 70 { 71 ML_(sema_down)(&p->sema, False); 72 } 73 74 static void release_sched_lock(struct sched_lock *p) 75 { 76 ML_(sema_up)(&p->sema, False); 77 } 78 79 const struct sched_lock_ops ML_(generic_sched_lock_ops) = { 80 .get_sched_lock_name = get_sched_lock_name, 81 .create_sched_lock = create_sched_lock, 82 .destroy_sched_lock = destroy_sched_lock, 83 .get_sched_lock_owner = get_sched_lock_owner, 84 .acquire_sched_lock = acquire_sched_lock, 85 .release_sched_lock = release_sched_lock, 86 }; 87