-static void lttng_get_new_info(void)
-{
- unsigned long cpu_addr, fac_addr;
- unsigned int i, first_empty;
- int active, filter, destroy;
- int ret;
- struct lttng_trace_info *info;
- sigset_t set, oldset;
-
- /* Disable signals */
- ret = sigfillset(&set);
- if(ret) {
- printf("Error in sigfillset\n");
- exit(1);
- }
-
- ret = pthread_sigmask(SIG_BLOCK, &set, &oldset);
- if(ret) {
- printf("Error in sigprocmask\n");
- exit(1);
- }
-
- /* Get all the new traces */
- while(1) {
- cpu_addr = fac_addr = 0;
- active = filter = destroy = 0;
- ret = ltt_update(&cpu_addr, &fac_addr, &active, &filter, &destroy);
- if(ret) {
- printf("LTTng : error in ltt_update\n");
- exit(1);
- }
-
- if(!cpu_addr || !fac_addr) break;
-
- info = find_info(cpu_addr, fac_addr, &first_empty);
- if(info) {
- info->filter = filter;
- info->active = active;
- info->destroy = destroy;
- if(destroy && !atomic_read(&info->nesting))
- lttng_free_trace_info(info);
- } else {
- /* Not found. Must take an empty slot */
- if(first_empty == MAX_TRACES) {
- printf(
- "LTTng WARNING : too many traces requested for pid %d by the kernel.\n"
- " Compilation defined maximum is %u\n",
- getpid(), MAX_TRACES);
-
- } else {
- info = <tng_trace_info[first_empty];
- info->channel.cpu.start = (void*)cpu_addr;
- info->channel.cpu.length = PAGE_SIZE;
- info->channel.facilities.start = (void*)fac_addr;
- info->channel.facilities.length = PAGE_SIZE;
- info->filter = filter;
- info->active = active;
- info->destroy = destroy;
- if(destroy && !atomic_read(&info->nesting))
- lttng_free_trace_info(info);
- }
- }
- }
-
- /* Enable signals */
- ret = pthread_sigmask(SIG_SETMASK, &oldset, NULL);
- if(ret) {
- printf("Error in sigprocmask\n");
- exit(1);
- }