Back to home page

OSCL-LXR

 
 

    


0001 /*
0002  * Copyright © 2018 Alexey Dobriyan <adobriyan@gmail.com>
0003  *
0004  * Permission to use, copy, modify, and distribute this software for any
0005  * purpose with or without fee is hereby granted, provided that the above
0006  * copyright notice and this permission notice appear in all copies.
0007  *
0008  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
0009  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
0010  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
0011  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
0012  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
0013  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
0014  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
0015  */
0016 // Test that /proc/thread-self gives correct TGID/PID.
0017 #undef NDEBUG
0018 #include <assert.h>
0019 #include <sched.h>
0020 #include <stdio.h>
0021 #include <unistd.h>
0022 #include <sys/mman.h>
0023 #include <sys/wait.h>
0024 
0025 #include "proc.h"
0026 
0027 int f(void *arg)
0028 {
0029     char buf1[64], buf2[64];
0030     pid_t pid, tid;
0031     ssize_t rv;
0032 
0033     pid = sys_getpid();
0034     tid = sys_gettid();
0035     snprintf(buf1, sizeof(buf1), "%u/task/%u", pid, tid);
0036 
0037     rv = readlink("/proc/thread-self", buf2, sizeof(buf2));
0038     assert(rv == strlen(buf1));
0039     buf2[rv] = '\0';
0040     assert(streq(buf1, buf2));
0041 
0042     if (arg)
0043         exit(0);
0044     return 0;
0045 }
0046 
0047 int main(void)
0048 {
0049     const int PAGE_SIZE = sysconf(_SC_PAGESIZE);
0050     pid_t pid;
0051     void *stack;
0052 
0053     /* main thread */
0054     f((void *)0);
0055 
0056     stack = mmap(NULL, 2 * PAGE_SIZE, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0);
0057     assert(stack != MAP_FAILED);
0058     /* side thread */
0059     pid = clone(f, stack + PAGE_SIZE, CLONE_THREAD|CLONE_SIGHAND|CLONE_VM, (void *)1);
0060     assert(pid > 0);
0061     pause();
0062 
0063     return 0;
0064 }