/* * Copyright 2008, Ingo Weinhold, ingo_weinhold@gmx.de. * Distributed under the terms of the MIT License. */ #include #include #include #include #include #include #include static int64 sHandledSignals = 0; static status_t signal_pusher(void* data) { team_info teamInfo; get_team_info(B_CURRENT_TEAM, &teamInfo); thread_id mainThread = teamInfo.team; while (true) { send_signal(mainThread, SIGUSR1); snooze(1000); } return B_OK; } static void signal_handler(int signal) { sHandledSignals++; } static void allocator_thread(int level) { if (level > 100000) return; free(malloc(rand() % 10000)); allocator_thread(level + 1); } int main() { // Test program to reproduce bug #2562. Is finished quickly and must be run // in a loop to reproduce the bug. // install signal handler if (signal(SIGUSR1, signal_handler) == SIG_ERR) { fprintf(stderr, "Error: Failed to install signal handler: %s\n", strerror(errno)); exit(1); } // start signal thread thread_id signalThread = spawn_thread(&signal_pusher, "signal pusher", B_NORMAL_PRIORITY, NULL); resume_thread(signalThread); allocator_thread(0); kill_thread(signalThread); snooze(1000); printf("test successful, handled %lld signals\n", sHandledSignals); return 0; }