File: dumb.c

package info (click to toggle)
uwsgi 2.0.29-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 6,684 kB
  • sloc: ansic: 87,027; python: 7,001; cpp: 1,131; java: 708; perl: 678; sh: 585; ruby: 555; makefile: 148; xml: 130; cs: 121; objc: 37; php: 28; erlang: 20; javascript: 11
file content (67 lines) | stat: -rw-r--r-- 2,274 bytes parent folder | download | duplicates (8)
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
#include "../../uwsgi.h"

extern struct uwsgi_server uwsgi;

// global variables for configuration
static uint8_t dumbloop_modifier1 = 0;
static char *dumbloop_code = "";
static char *dumbloop_function = "dumbloop";

struct uwsgi_option dumbloop_options[] = {
        {"dumbloop-modifier1", required_argument, 0, "set the modifier1 for the code_string", uwsgi_opt_set_int, &dumbloop_modifier1, 0},
        {"dumbloop-code", required_argument, 0, "set the script to load for the code_string", uwsgi_opt_set_str, &dumbloop_code, 0},
        {"dumbloop-function", required_argument, 0, "set the function to run for the code_string", uwsgi_opt_set_str, &dumbloop_function, 0},
        {0, 0, 0, 0, 0, 0, 0},

};


// this function is executed for each thread
static void *dumb_loop_run(void *arg1) {

	// get the core id (pthreads take a void pointer as argument, so we need this ugly trick)
        long core_id = (long) arg1;

	// complete threads setup (this is required for fixing things like UNIX signal handling)
        if (uwsgi.threads > 1) {
		// wsgi_request mapped to the core
        	struct wsgi_request *wsgi_req = &uwsgi.workers[uwsgi.mywid].cores[core_id].req;
		// fix it
                uwsgi_setup_thread_req(core_id, wsgi_req);
        }

	// this strign will be passed to the code_string function
	char *str_core = uwsgi_num2str(core_id);
        // ok we are ready, let's run custom code
        while (uwsgi.workers[uwsgi.mywid].manage_next_request) {
        	if (uwsgi.p[dumbloop_modifier1]->code_string) {
			// "uwsgi_dumbloop" is the name of the module (will be used while importing the file, if needed)
                	uwsgi.p[dumbloop_modifier1]->code_string("uwsgi_dumbloop", dumbloop_code, dumbloop_function, str_core, strlen(str_core));
                }
		else {
			uwsgi_log("the requested plugin does not support code_string hook\n");
			exit(1);
		}
	}

	return NULL;
}

static void dumb_loop() {
	// this run the dumb_loop_run in each thread (core)
	uwsgi_loop_cores_run(dumb_loop_run);
}



// register the new loop engine
static void dumbloop_register() {
	uwsgi_register_loop( (char *) "dumb", dumb_loop);
}


struct uwsgi_plugin dumbloop_plugin = {
	.name = "dumbloop",
	.on_load = dumbloop_register,
	.options = dumbloop_options,
};