added connection oriented statefull session handling to the server stack
[OpenSRF.git] / src / libstack / osrf_prefork.h
1 #include <sys/types.h>
2 #include <sys/time.h>
3 #include <unistd.h>
4 #include <stdlib.h>
5 #include <stdio.h>
6 #include <string.h>
7 #include <sys/select.h>
8 #include <sys/wait.h>
9
10 #include "opensrf/utils.h"
11 #include "opensrf/transport_message.h"
12 #include "opensrf/transport_client.h"
13 #include "osrf_stack.h"
14 #include "osrf_settings.h"
15 #include "osrfConfig.h"
16
17 #define READ_BUFSIZE 4096
18 #define MAX_BUFSIZE 10485760 /* 10M enough? ;) */
19 #define ABS_MAX_CHILDREN 256 
20
21 /* we receive data.  we find the next child in
22         line that is available.  pass the data down that childs pipe and go
23         back to listening for more data.
24         when we receive SIGCHLD, we check for any dead children and clean up
25         their respective prefork_child objects, close pipes, etc.
26
27         we build a select fd_set with all the child pipes (going to the parent) 
28         when a child is done processing a request, it writes a small chunk of 
29         data to the parent to alert the parent that the child is again available 
30         */
31
32 struct prefork_simple_struct {
33         int max_requests;
34         int min_children;
35         int max_children;
36         int fd;
37         int data_to_child;
38         int data_to_parent;
39         int current_num_children;
40         int keepalive; /* keepalive time for stateful sessions */
41         char* appname;
42         struct prefork_child_struct* first_child;
43         transport_client* connection;
44 };
45 typedef struct prefork_simple_struct prefork_simple;
46
47 struct prefork_child_struct {
48         pid_t pid;
49         int read_data_fd;
50         int write_data_fd;
51         int read_status_fd;
52         int write_status_fd;
53         int min_children;
54         int available;
55         int max_requests;
56         char* appname;
57         int keepalive;
58         struct prefork_child_struct* next;
59 };
60
61 typedef struct prefork_child_struct prefork_child;
62
63 int osrf_prefork_run(char* appname);
64
65 prefork_simple*  prefork_simple_init( transport_client* client, 
66         int max_requests, int min_children, int max_children );
67
68 prefork_child*  launch_child( prefork_simple* forker );
69 void prefork_launch_children( prefork_simple* forker );
70
71 void prefork_run(prefork_simple* forker);
72
73 void add_prefork_child( prefork_simple* forker, prefork_child* child );
74 prefork_child* find_prefork_child( prefork_simple* forker, pid_t pid );
75 void del_prefork_child( prefork_simple* forker, pid_t pid );
76
77 void check_children( prefork_simple* forker );
78
79 void prefork_child_process_request(prefork_child*, char* data);
80 void prefork_child_init_hook(prefork_child*);
81
82 prefork_child* prefork_child_init( 
83                 int max_requests, int read_data_fd, int write_data_fd, 
84                 int read_status_fd, int write_status_fd );
85
86 /* listens on the 'data_to_child' fd and wait for incoming data */
87 void prefork_child_wait( prefork_child* child );
88
89 int prefork_free( prefork_simple* );
90 int prefork_child_free( prefork_child* );
91
92
93 void osrf_prefork_register_routers( char* appname );
94
95