mirror of
				https://gitlab.freedesktop.org/pulseaudio/pulseaudio.git
				synced 2025-11-03 09:01:50 -05:00 
			
		
		
		
	make rtprio and nice level actually configurable
git-svn-id: file:///home/lennart/svn/public/pulseaudio/trunk@2014 fefdeb5f-60dc-0310-8127-8f9354f1896f
This commit is contained in:
		
							parent
							
								
									641d1fa964
								
							
						
					
					
						commit
						7bfd1b2f01
					
				
					 11 changed files with 94 additions and 54 deletions
				
			
		| 
						 | 
					@ -419,9 +419,9 @@ int main(int argc, char *argv[]) {
 | 
				
			||||||
    pa_log_set_target(conf->auto_log_target ? PA_LOG_STDERR : conf->log_target, NULL);
 | 
					    pa_log_set_target(conf->auto_log_target ? PA_LOG_STDERR : conf->log_target, NULL);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (conf->high_priority && conf->cmd == PA_CMD_DAEMON)
 | 
					    if (conf->high_priority && conf->cmd == PA_CMD_DAEMON)
 | 
				
			||||||
        pa_raise_priority();
 | 
					        pa_raise_priority(conf->nice_level);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (suid_root && (conf->cmd != PA_CMD_DAEMON || !conf->high_priority)) {
 | 
					    if (suid_root && (conf->cmd != PA_CMD_DAEMON || !conf->realtime_scheduling)) {
 | 
				
			||||||
        pa_drop_caps();
 | 
					        pa_drop_caps();
 | 
				
			||||||
        pa_drop_root();
 | 
					        pa_drop_root();
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
| 
						 | 
					@ -636,7 +636,6 @@ int main(int argc, char *argv[]) {
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    c->is_system_instance = !!conf->system_instance;
 | 
					    c->is_system_instance = !!conf->system_instance;
 | 
				
			||||||
    c->high_priority = !!conf->high_priority;
 | 
					 | 
				
			||||||
    c->default_sample_spec = conf->default_sample_spec;
 | 
					    c->default_sample_spec = conf->default_sample_spec;
 | 
				
			||||||
    c->default_n_fragments = conf->default_n_fragments;
 | 
					    c->default_n_fragments = conf->default_n_fragments;
 | 
				
			||||||
    c->default_fragment_size_msec = conf->default_fragment_size_msec;
 | 
					    c->default_fragment_size_msec = conf->default_fragment_size_msec;
 | 
				
			||||||
| 
						 | 
					@ -645,6 +644,8 @@ int main(int argc, char *argv[]) {
 | 
				
			||||||
    c->module_idle_time = conf->module_idle_time;
 | 
					    c->module_idle_time = conf->module_idle_time;
 | 
				
			||||||
    c->scache_idle_time = conf->scache_idle_time;
 | 
					    c->scache_idle_time = conf->scache_idle_time;
 | 
				
			||||||
    c->resample_method = conf->resample_method;
 | 
					    c->resample_method = conf->resample_method;
 | 
				
			||||||
 | 
					    c->realtime_priority = conf->realtime_priority;
 | 
				
			||||||
 | 
					    c->realtime_scheduling = !!conf->realtime_scheduling;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    pa_assert_se(pa_signal_init(pa_mainloop_get_api(mainloop)) == 0);
 | 
					    pa_assert_se(pa_signal_init(pa_mainloop_get_api(mainloop)) == 0);
 | 
				
			||||||
    pa_signal_new(SIGINT, signal_callback, c);
 | 
					    pa_signal_new(SIGINT, signal_callback, c);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -603,8 +603,8 @@ static void thread_func(void *userdata) {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    pa_log_debug("Thread starting up");
 | 
					    pa_log_debug("Thread starting up");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (u->core->high_priority)
 | 
					    if (u->core->realtime_scheduling)
 | 
				
			||||||
        pa_make_realtime();
 | 
					        pa_make_realtime(u->core->realtime_priority);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    pa_thread_mq_install(&u->thread_mq);
 | 
					    pa_thread_mq_install(&u->thread_mq);
 | 
				
			||||||
    pa_rtpoll_install(u->rtpoll);
 | 
					    pa_rtpoll_install(u->rtpoll);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -592,8 +592,8 @@ static void thread_func(void *userdata) {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    pa_log_debug("Thread starting up");
 | 
					    pa_log_debug("Thread starting up");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (u->core->high_priority)
 | 
					    if (u->core->realtime_scheduling)
 | 
				
			||||||
        pa_make_realtime();
 | 
					        pa_make_realtime(u->core->realtime_priority);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    pa_thread_mq_install(&u->thread_mq);
 | 
					    pa_thread_mq_install(&u->thread_mq);
 | 
				
			||||||
    pa_rtpoll_install(u->rtpoll);
 | 
					    pa_rtpoll_install(u->rtpoll);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -233,8 +233,8 @@ static void thread_func(void *userdata) {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    pa_log_debug("Thread starting up");
 | 
					    pa_log_debug("Thread starting up");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (u->core->high_priority)
 | 
					    if (u->core->realtime_scheduling)
 | 
				
			||||||
        pa_make_realtime();
 | 
					        pa_make_realtime(u->core->realtime_priority+1);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    pa_thread_mq_install(&u->thread_mq);
 | 
					    pa_thread_mq_install(&u->thread_mq);
 | 
				
			||||||
    pa_rtpoll_install(u->rtpoll);
 | 
					    pa_rtpoll_install(u->rtpoll);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -214,8 +214,8 @@ static void thread_func(void *userdata) {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    pa_log_debug("Thread starting up");
 | 
					    pa_log_debug("Thread starting up");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (u->core->high_priority)
 | 
					    if (u->core->realtime_scheduling)
 | 
				
			||||||
        pa_make_realtime();
 | 
					        pa_make_realtime(u->core->realtime_priority);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    pa_thread_mq_install(&u->thread_mq);
 | 
					    pa_thread_mq_install(&u->thread_mq);
 | 
				
			||||||
    pa_rtpoll_install(u->rtpoll);
 | 
					    pa_rtpoll_install(u->rtpoll);
 | 
				
			||||||
| 
						 | 
					@ -253,8 +253,8 @@ static void jack_init(void *arg) {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    pa_log_info("JACK thread starting up.");
 | 
					    pa_log_info("JACK thread starting up.");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (u->core->high_priority)
 | 
					    if (u->core->realtime_scheduling)
 | 
				
			||||||
        pa_make_realtime();
 | 
					        pa_make_realtime(u->core->realtime_priority+4);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void jack_shutdown(void* arg) {
 | 
					static void jack_shutdown(void* arg) {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -191,8 +191,8 @@ static void thread_func(void *userdata) {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    pa_log_debug("Thread starting up");
 | 
					    pa_log_debug("Thread starting up");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (u->core->high_priority)
 | 
					    if (u->core->realtime_scheduling)
 | 
				
			||||||
        pa_make_realtime();
 | 
					        pa_make_realtime(u->core->realtime_priority);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    pa_thread_mq_install(&u->thread_mq);
 | 
					    pa_thread_mq_install(&u->thread_mq);
 | 
				
			||||||
    pa_rtpoll_install(u->rtpoll);
 | 
					    pa_rtpoll_install(u->rtpoll);
 | 
				
			||||||
| 
						 | 
					@ -230,8 +230,8 @@ static void jack_init(void *arg) {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    pa_log_info("JACK thread starting up.");
 | 
					    pa_log_info("JACK thread starting up.");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (u->core->high_priority)
 | 
					    if (u->core->realtime_scheduling)
 | 
				
			||||||
        pa_make_realtime();
 | 
					        pa_make_realtime(u->core->realtime_priority+4);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void jack_shutdown(void* arg) {
 | 
					static void jack_shutdown(void* arg) {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -863,8 +863,8 @@ static void thread_func(void *userdata) {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    pa_log_debug("Thread starting up");
 | 
					    pa_log_debug("Thread starting up");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (u->core->high_priority)
 | 
					    if (u->core->realtime_scheduling)
 | 
				
			||||||
        pa_make_realtime();
 | 
					        pa_make_realtime(u->core->realtime_priority);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    pa_thread_mq_install(&u->thread_mq);
 | 
					    pa_thread_mq_install(&u->thread_mq);
 | 
				
			||||||
    pa_rtpoll_install(u->rtpoll);
 | 
					    pa_rtpoll_install(u->rtpoll);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -512,8 +512,10 @@ char *pa_strlcpy(char *b, const char *s, size_t l) {
 | 
				
			||||||
    return b;
 | 
					    return b;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* Make the current thread a realtime thread*/
 | 
					/* Make the current thread a realtime thread, and acquire the highest
 | 
				
			||||||
void pa_make_realtime(void) {
 | 
					 * rtprio we can get that is less or equal the specified parameter. If
 | 
				
			||||||
 | 
					 * the thread is already realtime, don't do anything. */
 | 
				
			||||||
 | 
					int pa_make_realtime(int rtprio) {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifdef _POSIX_PRIORITY_SCHEDULING
 | 
					#ifdef _POSIX_PRIORITY_SCHEDULING
 | 
				
			||||||
    struct sched_param sp;
 | 
					    struct sched_param sp;
 | 
				
			||||||
| 
						 | 
					@ -524,50 +526,87 @@ void pa_make_realtime(void) {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if ((r = pthread_getschedparam(pthread_self(), &policy, &sp)) != 0) {
 | 
					    if ((r = pthread_getschedparam(pthread_self(), &policy, &sp)) != 0) {
 | 
				
			||||||
        pa_log("pthread_getschedgetparam(): %s", pa_cstrerror(r));
 | 
					        pa_log("pthread_getschedgetparam(): %s", pa_cstrerror(r));
 | 
				
			||||||
        return;
 | 
					        return -1;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    sp.sched_priority = 1;
 | 
					    if (policy == SCHED_FIFO && sp.sched_priority >= rtprio) {
 | 
				
			||||||
 | 
					        pa_log_info("Thread already being scheduled with SCHED_FIFO with priority %i.", sp.sched_priority);
 | 
				
			||||||
 | 
					        return 0;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    sp.sched_priority = rtprio;
 | 
				
			||||||
    if ((r = pthread_setschedparam(pthread_self(), SCHED_FIFO, &sp)) != 0) {
 | 
					    if ((r = pthread_setschedparam(pthread_self(), SCHED_FIFO, &sp)) != 0) {
 | 
				
			||||||
        pa_log_warn("pthread_setschedparam(): %s", pa_cstrerror(r));
 | 
					
 | 
				
			||||||
        return;
 | 
					        while (sp.sched_priority > 1) {
 | 
				
			||||||
 | 
					            sp.sched_priority --;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            if ((r = pthread_setschedparam(pthread_self(), SCHED_FIFO, &sp)) == 0) {
 | 
				
			||||||
 | 
					                pa_log_info("Successfully enabled SCHED_FIFO scheduling for thread, with priority %i, which is lower than the requested %i.", sp.sched_priority, rtprio);
 | 
				
			||||||
 | 
					                return 0;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    pa_log_info("Successfully enabled SCHED_FIFO scheduling for thread.");
 | 
					        pa_log_warn("pthread_setschedparam(): %s", pa_cstrerror(r));
 | 
				
			||||||
#endif
 | 
					        return -1;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    pa_log_info("Successfully enabled SCHED_FIFO scheduling for thread, with priority %i.", sp.sched_priority);
 | 
				
			||||||
 | 
					    return 0;
 | 
				
			||||||
 | 
					#else
 | 
				
			||||||
 | 
					    return -1;
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define NICE_LEVEL (-11)
 | 
					/* Raise the priority of the current process as much as possible that
 | 
				
			||||||
 | 
					 * is <= the specified nice level..*/
 | 
				
			||||||
/* Raise the priority of the current process as much as possible and
 | 
					int pa_raise_priority(int nice_level) {
 | 
				
			||||||
sensible: set the nice level to -11.*/
 | 
					 | 
				
			||||||
void pa_raise_priority(void) {
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifdef HAVE_SYS_RESOURCE_H
 | 
					#ifdef HAVE_SYS_RESOURCE_H
 | 
				
			||||||
    if (setpriority(PRIO_PROCESS, 0, NICE_LEVEL) < 0)
 | 
					    if (setpriority(PRIO_PROCESS, 0, nice_level) < 0) {
 | 
				
			||||||
 | 
					        int n;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        for (n = nice_level+1; n < 0; n++) {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            if (setpriority(PRIO_PROCESS, 0, n) == 0) {
 | 
				
			||||||
 | 
					                pa_log_info("Successfully acquired nice level %i, which is lower than the requested %i.", n, nice_level);
 | 
				
			||||||
 | 
					                return 0;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        pa_log_warn("setpriority(): %s", pa_cstrerror(errno));
 | 
					        pa_log_warn("setpriority(): %s", pa_cstrerror(errno));
 | 
				
			||||||
    else
 | 
					        return -1;
 | 
				
			||||||
        pa_log_info("Successfully gained nice level %i.", NICE_LEVEL);
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    pa_log_info("Successfully gained nice level %i.", nice_level);
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifdef OS_IS_WIN32
 | 
					#ifdef OS_IS_WIN32
 | 
				
			||||||
    if (!SetPriorityClass(GetCurrentProcess(), HIGH_PRIORITY_CLASS))
 | 
					    if (nice_level < 0) {
 | 
				
			||||||
 | 
					        if (!SetPriorityClass(GetCurrentProcess(), HIGH_PRIORITY_CLASS)) {
 | 
				
			||||||
            pa_log_warn("SetPriorityClass() failed: 0x%08X", GetLastError());
 | 
					            pa_log_warn("SetPriorityClass() failed: 0x%08X", GetLastError());
 | 
				
			||||||
    else
 | 
					            return .-1;
 | 
				
			||||||
 | 
					        } else
 | 
				
			||||||
            pa_log_info("Successfully gained high priority class.");
 | 
					            pa_log_info("Successfully gained high priority class.");
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    return 0;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* Reset the priority to normal, inverting the changes made by
 | 
					/* Reset the priority to normal, inverting the changes made by
 | 
				
			||||||
 * pa_raise_priority() */
 | 
					 * pa_raise_priority() and pa_make_realtime()*/
 | 
				
			||||||
void pa_reset_priority(void) {
 | 
					void pa_reset_priority(void) {
 | 
				
			||||||
#ifdef OS_IS_WIN32
 | 
					#ifdef HAVE_SYS_RESOURCE_H
 | 
				
			||||||
    SetPriorityClass(GetCurrentProcess(), NORMAL_PRIORITY_CLASS);
 | 
					    struct sched_param sp;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    setpriority(PRIO_PROCESS, 0, 0);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    memset(&sp, 0, sizeof(sp));
 | 
				
			||||||
 | 
					    pa_assert_se(pthread_setschedparam(pthread_self(), SCHED_OTHER, &sp) == 0);
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifdef HAVE_SYS_RESOURCE_H
 | 
					#ifdef OS_IS_WIN32
 | 
				
			||||||
    setpriority(PRIO_PROCESS, 0, 0);
 | 
					    SetPriorityClass(GetCurrentProcess(), NORMAL_PRIORITY_CLASS);
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -57,8 +57,8 @@ char *pa_strlcpy(char *b, const char *s, size_t l);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
char *pa_parent_dir(const char *fn);
 | 
					char *pa_parent_dir(const char *fn);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void pa_make_realtime(void);
 | 
					int pa_make_realtime(int rtprio);
 | 
				
			||||||
void pa_raise_priority(void);
 | 
					int pa_raise_priority(int nice_level);
 | 
				
			||||||
void pa_reset_priority(void);
 | 
					void pa_reset_priority(void);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
int pa_parse_boolean(const char *s) PA_GCC_PURE;
 | 
					int pa_parse_boolean(const char *s) PA_GCC_PURE;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -107,7 +107,7 @@ pa_core* pa_core_new(pa_mainloop_api *m, int shared) {
 | 
				
			||||||
    c->scache = NULL;
 | 
					    c->scache = NULL;
 | 
				
			||||||
    c->autoload_idxset = NULL;
 | 
					    c->autoload_idxset = NULL;
 | 
				
			||||||
    c->autoload_hashmap = NULL;
 | 
					    c->autoload_hashmap = NULL;
 | 
				
			||||||
    c->running_as_daemon = 0;
 | 
					    c->running_as_daemon = FALSE;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    c->default_sample_spec.format = PA_SAMPLE_S16NE;
 | 
					    c->default_sample_spec.format = PA_SAMPLE_S16NE;
 | 
				
			||||||
    c->default_sample_spec.rate = 44100;
 | 
					    c->default_sample_spec.rate = 44100;
 | 
				
			||||||
| 
						 | 
					@ -134,10 +134,10 @@ pa_core* pa_core_new(pa_mainloop_api *m, int shared) {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    c->resample_method = PA_RESAMPLER_SPEEX_FLOAT_BASE + 3;
 | 
					    c->resample_method = PA_RESAMPLER_SPEEX_FLOAT_BASE + 3;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    c->is_system_instance = 0;
 | 
					    c->is_system_instance = FALSE;
 | 
				
			||||||
    c->disallow_module_loading = 0;
 | 
					    c->disallow_module_loading = FALSE;
 | 
				
			||||||
    c->high_priority = 0;
 | 
					    c->realtime_scheduling = FALSE;
 | 
				
			||||||
 | 
					    c->realtime_priority = 5;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    for (j = 0; j < PA_CORE_HOOK_MAX; j++)
 | 
					    for (j = 0; j < PA_CORE_HOOK_MAX; j++)
 | 
				
			||||||
        pa_hook_init(&c->hooks[j], c);
 | 
					        pa_hook_init(&c->hooks[j], c);
 | 
				
			||||||
| 
						 | 
					@ -217,4 +217,3 @@ void pa_core_check_quit(pa_core *c) {
 | 
				
			||||||
        c->quit_event = NULL;
 | 
					        c->quit_event = NULL;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -113,10 +113,11 @@ struct pa_core {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    pa_time_event *scache_auto_unload_event;
 | 
					    pa_time_event *scache_auto_unload_event;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    int disallow_module_loading, running_as_daemon;
 | 
					    pa_bool_t disallow_module_loading, running_as_daemon;
 | 
				
			||||||
    pa_resample_method_t resample_method;
 | 
					    pa_resample_method_t resample_method;
 | 
				
			||||||
    int is_system_instance;
 | 
					    pa_bool_t is_system_instance;
 | 
				
			||||||
    int high_priority;
 | 
					    pa_bool_t realtime_scheduling;
 | 
				
			||||||
 | 
					    int realtime_priority;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /* hooks */
 | 
					    /* hooks */
 | 
				
			||||||
    pa_hook hooks[PA_CORE_HOOK_MAX];
 | 
					    pa_hook hooks[PA_CORE_HOOK_MAX];
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue