/* * Copyright (C) 2008 Philippe Gerum . * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ #ifndef _COPPERPLATE_TRACEOBJ_H #define _COPPERPLATE_TRACEOBJ_H #include struct threadobj; struct traceobj { pthread_mutex_t lock; pthread_cond_t join; const char *label; int nr_marks; int cur_mark; struct tracemark *marks; int nr_threads; }; #define traceobj_assert(trobj, cond) \ do { \ int __ret = (cond); \ if (!__ret) \ __traceobj_assert_failed(trobj, __FILE__, __LINE__, __STRING(cond)); \ } while(0) #define traceobj_check(__trobj, __status, __expected) \ do { \ if (__status != __expected) \ __traceobj_check_abort(__trobj, __FILE__, __LINE__, \ __status, __expected); \ } while(0) #define traceobj_check_warn(__trobj, __status, __expected) \ do { \ if (__status != __expected) \ __traceobj_check_warn(__trobj, __FILE__, __LINE__, \ __status, __expected); \ } while(0) #define traceobj_mark(trobj, mark) \ __traceobj_mark(trobj, __FILE__, __LINE__, mark) #ifdef __cplusplus extern "C" { #endif int traceobj_init(struct traceobj *trobj, const char *label, int nr_marks); void traceobj_verify(struct traceobj *trobj, int tseq[], int nr_seq); void traceobj_destroy(struct traceobj *trobj); void traceobj_enter(struct traceobj *trobj); void traceobj_exit(struct traceobj *trobj); void traceobj_unwind(struct traceobj *trobj); void traceobj_join(struct traceobj *trobj); void __traceobj_assert_failed(struct traceobj *trobj, const char *file, int line, const char *cond); void __traceobj_check_abort(struct traceobj *trobj, const char *file, int line, int received, int expected); void __traceobj_check_warn(struct traceobj *trobj, const char *file, int line, int received, int expected); void __traceobj_mark(struct traceobj *trobj, const char *file, int line, int mark); #ifdef __cplusplus } #endif #endif /* _COPPERPLATE_TRACEOBJ_H */