PDA

Ver la versión completa : Suicidio de un proceso y ONEXIT



Aiken
20/11/2009, 22:05
Hola chicos,

Tengo una duda, es mejor que un proceso se suicide o que sea el padre el que se encargue de matarle?

lo del suicidio, en el manual de fenix en los ejemplos lo suele hacer haciendo un "return" en cualquier punto del codigo que quieras que se suicide.

Pero haciendo un "return" ejecutara lo que hay en el ONEXIT?

O si en lugar de un return, dejamos que se salga de su bucle principal, morira no? pero ejecutara el codigo del ONEXIT?


Por si afecta, estoy hablando de fenix 092a.
Aiken

SplinterGU
21/11/2009, 04:23
siempre que muere un proceso que tiene onexit, sea como sea que muere/finaliza, se ejecuta el onexit... lo hice yo... :D

Aiken
21/11/2009, 12:11
siempre que muere un proceso que tiene onexit, sea como sea que muere/finaliza, se ejecuta el onexit... lo hice yo... :D



proceso pepito()
private int cuenta; end
begin
graph=1; cuenta=0;

loop
cuenta++;
if (cuenta>10) return; end
frame;
end


onexit:
unload_map();

end

es decir que poniendo algo asi, el unload_map se ejecutaria cuando cuenta>10 no?

en Bennu tambien?

Aiken

Segata Sanshiro
21/11/2009, 12:42
No sabía que un proceso podía usar return :D ¿Se puede hacer también una llamada del estilo resultado = mi_proceso(); ? ¿El proceso que llama se paraliza hasta que el otro llega al return, igual que si hubiera llamado a una función?

Yo siempre usaba signal(id,s_kill); :D

Aiken
21/11/2009, 13:17
No sabía que un proceso podía usar return :D ¿Se puede hacer también una llamada del estilo resultado = mi_proceso(); ?


si haces eso, te creara un nuevo proceso de tipo mi_proceso y te devolvera su id en la variable.

el return lo usan como break por asi decirlo.

Aiken

Segata Sanshiro
21/11/2009, 13:25
si haces eso, te creara un nuevo proceso de tipo mi_proceso y te devolvera su id en la variable.

el return lo usan como break por asi decirlo.

Aiken

Tienes toda la razón del mundo, me estoy releyendo y no comprendo cómo he preguntado esa tontería tan gorda (que además he usado miles de veces) xD

GameMaster
21/11/2009, 13:37
Lo único que puedo aportar es que en DIV2 tenia un proceso que creaba un hijo, y al matar el padre el hijo moria automaticamente, en Bennu no moria el hijo, he tenido antes de matar el padre, matar el hijo :)

Drumpi
21/11/2009, 13:58
Lo único que puedo aportar es que en DIV2 tenia un proceso que creaba un hijo, y al matar el padre el hijo moria automaticamente, en Bennu no moria el hijo, he tenido antes de matar el padre, matar el hijo :)

¿EEEHH? ¿Mande? eso es un fallo de programación, si un padre moría en DIV el hijo quedaba huéfano y se convertía en hijo del proceso main.

La pregunta importante es, si muere el padre y el proceso main ¿quien adopta a los procesos huérfanos?

GameMaster
21/11/2009, 14:11
Es más, en Bennu sino mataba el hijo el programa hacia crash, era el motivo por el cual al matar un enemigo que lanza una hacha y esta estaba en pantalla el juego petaba...

Drumpi
21/11/2009, 14:20
Eso es que el hijo leía alguna variable del difunto padre, seguro ¿has mirado el mensaje de error? seguro que es algo del estilo "no se encuentra el proceso (xxxx)".

GameMaster
21/11/2009, 14:26
si, porque la hacha volvia al enemigo y pasado algun tiempo la vuelve a lanzar :)
No lo miré porque ejecuto con un bat y la pantalla no se queda en pantalla al salir, pero tampoco importa eso lleva ya tiempo solucionado :)
Ha sido sólo a titulo de nota :)

SplinterGU
22/11/2009, 02:04
proceso pepito()
private int cuenta; end
begin
graph=1; cuenta=0;

loop
cuenta++;
if (cuenta>10) return; end
frame;
end


onexit:
unload_map();

end

es decir que poniendo algo asi, el unload_map se ejecutaria cuando cuenta>10 no?

en Bennu tambien?

Aiken

correcto!


No sabía que un proceso podía usar return :D ¿Se puede hacer también una llamada del estilo resultado = mi_proceso(); ? ¿El proceso que llama se paraliza hasta que el otro llega al return, igual que si hubiera llamado a una función?

Yo siempre usaba signal(id,s_kill); :D

