int pthread_cancel(pthread_t __th)

{
  char cVar1;
  int iVar2;
  undefined4 *puVar3;
  int iVar4;
  undefined1 *puVar5;
  __pid_t __pid;
  
  iVar2 = (__th & 0x3ff) * 0x10;
  puVar5 = __pthread_handles + iVar2;
  __pthread_lock(puVar5,0);
  iVar2 = *(int *)(__pthread_handles + iVar2 + 8);
  if ((iVar2 == 0) || (*(pthread_t *)(iVar2 + 0x10) != __th)) {
    __pthread_unlock(puVar5);
    iVar2 = 3;
  }
  else {
    cVar1 = *(char *)(iVar2 + 0x42)   //possible issue identified - semgrep
    *(undefined1 *)(iVar2 + 0x42) = 1;
    if ((*(char *)(iVar2 + 0x40) == '\x01') || (cVar1 != '\0')) {
      __pthread_unlock(puVar5);
    }
    else {
      puVar3 = *(undefined4 **)(iVar2 + 0x1bc);
      __pid = *(__pid_t *)(iVar2 + 0x14);
      iVar4 = 0;
      if (puVar3 != (undefined4 *)0x0) {
        iVar4 = (*(code *)puVar3[1])(*puVar3,iVar2);
        *(char *)(iVar2 + 0x1b8) = (char)iVar4;
      }
      __pthread_unlock(puVar5);
      if (iVar4 == 0) {
        kill(__pid,__pthread_sig_cancel);
      }
      else {
        __pthread_restart_new(iVar2);
      }
    }
    iVar2 = 0;
  }
  return iVar2;
}