hc
2024-11-01 2f529f9b558ca1c1bd74be7437a84e4711743404
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
/***
 *
 *  include/rtnet_rtpc.h
 *
 *  RTnet - real-time networking subsystem
 *
 *  Copyright (C) 2003, 2004 Jan Kiszka <jan.kiszka@web.de>
 *
 *  This program is free software; you can redistribute it and/or modify
 *  it under the terms of the GNU General Public License as published by
 *  the Free Software Foundation; either version 2 of the License, or
 *  (at your option) any later version.
 *
 *  This program 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 General Public License for more details.
 *
 *  You should have received a copy of the GNU General Public License
 *  along with this program; if not, write to the Free Software
 *  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
 *
 */
 
#ifndef __RTNET_RTPC_H_
#define __RTNET_RTPC_H_
 
#include <linux/init.h>
 
#include <rtnet_internal.h>
 
struct rt_proc_call;
 
typedef int (*rtpc_proc)(struct rt_proc_call *call);
typedef void (*rtpc_copy_back_proc)(struct rt_proc_call *call, void *priv_data);
typedef void (*rtpc_cleanup_proc)(void *priv_data);
 
struct rt_proc_call {
   struct list_head list_entry;
   int processed;
   rtpc_proc proc;
   int result;
   atomic_t ref_count;
   wait_queue_head_t call_wq;
   rtpc_cleanup_proc cleanup_handler;
   char priv_data[0] __attribute__((aligned(8)));
};
 
#define CALL_PENDING 1000 /* result value for blocked calls */
 
int rtnet_rtpc_dispatch_call(rtpc_proc rt_proc, unsigned int timeout,
                void *priv_data, size_t priv_data_size,
                rtpc_copy_back_proc copy_back_handler,
                rtpc_cleanup_proc cleanup_handler);
 
void rtnet_rtpc_complete_call(struct rt_proc_call *call, int result);
void rtnet_rtpc_complete_call_nrt(struct rt_proc_call *call, int result);
 
#define rtpc_dispatch_call rtnet_rtpc_dispatch_call
#define rtpc_complete_call rtnet_rtpc_complete_call
#define rtpc_complete_call_nrt rtnet_rtpc_complete_call_nrt
 
#define rtpc_get_priv(call, type) (type *)(call->priv_data)
#define rtpc_get_result(call) call->result
#define rtpc_set_result(call, new_result) call->result = new_result
#define rtpc_set_cleanup_handler(call, handler) call->cleanup_handler = handler;
 
int __init rtpc_init(void);
void rtpc_cleanup(void);
 
#endif /* __RTNET_RTPC_H_ */