correcto! Si un proceso tiene return con valor, este proceso pasa a ser una funcion, si tiene FRAME en medio, el padre no es despertado por este FRAME, sino que espera al return toma el valor y luego sigue.
No has preguntado ninguna estupides, es una pregunta perfecta.



si haces eso, te creara un nuevo proceso de tipo mi_proceso y te devolvera su id en la variable.

el return lo usan como break por asi decirlo.

Aiken

No es del todo cierto, solo devuelve el ID al momento de FRAME si el proceso no retorna valor.


Es más, en Bennu sino mataba el hijo el programa hacia crash, era el motivo por el cual al matar un enemigo que lanza una hacha y esta estaba en pantalla el juego petaba...

Eso no deberia ser correcto, DIV tenia procesos padres.... ahhhhh, ya veo, ahora me doy cuenta mientras escribo.... seguro que div tenia algun chequeo que si se intentaba usar una variable de otro proceso muerto, el proceso que intentaba hacerlo moria...

Drumpi
22/11/2009, 04:56
Eso no deberia ser correcto, DIV tenia procesos padres.... ahhhhh, ya veo, ahora me doy cuenta mientras escribo.... seguro que div tenia algun chequeo que si se intentaba usar una variable de otro proceso muerto, el proceso que intentaba hacerlo moria...

Que yo recuerde (y de esto hace ya seis años) el programa se cerraba si accedías a una variable local de un proceso muerto en un 80% de las veces, anda que no tardé en solucionar dos problemas de esos.
Al menos a partir de Fenix ya lo indicaba con un error.

Por cierto, aun falta por responder a mi tontería: si a un proceso se le muere el padre, y muere el proceso main ¿queda totalmente huérfano o pasa a depender de otro porceso?

GameMaster
22/11/2009, 09:38
Te cuento a lo que mi entender ocurre:

Al morir el padre, las señales que el hijo lea o le envie al padre que ya no existe, son tratadas y no devuelven error, por eso DIV no peta, caso similar a mi parecer es el tema de que te hable antes sobre hacer unload de un sonido inexistente, en DIV tampoco devuelve error, y seguramente existan más cosas en que ocurre la misma diferencia, o sea, en que div esto se trata de una forma en que el programador ni se entera que tendria un error ahí por ese motivo de inexistencias :)

Ahora ya depende de ti lo que se tiene que tratar como error o no, en mi opinion como Bennu es más explicito y detalla más las distintas formas de actuar, esto deberia quedar tal cual lo tienes actualmente, porque si por ejemplo esto te parece que se tenga que tratar como en DIV lo de los sonidos seria igual y muchas más cosas...


Esto esta en el hijo, y son las condiciones que matan al hijo, y al contrario de lo que supone Splinter (y yo en el primer mensaje :)), en DIV, al morrir el padre el hijo no muere, sencillamente ignora las señales del padre, y en este caso sólo va morir cuando se ejecute el ultimo IF, o sea, cuando salga de la pantalla (mapa).

IF (father.flags == 0)
IF (x < father.x)
father.estado = 0;
BREAK;
END
ELSE
IF (x > father.x)
father.estado = 0;
BREAK;
END
END
IF (x > 5100 OR x < -100)
BREAK;
END

< - >
2 - He estado haciendo pruebas, yo estaba matando el hijo antes de morrir el padre para solucionarlo en Bennu, pero lo ideal es que quedará como en DIV, o sea. si mato el padre, la hacha que lanza sigue en pantalla y sólo va desaparecer cuando salga de pantalla (como en la realidad si el enemigo fuera real :)).

He estado buscando y los foros de Bennu, y me entero que seria posible, si antes de aceder a las propriedades del padre comprobamos que este sigue activo, o sea, con:

existe_padre = exists(inimigo3(x, y));

comprueba que el padre existe

o con

existe_padre = get_id(inimigo3(x, y));

devuelve 0 si el padre no existe

y despues si esta flag es verdadera acedemos al padre, si no lo es no lo hariamos.

El problema es que cuando pongo una o otra me crea un padre nuevo!!!!
O sea, cada vez que se ejecuta esto en el hijo este me crea un padre más...

Esto es un Bug o es que estoy haciendo mal la llamada de exists o get_id ??

Drumpi
22/11/2009, 17:47
Es que al hacer:
existe_padre = exists(inimigo3(x, y));
Estás creando un nuevo proceso.
Debes hacer el exists con la ID del proceso que quieres comprobar. Creo que en tu caso es father (supongo que sabes lo que es).

