¡Nunca suspenda un hilo en su propio proceso!

2025-04-15
¡Nunca suspenda un hilo en su propio proceso!

Un cliente encontró un problema de bloqueo de baja frecuencia y larga duración: su hilo de interfaz de usuario llamaba al kernel y simplemente se bloqueaba. El volcado del kernel no pudo mostrar un rastreo de pila del modo de usuario porque la pila se había descartado. La investigación reveló un hilo watchdog que periódicamente suspendía el hilo de la interfaz de usuario para capturar rastreos de pila, pero esta vez se bloqueó durante más de cinco horas. La causa raíz: un interbloqueo. El hilo watchdog, intentando obtener un rastreo de pila, necesitaba un bloqueo de tabla de funciones, pero el hilo de la interfaz de usuario estaba suspendido, manteniendo el bloqueo. El artículo enfatiza que nunca se debe suspender un hilo dentro de su propio proceso, ya que esto aumenta el riesgo de interbloqueos debido a la contención de recursos. Para suspender un hilo y capturar su pila, hágalo desde otro proceso para evitar interbloqueos.

Leer más

El Misterio del Adaptador Pasivo de Ratón USB a PS/2

2025-03-28
El Misterio del Adaptador Pasivo de Ratón USB a PS/2

Los ratones USB antiguos a menudo incluían un adaptador verde para convertir el conector USB tipo A a PS/2. Este no era un adaptador inteligente; era puramente mecánico, sin circuitos. El propio ratón hacía la conversión, detectando el tipo de señal (USB o PS/2) y ajustándose en consecuencia. Es análogo a un adaptador de corriente simple: la inteligencia reside en el dispositivo, no en el adaptador. Por lo tanto, si encuentra uno de estos, recuerde que es solo un conector físico; la conversión real ocurre dentro del ratón de bus dual.

Leer más

Depurando una condición de carrera: la trampa de RtlRunOnceExecuteOnce

2025-03-23
Depurando una condición de carrera: la trampa de RtlRunOnceExecuteOnce

Un compañero encontró un complicado problema de concurrencia durante una sesión semanal de depuración: una sección crítica falló en prevenir que dos hilos entraran en el mismo bloque de código, llevando a un fallo de registro doble de `TraceLoggingRegister`. La depuración profunda reveló la causa raíz: la función de inicialización `InitializeCriticalSectionOnce` para `RtlRunOnceExecuteOnce` devolvió incorrectamente `STATUS_SUCCESS` (0). Esto llevó a `RtlRunOnceExecuteOnce` a creer que la inicialización falló, causando que reinicializara la sección crítica en cada llamada, desencadenando la condición de carrera. La solución fue cambiar el valor de retorno a `TRUE`, o más elegantemente, reemplazar `CRITICAL_SECTION` con `SRWLOCK`. Este caso destaca cómo errores sutiles en el valor de retorno pueden llevar a consecuencias graves y subraya la importancia de elegir la primitiva de sincronización apropiada.

Leer más
Desarrollo

Compilador TypeScript Nativo: Mejora del Rendimiento 10 veces mayor

2025-03-11
Compilador TypeScript Nativo: Mejora del Rendimiento 10 veces mayor

El equipo de TypeScript anunció un puerto nativo del compilador y las herramientas de TypeScript para mejorar drásticamente el rendimiento. Esta implementación nativa se proyecta para acelerar drásticamente el inicio del editor, reducir la mayoría de los tiempos de compilación en 10 veces y reducir sustancialmente el uso de memoria. Las pruebas iniciales muestran mejoras en la velocidad de compilación de más de 10 veces para varios proyectos grandes (por ejemplo, VS Code, Playwright). El futuro TypeScript nativo (previsto como TypeScript 7) admitirá refactorizaciones más avanzadas, análisis de código más profundo y sentará las bases para las herramientas de desarrollo de IA de próxima generación. TypeScript 6 (basado en JS) seguirá manteniéndose para garantizar una transición fluida.

Leer más

Problema sutil de invocación de C++/WinRT y su solución

2025-03-09
Problema sutil de invocación de C++/WinRT y su solución

