1 /* 2 * CDDL HEADER START 3 * 4 * The contents of this file are subject to the terms of the 5 * Common Development and Distribution License (the "License"). 6 * You may not use this file except in compliance with the License. 7 * 8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 9 * or http://www.opensolaris.org/os/licensing. 10 * See the License for the specific language governing permissions 11 * and limitations under the License. 12 * 13 * When distributing Covered Code, include this CDDL HEADER in each 14 * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 15 * If applicable, add the following below this CDDL HEADER, with the 16 * fields enclosed by brackets "[]" replaced with your own identifying 17 * information: Portions Copyright [yyyy] [name of copyright owner] 18 * 19 * CDDL HEADER END 20 */ 21 /* 22 * Copyright 2009 Sun Microsystems, Inc. All rights reserved. 23 * Use is subject to license terms. 24 */ 25 26 #ifndef _FB_THREADFLOW_H 27 #define _FB_THREADFLOW_H 28 29 #include "config.h" 30 #include "fsplug.h" 31 #include <pthread.h> 32 33 #ifndef HAVE_CADDR_T1 34 /* typedef char *caddr_t; */ 35 #endif 36 37 #ifdef LINUX_PORT 38 #include <linux/types.h> /* for "caddr_t" */ 39 #endif 40 41 42 #ifdef HAVE_AIO 43 #include <aio.h> 44 #endif 45 #ifdef HAVE_PROCFS 46 #include <procfs.h> 47 #endif 48 #include "vars.h" 49 #include "procflow.h" 50 #include "fileset.h" 51 52 #ifdef __cplusplus 53 extern "C" { 54 #endif 55 56 #define AL_READ 1 57 #define AL_WRITE 2 58 59 60 #ifdef HAVE_AIO 61 typedef struct aiolist { 62 int al_type; 63 struct aiolist *al_next; 64 struct aiolist *al_worknext; 65 struct aiocb64 al_aiocb; 66 } aiolist_t; 67 #endif 68 69 #define THREADFLOW_MAXFD 128 70 #define THREADFLOW_USEISM 0x1 71 72 typedef struct threadflow { 73 char tf_name[128]; /* Name */ 74 int tf_attrs; /* Attributes */ 75 int tf_instance; /* Instance number */ 76 int tf_running; /* Thread running indicator */ 77 int tf_abort; /* Shutdown thread */ 78 int tf_utid; /* Unique id for thread */ 79 struct procflow *tf_process; /* Back pointer to process */ 80 pthread_t tf_tid; /* Thread id */ 81 pthread_mutex_t tf_lock; /* Mutex around threadflow */ 82 avd_t tf_instances; /* Number of instances for this flow */ 83 struct threadflow *tf_next; /* Next on proc list */ 84 struct flowop *tf_thrd_fops; /* Flowop list */ 85 caddr_t tf_mem; /* Private Memory */ 86 avd_t tf_memsize; /* Private Memory size attribute */ 87 fbint_t tf_constmemsize; /* constant copy of memory size */ 88 fb_fdesc_t tf_fd[THREADFLOW_MAXFD + 1]; /* Thread local fd's */ 89 filesetentry_t *tf_fse[THREADFLOW_MAXFD + 1]; /* Thread local files */ 90 int tf_fdrotor; /* Rotating fd within set */ 91 flowstat_t tf_stats; /* Thread statistics */ 92 hrtime_t tf_stime; /* Start time of op */ 93 #ifdef HAVE_PROCFS 94 struct prusage tf_susage; /* Resource usage snapshot, start */ 95 struct prusage tf_eusage; /* Resource usage snapshot, end */ 96 #endif 97 int tf_lwpusagefd; /* /proc lwp usage fd */ 98 #ifdef HAVE_AIO 99 aiolist_t *tf_aiolist; /* List of async I/Os */ 100 #endif 101 102 } threadflow_t; 103 104 /* Thread attrs */ 105 #define THREADFLOW_DEFAULTMEM 1024*1024LL; 106 107 threadflow_t *threadflow_define(procflow_t *, char *name, 108 threadflow_t *inherit, avd_t instances); 109 threadflow_t *threadflow_find(threadflow_t *, char *); 110 int threadflow_init(procflow_t *); 111 void flowop_start(threadflow_t *threadflow); 112 void threadflow_usage(void); 113 void threadflow_allstarted(pid_t pid, threadflow_t *threadflow); 114 void threadflow_delete_all(threadflow_t **threadlist); 115 116 #ifdef __cplusplus 117 } 118 #endif 119 120 #endif /* _FB_THREADFLOW_H */