Respecto a cómo actuaba DIV respecto a acceder a variables de procesos muertos, no se si es que me ignoras o te expresas fatal, porque creí haber dicho que DIV se cerraba sin decir nada.
Y si matas a un proceso, sus hijos no tienen por qué morir, a menos que hagas un s_kill_tree, los hijos siguen activos y se convierten en hijos del proceso main. Lo que ya no se es si esos procesos hijo toman la ID del main en sus variables locales father, que creo que no.

GameMaster
22/11/2009, 18:25
Pero como puedes decir que DIV1 se cerraba sin decir nada, y que te estoy ignorando, si yo estoy diciendo eso baseandome justamente en la ejecución del juego en DIV1 ??!!!

Vamos que lo tengo aqui mismo, y mato el padre y la acha sigue moviendose hasta que sale de pantalla!! Encima que te dije que en Bennu tambien lo corregi matando el proceso acha al morrir el padre... y que sólo quiero con el exists que haga exactamente lo mismo que en DIV1, o sea, que siga en pantalla al morir el padre.

Claro que sus hijos no tienen que morir, acaso lo he dicho (bueno lo dije por lapso en el primer mensaje pero en el ultimo lo he corregido) ? :)

Drumpi
23/11/2009, 00:47
Entonces te he entendido mal, sorry.
Y no se si es que mi cabeza me juega malas pasadas o que se corrigió en DIV2, lo que se es que tenía un proceso nave y un proceso hijo que generaba el fuego de los motores, comprobando constantemente la posición del padre sin comprobar si este existía, y al morir el padre se colgaba el juego.
Es más, en el mismo descubrí que si una región tenía 0 pixels de ancho o de alto, el 50% de las veces ¡crash!

Espero al menos haber resuelto tu duda de exists ^^U

GameMaster
23/11/2009, 01:13
Sobre el exists, si funciona, lo que pasa es que al hacer el IF sólo si el padre existe tambien me peta, te pongo el código:

...
existepapi = exists(father);
...

LOOP

...

IF (existepapi == true)

IF (father.flags == 0)
IF (x < father.x)
father.estado = 0;
BREAK;
END
ELSE
IF (x > father.x)
father.estado = 0;
BREAK;
END
END


END

...

Me imagino que es porque comprueba que existe el padre sólo al principio, y despues durante el loop el padre muere y no actualizamos/miramos de nuevo si el padre aún esta vivo y entra en el IF, pero ya no deberia, sólo se me ocurre esto haciendo un repaso por alto, tampoco le he dedicado mucho tiempo, he estado con otras cosillas :)

bulbastre
23/11/2009, 01:14
jesus focking christ, cuanta violencia

GameMaster
23/11/2009, 01:16
ya ves, lo que nos enseñan los videojuegos [wei]

Drumpi
23/11/2009, 01:38
Pues si, te falla porque la comprobación la tienes que hacer cada frame, porque si lo compruebas sólo al principio, es posible que el padre muera tras 234 frames, y entonces accedes a los datos del proceso muerto.

Ya ves lo que tenemos aqui liado, y aun así no hemos sido aun capaces de conseguir procesos "zombies" (¡¡¡que si, que existen!!!).

SplinterGU
23/11/2009, 03:32
man, el exist lo tenes que hacer dentro del loop, si lo haces afuera solo chequeas al inicio...

con respecto a lo otro, yo te entendi que se moria el hijo en div cuando se moria el padre....

por otro lado, si un proceso accede a variables de otro proceso, que ya esta muerto, no hay logica razonable en que este proceso que acceder a variables siga su curso... no deberia, es un error, de seguir los valores que obtiene de un proceso que no existe serian cualquier cosas, y podrian ser un riesgo en la estabilidad de todo el sistema... por ende no me parece logico que si un proceso accede a variables de otro proceso que ya no existe siga funcionando... no deberia hacerlo.

otra cosa diferente es que esas variables no hagan a su logica...

drumpi, cuando un proceso se queda sin padre queda huerfano, un huerfano es un huerfano... nunca es adoptado... (en un momento yo hice un cambio para que lo fuera, pero lo retire, porque no era correcto)

Drumpi
23/11/2009, 19:10
En Linux, si un proceso depende de otro y el padre moría, la PID pasa a depender del proceso init.
Y Dado que DIV se basó en estos conceptos de Linux, en la documentación se dice que se hace eso, de ahi que yo andase buscando paralelismos.

< - >
En Linux, si un proceso depende de otro y el padre moría, la PID pasa a pertenecer al proceso init.
Y Dado que DIV se basó en estos conceptos de Linux, en la documentación se dice que se hace eso, de ahi que yo andase buscando paralelismos.

GameMaster
23/11/2009, 19:18
Curioso, ten han quedado 2 frases paralelas :D

SplinterGU
24/11/2009, 02:59
si fuera asi, no existirian los procesos huerfanos...

pero bueno, asi es como se comporta...