Una solicitud de extracción de C++/WinRT solucionó una ambigüedad en la llamada a `invoke` en `winrt::impl::promise_base::set_completed`, causada por la búsqueda dependiente de argumentos (ADL). La actualización a corrutinas C++20 expandió el espacio de búsqueda ADL, encontrando inesperadamente `std::invoke` en lugar de `winrt::impl::invoke`. El artículo detalla el mecanismo ADL y proporciona un parche para versiones anteriores de C++/WinRT: declarando una función `invoke` más adecuada en el espacio de nombres `winrt::Windows::Foundation` para guiar al compilador. Este parche también incluye una afirmación estática para garantizar que se elimine automáticamente después de actualizar C++/WinRT.

Leer más
Desarrollo

La Trampa del 'Otro' en los Enumerados: Compatibilidad de Versiones y Enumerados Abiertos

2025-03-02
La Trampa del 'Otro' en los Enumerados: Compatibilidad de Versiones y Enumerados Abiertos

Este artículo analiza los inconvenientes de usar un valor 'Otro' (por ejemplo, WidgetFlavor::Otro) en los enumerados de C++. Agregar nuevos valores a un enumerado presenta un desafío: cómo manejarlos y mantener la compatibilidad con versiones anteriores del código. El autor sugiere evitar el uso de 'Otro' y declarar el enumerado como abierto, permitiendo que los programas gestionen los valores no reconocidos de forma independiente. Esto soluciona elegantemente los problemas de compatibilidad de versiones, evitando confusiones al agregar nuevos valores y garantizando transiciones suaves entre el código antiguo y el nuevo.

Leer más

Mejoras importantes en MSVC Address Sanitizer (ASan)

2025-02-25
Mejoras importantes en MSVC Address Sanitizer (ASan)

Microsoft ha mejorado significativamente la calidad de MSVC Address Sanitizer (ASan). Han subido con éxito las partes principales de ASan a LLVM, permitiendo una integración más rápida de las mejoras de la comunidad LLVM. Además, han integrado ASan en la base de código de MSVC, incluyendo el compilador, el enlazador y las herramientas, permitiendo la detección de problemas de seguridad de memoria en la integración continua. Visual Studio 2022 versión 17.13 incluye numerosas correcciones, reduciendo los falsos positivos, mejorando los informes de errores y gestionando escenarios multiprocesos.

Leer más
Desarrollo

Instalador de Windows 95: La historia sorprendentemente compleja de un pequeño SO

2025-02-17
Instalador de Windows 95: La historia sorprendentemente compleja de un pequeño SO

Este artículo revela la complejidad oculta del programa de instalación de Windows 95. Para crear un instalador aparentemente simple, el equipo tuvo que construir un minissistema operativo desde cero dentro de MS-DOS, incluyendo bibliotecas gráficas, un administrador de ventanas, soporte multilingüe e incluso compatibilidad con Windows 3.1. Finalmente, se dieron cuenta de que era mucho más eficiente usar el tiempo de ejecución existente de Windows 3.1, evitando enormes esfuerzos de desarrollo. La historia destaca la importancia de la reutilización de código en la ingeniería de software y expone la naturaleza sorprendentemente compleja del programa de instalación de Windows 95.

Leer más
Desarrollo

La Pantalla 'Ahora es Seguro Apagar el Ordenador': Un Viaje de Nostalgia al Windows 95

2025-02-16
La Pantalla 'Ahora es Seguro Apagar el Ordenador': Un Viaje de Nostalgia al Windows 95

¿Recuerdas el mensaje 'Ahora es seguro apagar el ordenador' en Windows 95? Esta historia narra un divertido episodio en un avión donde un pasajero de al lado reiniciaba repetidamente su portátil tras ver la pantalla 'Windows se ha apagado', sin darse cuenta de que tenía que apagar la máquina manualmente. Esto destaca la falta de administración de energía en los ordenadores antiguos y explica por qué Windows 95 incluyó el mensaje: un recordatorio amable de que era seguro presionar el botón de encendido.

Leer más
Tecnología

Anécdota de la reunión de especificaciones USB: La prima del azul translúcido

2025-02-10
Anécdota de la reunión de especificaciones USB: La prima del azul translúcido

