xref: /netbsd/lib/libisns/isns_task.h (revision 6550d01e)
1 /*	$NetBSD: isns_task.h,v 1.1.1.1 2011/01/16 01:22:50 agc Exp $	*/
2 
3 /*-
4  * Copyright (c) 2004,2009 The NetBSD Foundation, Inc.
5  * All rights reserved.
6  *
7  * This code is derived from software contributed to The NetBSD Foundation
8  * by Wasabi Systems, Inc.
9  *
10  * Redistribution and use in source and binary forms, with or without
11  * modification, are permitted provided that the following conditions
12  * are met:
13  * 1. Redistributions of source code must retain the above copyright
14  *    notice, this list of conditions and the following disclaimer.
15  * 2. Redistributions in binary form must reproduce the above copyright
16  *    notice, this list of conditions and the following disclaimer in the
17  *    documentation and/or other materials provided with the distribution.
18  *
19  * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
20  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
21  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
22  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
23  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
24  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
25  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
26  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
27  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
28  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
29  * POSSIBILITY OF SUCH DAMAGE.
30  */
31 /*
32  * isns_task.h
33  */
34 
35 #ifndef _ISNS_TASK_H_
36 #define _ISNS_TASK_H_
37 
38 #include <sys/event.h>
39 
40 #define ISNS_TASK_DISCOVER_SERVER	0
41 #define ISNS_TASK_RECONNECT_SERVER	1
42 #define ISNS_TASK_SEND_PDU		2
43 #define ISNS_TASK_INIT_SOCKET_IO	3
44 #define ISNS_TASK_INIT_REFRESH		4
45 #define ISNS_NUM_TASKS			5
46 
47 
48 union isns_task_var_u {
49 	struct {
50 		struct isns_trans_s *trans_p;
51 		struct isns_pdu_s *pdu_p;
52 	} send_pdu;
53 
54 	struct {
55 		struct addrinfo *ai_p;
56 	} reconnect_server;
57 
58 	struct {
59 		isns_socket_t sd;
60 		struct addrinfo *ai_p;
61 	} init_socket_io;
62 
63 	struct {
64 		struct isns_refresh_s *ref_p;
65 	} init_refresh;
66 
67 	void *data_p;
68 };
69 
70 struct isns_task_s {
71 	uint8_t task_type;
72 	struct isns_config_s *cfg_p;
73 	union isns_task_var_u var;
74 
75 	int waitable;
76 	pthread_mutex_t wait_mutex;
77 	pthread_cond_t wait_condvar;
78 	int wait_ref_count;
79 
80 	SIMPLEQ_ENTRY(isns_task_s) taskq_entry;
81 };
82 
83 typedef void (isns_task_handler)(struct isns_task_s *);
84 
85 void isns_run_task(struct isns_task_s *);
86 void isns_end_task(struct isns_task_s *);
87 int isns_wait_task(struct isns_task_s *, const struct timespec *);
88 
89 struct isns_task_s *isns_new_task(struct isns_config_s *, uint8_t, int);
90 void isns_free_task(struct isns_task_s *);
91 void isns_taskq_insert_tail(struct isns_config_s *, struct isns_task_s *);
92 void isns_taskq_insert_head(struct isns_config_s *, struct isns_task_s *);
93 struct isns_task_s *isns_taskq_remove(struct isns_config_s *);
94 struct isns_task_s *isns_taskq_remove_trans(struct isns_config_s *, uint16_t);
95 
96 
97 #endif /* !_ISNS_TASK_H_ */
98