En una reunión de especificaciones USB, una empresa presentó sus unidades de disquete USB, ofreciendo sorprendentemente versiones separadas para PC y Mac. Los miembros del comité estaban perplejos, ya que la especificación garantizaba que la misma unidad funcionara en ambos sistemas. El representante explicó que las unidades eran electrónicamente idénticas; la única diferencia era que la versión para Mac venía en plástico azul translúcido y costaba más. Esto reflejaba la tendencia popular del plástico translúcido del iMac en ese momento y destacaba cómo algunos fabricantes aprovechaban las diferencias de diseño para obtener precios premium.

Leer más

El 'Recolector de Basura Nulo' en el Software de Misiles: ¿Fugas de Memoria? ¡No es un Problema!

2025-02-07
El 'Recolector de Basura Nulo' en el Software de Misiles: ¿Fugas de Memoria? ¡No es un Problema!

Un desarrollador relata una aplicación inteligente de un 'recolector de basura nulo' en el software de misiles. Debido al tiempo de vuelo limitado y a la abundante memoria de hardware, las fugas de memoria en el programa no eran una preocupación. Los ingenieros calcularon el potencial de fuga de memoria durante el vuelo y agregaron el doble de esa cantidad de memoria para garantizar que el programa no se bloqueara antes de la finalización de la misión. Este enfoque aprovechó inteligentemente las restricciones de tiempo de ejecución del programa, resolviendo eficazmente el problema de las fugas de memoria: una especie de 'recolección de basura definitiva'.

Leer más

Reestructuración de la Criptografía de Go 1.24: Logrando el Cumplimiento de FIPS 140-3

2025-02-06

Go 1.24 refactorizó significativamente sus paquetes de criptografía para lograr el cumplimiento de FIPS 140-3. Este es un gran paso adelante, con una implementación en Go puro (y ensamblador Go) de un módulo criptográfico validado por FIPS 140-3, eliminando la dependencia de cgo o llamadas al sistema. Microsoft Go 1.24 también se actualizó, agregando soporte de vista previa para macOS y soporte mejorado para Azure Linux, pero mantiene el uso de bibliotecas del sistema para la criptografía, divergiendo del enfoque oficial de Go. Nuevas variables de entorno como GODEBUG=fips140=on y GOFIPS140=latest controlan el modo FIPS; el tiempo de ejecución lo habilita automáticamente en sistemas compatibles con FIPS (Azure Linux, Windows).

Leer más
Desarrollo

Un fallo de diseño y una tetera oculta en el protector de pantalla 3D Pipes de Windows

2024-12-28
Un fallo de diseño y una tetera oculta en el protector de pantalla 3D Pipes de Windows

El querido protector de pantalla 3D Pipes de Windows, conocido por sus hipnóticas animaciones de tuberías, esconde un secreto poco conocido: una tetera que aparece raramente. Esta tetera es un homenaje a la tetera de Utah, un objeto de referencia estándar en gráficos por computadora, pero su increíblemente baja tasa de aparición llevó a quejas de los usuarios sobre baja productividad. El artículo también revela que, en versiones anteriores de Windows, el protector de pantalla causaba un alto uso de la CPU en los servidores debido al renderizado de software, recomendando un protector de pantalla de pantalla negra para servidores.

Leer más

Errores del compilador de C++: Errores sin sentido de una declaración de función

2024-12-12
Errores del compilador de C++: Errores sin sentido de una declaración de función

Un desarrollador que añadía soporte XAML a una aplicación C++ encontró una serie de errores del compilador simplemente incluyendo el archivo de cabecera winrt/Windows.UI.Xaml.h. Los errores provenían de lo que parecía ser una declaración de función normal: `template struct consume_Windows_UI_Xaml_IExceptionRoutedEventArgs { [[nodiscard]] auto ErrorMessage() const; };` La causa raíz era una macro preexistente llamada ErrorMessage en el proyecto del desarrollador, que entraba en conflicto con el nombre de la función. Esta macro creaba un objeto ErrorMessageString y devolvía un puntero a una cadena de mensaje de error. La falta de límites de la macro hizo que el compilador interpretara erróneamente la declaración de la función como una invocación de macro, lo que resultó en errores como "argumentos insuficientes". La solución consistió en deshabilitar la macro usando #pragma undef antes de incluir el encabezado o eliminar la macro por completo y reemplazarla con una función en línea.

Leer más