#cause I dont like th interface
Explore tagged Tumblr posts
kaztrolls · 6 years ago
Text
I need a really good story boarding application because medibang just does not do it for me and sai’s useless
1 note · View note
hgfstreamchats · 7 years ago
Text
The Room
Welcome to the 'highglossfinish' room. Jalaperilo: Hello! Knock Out: Hello, Jalaperilo human! Jalaperilo: *squints* Jalaperilo: what the hell? Knock Out: I have no clue. Jalaperilo: haha Jalaperilo: who made you do this? Knock Out: Excellent question. Jalaperilo: somehow, this isn't worst than The Room? Knock Out: Oh, that's encouraging. Jalaperilo: Oh doc, you're in for a treat Knock Out: I can't wait.
Jalaperilo: the first time I watched this was also on a random stream i found. it was also the stream where I found the epic horror that is Re-Animator Knock Out: Which we also need to stream someday. Knock Out: Are...are they all interfacing with each other? Jalaperilo: please dont judge human interfacing on this film Knock Out: No promises. Knock Out: Dear Unicron, get on with it. Jalaperilo: im dying Knock Out: Gah! Jalaperilo: i have my head in my hands Knock Out: That was completely relevant and necessary. Jalaperilo: just like this movie Jalaperilo: cause hes terrible in bed Knock Out: What, humans don't like spastic little hip twitches? Jalaperilo: that arent in the vicinity of where they should actually be thrusting? Knock Out: He tried. Sort of. Jalaperilo: does he get a gold star with 'you tried' on it? Knock Out: He gets one of the lopsided ones. Matches his technique. Jalaperilo: hahah! Knock Out: Gladly. Jalaperilo: hehe Jalaperilo: oh no. please dont. he's my friend *DOES NOTHING TO RESIST SLEEPING WITH HER* Knock Out: Way to stick to your guns there, human we just met. Jalaperilo: he has the breaking strain of a kit kat Knock Out: Hah! Knock Out: What actually is he supposed to be penetrating? Knock Out: *exactly Jalaperilo: unless she has some weird random holes in her, i dont know what theyre stabbing at Knock Out: That's the plot twist. Jalaperilo: thats she's actually a sponge Knock Out: Or in possession of some kind of prehensile protein sleeve. Jalaperilo: erg Knock Out: Go back to the fat pug. Jalaperilo: this kid is creepy Knock Out: He grew up to be one of the sex offender shufflers. Jalaperilo: hahah! Jalaperilo: she ordwered the worst pizza Knock Out: Isn't that supposed to be one of those human foods you can't ruin? Knock Out: And yet, somehow, she did? Jalaperilo: please dont maake love again Knock Out: Oh, please, no. Not again. Knock Out: Have mercy. Jalaperilo: you cant get away ko Jalaperilo: we both have to live with this Knock Out: We have to live with his sloppy twitches. thenightetc: ...What did I walk in on Jalaperilo: get out while you can Jalaperilo: hello btw Knock Out: Run, and live well. Knock Out: And hello. thenightetc: (Lost track of time and tumblr decided not to alert me that there were new posts!  :') ) Jalaperilo: blah blah blah btw i have cancer. anyway.... thenightetc: the acting is really... something. Jalaperilo: have you never seen this before either? Jalaperilo: you're in for as right treat thenightetc: I have not.  I've just heard it's notoriously terrible thenightetc: It's the... Wisseau thing right? Knock Out: It is indeed. Jalaperilo: yes Knock Out: Who's this unfortunate soul? thenightetc: :( Jalaperilo: urgh thenightetc: I was 80% sure that was leading up to murder thenightetc: Just felt like one of those scenes, y'know? Jalaperilo: probably would have done the plot a favour with a murder or two Knock Out: That makes it worse! Cardinal: Hello, hello! Knock Out: Cardinal! How good to see you! Jalaperilo: hello! Knock Out: But how tragic you're here. thenightetc: So, ah, what all did I miss in terms of plot? thenightetc: ...Oh?  Murder time NOW? Jalaperilo: tommy is the best ever, lisa hates him one minute and loves him the next Jalaperilo: you also missed2 bad sex scenes Jalaperilo: there is no cohearent plot Cardinal: I see what you mean by tragic. thenightetc: He was JUST yelling about money, it's obvious "what he wants" Jalaperilo: how does one accidentally buy drugs lol thenightetc: Where did that guy come from Knock Out: They obviously care deeply for the 36 year old man they adopted. Jalaperilo: haha thenightetc: oh no Jalaperilo: stop making aliens think humans are terrible at sex! thenightetc: Please tell me they're not going to phone sex now Starscreamapillar: Good, I have not missed out on too much madness. Knock Out: No, just several abysmal fragging scenes. Knock Out: Welcome to the disaster, by the way. Cardinal: Oh, did I miss the stair sex? Cardinal: ha ha ha what a story mark Starscreamapillar: I am not at all displeased to have missed out on those. Jalaperilo: lucky you cardinal thenightetc: Yes count your blessings Knock Out: What a charmer. Jalaperilo: thanks for dissing my gender thenightetc: I wish they'd both fall off the roof. Starscreamapillar: This human learned how to speak from the Internet, didn't he. Knock Out: Shuut Cardinal: *gun fingers* shuut thenightetc: What is he implying here Jalaperilo: there is a big theory on the net that tommy wiseau isnt actually human Cardinal: hahn? Knock Out: That's...actually quite plausible? thenightetc: It's not nice to mock whatever speech impediment or accent or whatever he has, guys. Starscreamapillar: Are conversations normally carried out at a recline like that? thenightetc: Why is her friend all shocked that she doesn't want to marry the guy who hit her thenightetc: Terrible friend Jalaperilo: this is how humans emote yes? Starscreamapillar: Apparently. FeralDog: goonai lisa Starscreamapillar: Ah yes. They are in the totally real alley. Cardinal: Of course! FeralDog: this looks so.... buffy the vampire slayer knockoff FeralDog: I keep expecting the undead to strike thenightetc: I keep hoping for the undead to strike. FeralDog: you know... Knock Out: This movie is like a victim of head trauma, dazed and wandering through a field somewhere. FeralDog: there supposedly was a vampire subplot that Wiseau nixed? Jalaperilo: hyoomans throw football as bonding yes? Cardinal: ((Apparently Tommy Wiseau did originally want to enter onto the roof on a flying car Cardinal: ((and--yeah, the vampire reveal)) thenightetc: Oh boy!  Is he dying Cardinal: ((But he didn't nix it, he wanted it Cardinal: ((they talked him out of it Starscreamapillar: And then he ate that younger man. Jalaperilo: he ends up eating somethign alright thenightetc: ...well, that's not alarming Jalaperilo: the only plot this film has is everyone is terrible except tommy who is perfect Starscreamapillar: Somehow I get the feeling even watching this from the beginning wouldn't have it make any more sense. FeralDog: he's not even looking at the psych Starscreamapillar: I doubt that man's credentials. FeralDog: he says dejectedly Jalaperilo: time to tell us how *** women are? FeralDog: yep Cardinal: oh no the psychologist knows thenightetc: Johnny does sort of look like he's halfheartedly dressing up as a vampire Cardinal: "Can I meet the married woman you're boinking?" thenightetc: Totally normal question to ask Knock Out: I feel like I've blown a neural circuit. Jalaperilo: you made love twivce in this film already FeralDog: You keep playing psychologist with us! now let me ask you questions a psychologist should answer! Cardinal: Shh, shhhh.  Let the words eat away at your processor.  The pain will recede soon. Jalaperilo: cheep cheep cheep thenightetc: oh god Starscreamapillar: .... Cardinal: cheep cheep cheep thenightetc: is he going to--No, I guess not Cardinal: I NEVER ATE SO MUCH FeralDog: the only sane comment Jalaperilo: *wink* FeralDog: this sounds like he's making it up as  he goes and the music is not helping thenightetc: ...I don't think that's how checks work Jalaperilo: just ndissing the *** outta you lisa Starscreamapillar: I don't think any of this is how it works. Cardinal: Denny why are you sitting on the floor Starscreamapillar: Sit on the floor, with the front door open. Jalaperilo: denny asked her for a kiss earlier thenightetc: Do iiiiiiit FeralDog: i almost feel like the vampire subplot would make this make sense. in a he's hypnotized too many people and now can't keep control of the illusions so the wor;d's gone mad around him,,,,,, Jalaperilo: is knock out still with us or did he actually fry his processor? Starscreamapillar: I envy him if he did brown out. This is painful. Knock Out: Theoretically, I'm still here. Jalaperilo: sorry i tried to throw you off a building? Jalaperilo: good. was worried you'd left us to suffer on our own FeralDog: yeah, man it's totally fine. happens all the time Cardinal: He already knows your secret. Cardinal: I'm so depressed bro Jalaperilo: aint we all? Starscreamapillar: That small door. thenightetc: The roof bothers me more.  Looks so fake. Jalaperilo: none of these suits fit even slightly Cardinal: *ominous music*  He shaaaved Starscreamapillar: They found the suits in a box in their fake alley. FeralDog: wwwwwwwwwhat Cardinal: . . . . . Jalaperilo: lol Cardinal: well Cardinal: I wish Trogdor were here to see this. Cardinal: Maybe he could make sense of it. Jalaperilo: is tommy trogdor's holoavatar? Knock Out: Fact! Starscreamapillar: Did they have a reason to be wearing tuxedos earlier? thenightetc: Maybe they were trying them on to make sure they fit? Cardinal: . . . nice segue. Starscreamapillar: No one paid for those drinks. Starscreamapillar: Drat. Now I must suffer through this. Jalaperilo: god Knock Out: For the love of Unicron, no. Cardinal: Shield your optics! Jalaperilo: can unicron come eat us? Starscreamapillar: I think exploding again would be less painful than this. FeralDog: do we really need to see the ENTIRE sex scene FeralDog: a fadeout would be appreciated Starscreamapillar: How is this still going on?! Jalaperilo: in all 4? sex scenes, no one seems to have thrust anywhere near her vagine Knock Out: What I tell you? Protein sleeve. Jalaperilo: oh year lol Jalaperilo: *yeah FeralDog: more football based bonding Starscreamapillar: I feel as though you could replace these actors with golden retreivers and lose nothing. Jalaperilo: 'i saw a hyooman program with this so all hyoomans do this bonding' Knock Out: Please, no. Cardinal: AGAIN? thenightetc: Again?! Knock Out: Not again. No more. Cardinal: *weeps quietly* thenightetc: Please let something burst in and eat them Knock Out: Oh, thank you! Cardinal: Wow, Lisa. Jalaperilo: was there anything like this on cybertron? thenightetc: Some of the audio seems a little... desynched or something thenightetc: Is this... dubbed? Starscreamapillar: If there was, I certainly didn't watch it. Knock Out: I think this might be one of those "once in a universe" things. Jalaperilo: *** Jalaperilo: we really are the worst species Cardinal: Well, you are the spawn of Unicron. Knock Out: Take a bow. thenightetc: Excuse me, I'm not taking the blame for this movie. thenightetc: How dare. Jalaperilo: us all watching this now are now linked in a shared, horrific experience Starscreamapillar: As if I didn't already have enough horrifying experiences in my life. Jalaperilo: i like being the spawn of another species' devil thenightetc: ...Yikes thenightetc: What the *** Starscreamapillar: The film's writer clearly had some unresolved issues. thenightetc: You think? Jalaperilo: would you believe that tommy wiseau wrote ANd sirected AND acted in this? Jalaperilo: *directed Cardinal: Yes. Knock Out: And funded it, and apparently no one knows how. Starscreamapillar: Yes. Yes I would. Jalaperilo: alien money Cardinal: Deal with Unicron. Jalaperilo: probably traded a load of shanix with a skuxxoid Starscreamapillar: Are you certain he didn't kidnap these people, and force them to be in his film? thenightetc: Oh god, they're going to sneak off for another sex scene, aren't thy Starscreamapillar: 'Sneak'? thenightetc: Well. Cardinal: As Shockwave would say, "illogical." Jalaperilo: shockwave would shutdown at this film Cardinal: . . . Cardinal: I'm going to show it to him. Cardinal: Whoa, someone did the impossible and came BACK into the house. Knock Out: Sensitive with genuine human emotions. Cardinal: Leave your STUPID comments in your pocket! thenightetc: That's where I keep all *my* stupid comments. Cardinal: Good thinking!  Inviting my friends! Cardinal: What are they doing outside? Cardinal: I just? Cardinal: Alternate, help. Jalaperilo: cardinal is crashing lol thenightetc: Oh god. Knock Out: I can't help you. I'm so very, very sorry. Knock Out: I'm lost. I'm gone. Cardinal: *whimpers* thenightetc: *facepalm* Starscreamapillar: Surely he won't be able to count to nine months from now. Jalaperilo: haha thenightetc: That guy does look sort of like Xander Knock Out: Who *are* you? Jalaperilo: i think they swapped out an actor Starscreamapillar: No one will notice this loud conversation in public about her cheating. Knock Out: Doesn't matter, had cake. Jalaperilo: haha! thenightetc: They're hardly subtle about it.  Maybe everyone already knows. Cardinal: What do you mean, look at this subterfuge Cardinal: What do you mean, look at this subterfuge Jalaperilo: what planet IS he from? thenightetc: What do you mean, I always slow dance with my platonic friends Knock Out: I've spent the last hour pondering that same question. Starscreamapillar: He is fed up with this world. Knock Out: Most alien species that can mimic other species tend to be good at it. thenightetc: Hey, you know what would be funny after this? Knock Out: What? Jalaperilo: icepick lobotomy> Jalaperilo: ? Cardinal: "And I DEFINITELY have breast cancer." thenightetc: Just look for "arrested development chicken dance" on youtube Knock Out: Consider it done. thenightetc: I'm sure there are a BUNCH of clips caffienatedglitter: henlo Starscreamapillar: Someone had better end up murdered at the end of this. Knock Out: I hope it's me. thenightetc: For some reason I'd gotten the impression this was a horror movie Jalaperilo: you may just get your wish tonight screamy Starscreamapillar: The horror is in sitting through it. caffienatedglitter: oh god caffienatedglitter: EWWWW Starscreamapillar: Do Not call me that. thenightetc: :( Knock Out: I think we can agree we've all lost something precious tonight. caffienatedglitter: what did i walk in on Jalaperilo: you are the lucky one, to only suffer the end of this caffienatedglitter: how is the audio from the other end of the phone line so clear thenightetc: ...He already knew they were cheating together though? caffienatedglitter: what is his accent thenightetc: https://www.reddit.com/r/linguistics/comments/1gs6ol/what_the_heck_is_going_on_with_tommy_wiseaus_voice/ caffienatedglitter: he angery thenightetc: Not sure if there's an actual answer there, per se caffienatedglitter: he screm Thebes: Oh man, I appear to have been late to the worst movie thenightetc: You are correct caffienatedglitter: KNOCKING THINGS OVER IS THE ONLY WAY A MOVIE CHARACTER CAN EXPRESS ANGER thenightetc: Chew that scenery!  CHEW thenightetc: Aren't they just upstairs from him?  Can't they hear this going on? Thebes: How delicately he moves those bedsheets Starscreamapillar: I am disappointed at the lack of murder spree. Jalaperilo: this is more acting than the rest of the film thenightetc: Uh caffienatedglitter: ewwwww thenightetc: Why this Jalaperilo: i forgot that bit! Cardinal: . . . caffienatedglitter: ewvwwhw wnvjhwvg' Thebes: I think this is ... supposed to be pathos? caffienatedglitter: oh god caffienatedglitter: dude stop Cardinal: I've been asking myself the same thing. caffienatedglitter: holy Knock Out: FRAG. caffienatedglitter: he's dead Thebes: yes. yes he is. thenightetc: dramatic slow-mo caffienatedglitter: ... caffienatedglitter: YAAAAAAAAAAAY Jalaperilo: well at least he got his daily amount of iron? caffienatedglitter: no, he's sleeping Starscreamapillar: Yes, just put your hand right in that. thenightetc: Yeah, get his blood all over your hands caffienatedglitter: so many diseases Jalaperilo: bet you werent expecting that Doc thenightetc: Disturb the scene a little more Thebes: PATHOS caffienatedglitter: seriously pathogens love to travel through blood Knock Out: I can honestly say I wasn't. caffienatedglitter: what do you mean you lost him YOU DUMPED HIM caffienatedglitter: ALSO MARK DIDNT YOU WANT TO SEX HER BEFORE Thebes: YES. YES HE DID Cardinal: LEAVE US thenightetc: Wow Knock Out: Don't leave that one alone with the body! Jalaperilo: this whole film is about tommy's messiah complex caffienatedglitter: CALL THE COPS caffienatedglitter: CALL THE COIPS YOU IDIOTS Jalaperilo: knock out! haha thenightetc: No, no, they'll want to handle the gun a bit first too thenightetc: Get their fingerprints all over it caffienatedglitter: i tyhought he saids he didnt have any friends now everyones sobbin over his body caffienatedglitter: piugblswk caffienatedglitter: ive only been here for TEWO MINUTES Thebes: WAIT Cardinal: Amazing. Thebes: HE WAS GRABBING HER HAIR caffienatedglitter: WHY Starscreamapillar: Well, that was about as bad as having my head blown off again. caffienatedglitter: WHAT IS THIS MUSIC caffienatedglitter: INAPROPRIATE MUCH Jalaperilo: sexytimes on the corpse music FeralDog: good god Thebes: There's appropriate anything in this movie? Knock Out: Denny is there also. caffienatedglitter: "assistant to mr. wiseau"???? five people??? FeralDog: I feel like I just survived a deadly fever caffienatedglitter: those poor performers Jalaperilo: they were the five humans that taught him how to act like one of us Thebes: oh, man, there's abook about the weird, troubled production of this movie. It's so out there it's getting made into its own movie caffienatedglitter: i wish i'd gotten here earlier thenightetc: You shouldn't. caffienatedglitter: you misunderstand caffienatedglitter: i am a masochist caffienatedglitter: more assisstants jesus caffienatedglitter: welp caffienatedglitter: is that it Knock Out: The assistants were there to keep the Wiseau human from poking himself. caffienatedglitter: oh dear Thebes: yeah you missed the bit about Denny being into drugs and the bizarre casual cancer subplot caffienatedglitter: the room is a meme, i know the basic plot caffienatedglitter: wait caffienatedglitter: cancer caffienatedglitter: WHEN DID CANCER GET INVOLVED thenightetc: Yeah, there was cancer Jalaperilo: the mum is all i'm dying, its deffo cancer, andyway, marry tommy FeralDog: This lady casually announced that she had breast cancer caffienatedglitter: ooooh right caffienatedglitter: what Knock Out: I just take the suggestions, I don't question them. caffienatedglitter: at least it isn't the cheeeep cheep cheep thenightetc: They ALL have one caffienatedglitter: cheeep chepchepcheepcheep Starscreamapillar: . . . . caffienatedglitter: wait caffienatedglitter: frag for a second i thought his voice was robin williams Knock Out: ... Knock Out: ... Knock Out: ...Well, this has been an enlightening evening. Starscreamapillar: I think that's misrepresentative. Jalaperilo: well. its 3am here. i hope you appreciate my sacrifice to watch that film Jalaperilo: goodnight all! Knock Out: I do. caffienatedglitter: it's only 10:00 here Knock Out: Goodnight! FeralDog: 7:00 here FeralDog: https://xkcd.com/1400/ thenightetc: Awwww, the chicken dance bit is great though.  Even if that was a little poorly edited together. FeralDog: ^relelvant! Thebes: ikr? caffienatedglitter: my god Knock Out: Makes sense to me. thenightetc: Huh. Thebes: ... there's a trailer for a movie where someone is paid to act as Tommy Wiseau FeralDog: oh dear god thenightetc: ...Not sure if I want to see that or not. caffienatedglitter: that or he's the devil made flesg Knock Out: You can't replicate what's going on with this human (?). And no one ever should. thenightetc: That would explain why he looks slightly uncanny Thebes: they get weirdly close. The Disaster Artist trailer, if you want to see for yourself caffienatedglitter: he looks like he's a collage of body parts cut froma magazine caffienatedglitter: but 3d Knock Out: My credits are still on "alien." caffienatedglitter: and also a pervet thenightetc: I read that as "flaming disaster" Starscreamapillar: I think he is a mimic of some kind. Starscreamapillar: And the football is there. Of course. Thebes: it kinda was? Like it's based off the book The Disaster Artist, which is entirely about trying to get this weird alien sock puppet to act thenightetc: Oh god, I didn't notice. caffienatedglitter: is that actually him caffienatedglitter: does he actually think people like this unironically FeralDog: maybe he's one of the fair folk. But he's bad at it. Thebes: maybe he's a bunch of groundhogs trying to pilot a human Knock Out: I like the news scrolling by. caffienatedglitter: they're trying Knock Out: "Also, some humans died or something." thenightetc: "Like us on Facebook!" Thebes: yeah, kinda. Underscores this. caffienatedglitter: it's a special kind of *** caffienatedglitter: jesus he's like caffienatedglitter: idk thenightetc: Yeah, sports references, that's what I look for in a movie Thebes: how is he keeping a straight face Starscreamapillar: His sunglasses are unsettling. Knock Out: He's hiding something behind there. I'm not certain I want to know what. thenightetc: Soundwave's visor. caffienatedglitter: he's hiding madness, and not very well Knock Out: Tommy Wiseau confirmed for Soundwave. caffienatedglitter: YOU STUDIED PSYCHOLOGY caffienatedglitter: NO caffienatedglitter: BULL caffienatedglitter: what is this thenightetc: We've all been where now? Starscreamapillar: His insane word-salad rambling. caffienatedglitter: is he a human???? caffienatedglitter: knock out please advise thenightetc: The other guy looks so embarassed Knock Out: No advice. He landed on your planet, he's your problem. Starscreamapillar: The other guy is likely concerned if he upsets Wiseau that he wil be consumed. Thebes: I would be thenightetc: Yeah, he does look like he could just unhinge his jaw and, y'know... caffienatedglitter: ubigowj caffienatedglitter: but he's scary caffienatedglitter: he talks like he's got marbled in his mouth Knock Out: If you have to ask, the answer is probably "Tommy Wiseau can most definitely unhinge his jaw and kill some people." caffienatedglitter: HES A SNAKE Starscreamapillar: Snakes do not talk so much. thenightetc: Lime green shirt with matching lime green tie :( Thebes: it's like he agressively doesn't care. caffienatedglitter: this is not a man of earthly cares caffienatedglitter: oh god what'sthis Starscreamapillar: He only cares for how many souls he can harvest, and how much flesh he can consume. thenightetc: SOUNDS LEGIT thenightetc: Is that a hearse Starscreamapillar: Yes. caffienatedglitter: "family kidnapped by ninjas" yeah totally believable caffienatedglitter: ew caffienatedglitter: what\ caffienatedglitter: EWWWWWWWWW thenightetc: What the *** Knock Out: Alright, enough of that. caffienatedglitter: HE IS THE EATER OF FLESH Thebes: what was THAT caffienatedglitter: I NEED TO KNOW HOW IT ENDS Knock Out: Tommy Wiseau is clearly a dangerous entity. Starscreamapillar: I feel the pressing need to awaken Unicron, so he can shake off the Earth and ensure Wiseau's destruction. thenightetc: Er caffienatedglitter: how well did that work out for you last time Knock Out: There we go. Much better. Starscreamapillar: Just because it didn't work out for my alternates does not mean it may not work out for me. caffienatedglitter: oh right caffienatedglitter: alternate universes caffienatedglitter: still though caffienatedglitter: starscreams are universally jinxed thenightetc: This actually looks familiar.  Huh Starscreamapillar: I know. caffienatedglitter: Is this car porn Starscreamapillar: But I strive to escape whatever unpleasant fate is in store for me. caffienatedglitter: car porn is pretty chill caffienatedglitter: lol jk Smokescreen: woojit woojit no thenightetc: Nice and relaxing, except when they jerk the camera around. Smokescreen: dont watch the room Knock Out: I just needed to end the night on something other than the question of how many pounds of human flesh Tommy Wiseau can fit in his hollow abdomen. Knock Out: Too late. Smokescreen: .... wait did i miss thenightetc: Too late!  We saw the whole thing! caffienatedglitter: o hai smokescreen Smokescreen: ARGHHGHG Smokescreen: did you like it Smokescreen: Hey! caffienatedglitter: it's the room thenightetc: I don't think it's really something you "like" caffienatedglitter: exactly Smokescreen: Was it... Was it an experience? caffienatedglitter: technically caffienatedglitter: yes Starscreamapillar: It was an experience in madness. thenightetc: Everything is an experience. Smokescreen: it sure was a movie, right? caffienatedglitter: no caffienatedglitter: not particularly Starscreamapillar: It being a movie is debatable. thenightetc: In the broadest possible sense. Smokescreen: a film? caffienatedglitter: it was a venture intop insanity Knock Out: It was a whole lot of something. Thebes: it was filmed. I would hesitate to call it a film Smokescreen: someone sure recorded it on a camera! Thebes: technically Smokescreen: hey woojit have you ever been in a sauna before Knock Out: I think so? Smokescreen: How was it? caffienatedglitter: why are you asking? caffienatedglitter: sorry im curious\ Smokescreen: I've got one, and I wasn't sure what to do with it! caffienatedglitter: nvm Knock Out: You sit, you turn up the heat, you cycle special smoke meant to clean out your vents. There are other things I'd rather spend credits on at the bath houses, but it was nice enough. caffienatedglitter: wait whjat caffienatedglitter: lol jk Smokescreen: woojit woojit no thenightetc: Nice and relaxing, except when they jerk the camera around. Smokescreen: dont watch the room Knock Out: I just needed to end the night on something other than the question of how many pounds of human flesh Tommy Wiseau can fit in his hollow abdomen. Knock Out: Too late. Smokescreen: .... wait did i miss thenightetc: Too late!  We saw the whole thing! caffienatedglitter: o hai smokescreen Smokescreen: ARGHHGHG Smokescreen: did you like it Smokescreen: Hey! caffienatedglitter: it's the room thenightetc: I don't think it's really something you "like" caffienatedglitter: exactly Smokescreen: Was it... Was it an experience? caffienatedglitter: technically caffienatedglitter: yes Starscreamapillar: It was an experience in madness. thenightetc: Everything is an experience. Smokescreen: it sure was a movie, right? caffienatedglitter: no caffienatedglitter: not particularly Starscreamapillar: It being a movie is debatable. thenightetc: In the broadest possible sense. Smokescreen: a film? caffienatedglitter: it was a venture intop insanity Knock Out: It was a whole lot of something. Thebes: it was filmed. I would hesitate to call it a film Smokescreen: someone sure recorded it on a camera! Thebes: technically Smokescreen: hey woojit have you ever been in a sauna before Knock Out: I think so? Smokescreen: How was it? caffienatedglitter: why are you asking? caffienatedglitter: sorry im curious\ Smokescreen: I've got one, and I wasn't sure what to do with it! caffienatedglitter: nvm Knock Out: You sit, you turn up the heat, you cycle special smoke meant to clean out your vents. There are other things I'd rather spend credits on at the bath houses, but it was nice enough. caffienatedglitter: wait whjat caffienatedglitter: WHERE DID YOU GET A SAUNA Smokescreen: also if woojit wants to use this sauna I was gifted caffienatedglitter: WHERE DID YOU GET A GIANT SAUNA Smokescreen: I don't know! It was a gift! I'm kinda suspicious which is also why I'm offering Woojit a whirl in it! Knock Out: Suspicious bath house? I'm sold. thenightetc: Gosh, hope it's not cursed or something. caffienatedglitter: DUDE caffienatedglitter: THERE'S PROBABLY A CAMERA IN IT OR A BOMB Starscreamapillar: Why would a camera matter? Knock Out: Lucky camera. Smokescreen: Awesome! I'll promise to fix you up if it goes horribly wrong but hopefully it won't Smokescreen: wouldn't the lens get covered in steam? Knock Out: Excellent! caffienatedglitter: oh right caffienatedglitter: giant robots caffienatedglitter: nudity isnt a thing Starscreamapillar: Not really, no. caffienatedglitter: eh Smokescreen: woojit i found this anime also i've been meaning to watch and i need thosughts Knock Out: Yes? Smokescreen: https://www.youtube.com/watch?v=dVPnaHRgNb8 caffienatedglitter: ooooh knockout you should stream death parade thenightetc: Oh, I love that show!  In a way. caffienatedglitter: oh my god thenightetc: ^Initial D thenightetc: Haven't seen Death Parade caffienatedglitter: it's amazing Knock Out: Yes. Knock Out: Whatever this is, yes. caffienatedglitter: it's only a few episodes long, so Thebes: Initial D is awesome, caffienatedglitter: what is this thenightetc: But you have to not mind the animation. caffienatedglitter: HIS FACE Smokescreen: the humans look dead inside thenightetc: Yeah they do a lot of that thenightetc: You get used ot it Smokescreen: ... are they actually humans or just holo-matter avatars? Smokescreen: i've seen avatars with faces like that Knock Out: Who cares? Smokescreen: true caffienatedglitter: technically they are anime caffienatedglitter: not hoomans Smokescreen: am i anime caffienatedglitter: no you're american animaation Smokescreen: what Smokescreen: i'm not american Smokescreen: i'm praxian caffienatedglitter: your show isn't Smokescreen: WOOJIT HIGHER VOLUMNE Smokescreen: RAISE THE VOLUME thenightetc: And they're proud of that terrible animation, too, lots of closeups of misshapen dead-eyed faces Thebes: all the humans are in love with their cars and will go to absurd lengths to show it Smokescreen: thank you woojit Smokescreen: good Smokescreen: they should love their cars caffienatedglitter: um Starscreamapillar: Is it uncomfortable to squeal your tires like that? caffienatedglitter: smokescreen splease rephrase Smokescreen: it feels good to me! caffienatedglitter: unfortuinate implications Smokescreen: Uhhh- they should adore their cars? caffienatedglitter: smokescreen Smokescreen: what Smokescreen: I don't see the problem! Knock Out: It's not comfortable, but worth it for the sake of drifting. thenightetc: Oh believe me there is drifting in this show :) Thebes: and for wiping a smug smirk off someone's face? Thebes: because there's lots of that too Smokescreen: woojit woojit what if: we raced and played this kinda music at top volume to recreate this stuff caffienatedglitter: NO Smokescreen: but caffienatedglitter: BAD IDEA caffienatedglitter: RECREATING ANIME ONLY BRINGS PAIN Smokescreen: but Smokescreen: :( Knock Out: I'm not hearing a downside! Thebes: This anime is basically nothing but car appreciation and winning races in a way that's petty and satisfying Knock Out: Let's do it! thenightetc: It totally is. caffienatedglitter: knockout you have doomed yoursel Smokescreen: I probably won't be able to do it now, but sometime soon, we gotta! Knock Out: It's a date! thenightetc: Haha, have fun! caffienatedglitter: you fools you will invite them into our world, they will consume reality Smokescreen: I'll look for places with turns like these, too Knock Out: Perfect! Knock Out: That seems a marvelous place to pack it in for tonight. caffienatedglitter: lovely caffienatedglitter: goodnight Knock Out: Goodnight, everyone! Smokescreen: Sounds good. Night, everyone! Knock Out: Thank you for enduring this with me. caffienatedglitter: try not to turn the multiverse into a singularity thenightetc: This was good fun; thanks for the stream. :) Starscreamapillar: I am not sure I should thank you for exposing me to the horror of the Room. Starscreamapillar: Goodnight, and may I be able to atend again in the future. thenightetc: Goodnight! Knock Out: Here's hoping! Smokescreen: Hopefully, I can get here on time one day! Thebes: nighy!
2 notes · View notes
thothonegan · 8 years ago
Text
A bug, how processes work, a history of FDs and C, forking gotchas, race conditions that aren't and general Insanity.
So I just had a fun bug to track down. Was going to have an early day and just finish up builds for a release, when I hit a bug doing my OSX build. I've had this bug for probably a month, but it was easy to work around so I've been ignoring it. So I decided to fix it, not realizing it'd take 5 hours and the rest of my sanity. This is the true story. No names were changed.
I have a tool called WolfRez, which is a resource compiler. Its kindof like a specialized make : you hand it a directory, and it uses a bunch of rules in the filesystem to run commands on the resources. A lot are just copying to where they should be, but it will also do things like compress YAML and Wexpr files, crush PNGs, encode WAV files as Opus (including adding song tags), compile lua files, etc.
So for example, this rule tells it to crush all .png files it finds, and the one below is compiling .lua files into .luac files:
- inputGlob: "**/Resources/Endless.tek/**.png" rule: pngCrush # no outputExt: dont change the filename - inputGlob: "**.lua" rule: luaCompile notOSTargets: [ android, ios, emscripten ] outputRegexpCapture: ".*(?'capture'\\.lua)$" outputRegexpReplace: ".luac"
A few months ago, I was tired of its performance not being the best, so I had it multithread its jobs. With the 2500 files currently in Endless's resource directory, and Demon (my computer) having 24 cores, you can easily see it can get a massive speedup. And resources are embarassingly parallel - no real interdependencies at the moment or anything. So I added it, using WolfTask (which is a nice easy task system), and with a few mutexes/semaphores added, it worked perfectly!
Well it did on Linux and Windows at least.
OSX had this odd thing where occassionly it would hang. The log would say it was finished (or close to finished), but it would never finish. In debug mode or manual builds it'd be fine for some reason, but when I did my release builds (which is pretty much automated cause I'm lazy) it almost always would just hang. So of course my first thought is a race condition. Some task isn't reporting its completion properly, or two are stomping on each other somewhere.
And if I ran it again (which 95% of the resources were already compiled from the failed run), it'd be perfectly fine finishing the last few. Weird.
So first, lets pull out our trusty helgrind! Helgrind is a module for valgrind which lets it detect race conditions. Helgrind is really slow, but I have my laptop so lets run it on Linux while we're looking on OSX. Maybe it'll point out the race condition and it'll be easy!
Hint: Nope. Took about an hour, pointed out some races between console statements (that arent a problem in practice since they're in error handling) but no easy race problems under Linux. Damn. Must be platform specific.
So time for debugging! With my trusty console statements, I confirmed that the TaskGroup all the tasks were a part of was getting all of them added, yet it was never being completed. Welp, lets start throwing statements inside TaskGroup. Its old code, it probably fell down right?
An hour later : nope. Its old code, but thats cause its good code.
Instead it seems like the handler isn't ever finishing. Errr. what?
auto task = taskSource->createTask([iter,&outputs,&failedDuringBuilding](WolfTask::Task* /*task*/) { auto output = iter.value; BuildProgress progress; progress.currentOutput = iter.index; progress.numberOfOutputs = outputs.count(); // code made it here... but never left buildIfNeeded() if (!output->buildIfNeeded(progress)) { console.error() << "Error when building" << WolfConsole::EndLine; failedDuringBuilding = true; return; } });
Okkkkk so its a bug inside buildIfNeeded() that only happens on OSX RelWithDebInfo sometimes. And causes hangs. And never was an issue before. Weird, but ok - start tracing through that. At this point I had like 600 console statements outputting task pointers and stuff, and a lot of it interleaving (cause console is not thread safe on purpose). Finally narrowed it down to basically two different tasks that seem to not complete : luac tasks (compiles lua files into binary form), and pngcrush tasks (tries to make png files as small as possible). No pattern at all of which specific job though.
So lets do some tracing within the pngcrush rule!
WolfType::Bool PNGCrushRule::runWithAction (Action* action, const WolfYAML::Node& customProperties) { // ... elided : set up params, etc ... // code makes it fine here auto res = RuleHelpers::runProgramWithArguments( pngCrushLocation.ref().filePath().zref(), args ); // and this never returns. return res; }
Ok, so its blaming runProgramWithArguments. Thats just a wrapper around WolfSystem::Process. And WolfSystem::Process is code thats used practically everywhere for a long time, so its gotta be good, right? Well thats where the bug says it is, so down another rabbit hole! Can't make any assumptions about whats good code or not.
So Process is a wrapper around running an external program. 99% of programs (including WolfRez) just uses the nice wrapper function around it which looks like this:
WolfType::Vector<WolfType::String> stdoutVec; WolfType::Vector<WolfType::String> stderrVec; WolfSystem::ExitStatusCode returnValue = WolfSystem::ExitStatusCodeSuccess; // Run the given program, with the given arguments, and store its output // in our vectors. auto res = WolfSystem::Process::runTillFinished( programPath, args, &stdoutVec, &stderrVec, &returnValue );
Pretty simple right? Even get the output back easily. Theirs a lot more control if you need it to run async or whatever, but this will just run till the program finishes, then hand back what it got.
Since I think its a multithreaded issue, lets add a mutex right here! Make it so only one thread at a time can run a process. Slow as hell, but it'd show if its a race issue right? Welp, added it, slowed everything by 20x, and while it didnt happen as often, the hang still happened. Sigh, time to go deeper.
Lets talk about how Process works! Unfortunately, most OS level things for running processes dont work the nice simple way the above API does. Most programmers will know about system() which let you run a program, but you can't get the output from it. And that's about it for C standards of running programs! Amazing isn't it. C++ has a technical group I think working on a better interface, but for now it's OS specific. So you need to go even lower to POSIX/WinAPI. So here's how processes work on UNIX (Windows is similar, but has some core differences : if you want me explain it, send me a msg).
Lets say you want to start a new process with the file descriptors (FDs) (such as stdout/stdin) redirected so your program can read them. Here is the list of things you need to do:
First, you need to create the new process. In POSIX, you use fork() to do this. Fork clones the current process, and tells you if you're the parent or the child. Congratulations on your new process!
Second, you need to redirect your FDs. You use something like dup2() to make copies. In Wolf's Process, we use pipes to talk between the parent[application] and child[what will become the program]. Importantly, dup2 needs file numbers, so you can use something like fileno() to get them.
Lastly, you need to run one of the exec functions (such as execve()). This replaces the current process with the new process image at the given location. If you know of Julie-Su (my IRC bot) that could restart herself, this is how she did it.
So in other terms: its like making a clone of yourself, making sure it knows how to talk, then wiping its memory with whatever you want it to do. Programming is weird.
So now you have a child process running the program you want, along with a pipe to your main process to communicate. In the case of runTillFinished, you then just sit on that pipe select()ing, recording any data from stdout/stderr, and waiting for the pipes to close. Once they're closed, you know the program finished and can return all that juicy information.
Back to the bug, I started adding more console statements within WolfSystem::Process. You can't put much debug things within the child process after fork, since you get rid of your FDs, but the parent process basically ends up just waiting on select() for the child process to call. Cue spending 30 minutes playing with arguments to select's timeout which seem to affect it hanging or not, but ultimately was a red herring. The problem is the child never sends messages to its parent, but it also never closed the pipes even though it finished. Err.. it did finish, right?
While I was in the middle of recompiling for the 30 billionth time, I decided to setup a small script running pstree on the process. pstree is just a simple version of ps which shows a process and its children as a nice tree. On Linux, theirs no distinction between processes and threads (somewhat known as light weight processes), so you can easily watch your program to see how its threading or spawning processes. So open another terminal, and lets do:
while true; do clear; pstree PID; sleep 1; done
Now on OSX, threads aren't processes so they dont show up. But as soon as you fork() (which creates a new process), it shows up in pstree. And even nicer, when you exec it shows the new commandline in pstree! Neat! In retrospect this makes sense, since fork()/exec() is how shells work too.
Within pstree though there were two interesting things that showed up which made me curious.
First, zombie processes show up like (pngcrush). A zombie process is a process which has exited, but hasn't been cleaned up by its parent yet. You'd mostly see them for a split second before they get reaped (yes, those are technical terms). However, 1 or 2 of the stuck tasks were showing up as zombies.
Second, I had quite a few child processes which were still named 'WolfRez'. This only should happen for the few microseconds between the fork() (creating the process) and execve() calls (replacing it with the new process). It definitely should not be hanging in that state, theirs literally 5 lines of code there and no loops or anything for it to get stuck in.
What the heck is going on? So lets pull out our debugger (and not in the normal mode). See, if you're a normal process debugging is easy. You start up your program, and can access all the threads and so on. But a debugger generally doesn't let you get to child processes (or more likely, I don't know how to do it in LLDB). Luckily though, like all good debuggers, we can attach to arbitrary processes! So lets try attaching to things.
Attaching to pngcrush doesn't work at all. Mostly cause its a zombie [yes that took me a while to figure out]. Attaching to the WolfRez child processes work fine, and you can see the entire call stack, even pre-fork! (since the fork() copies everything, it even has its old callstack). However the top is a bit odd - its waiting inside a mutex called from the dup2() lines.
if (dup2(m_stdoutPipes[1], fileno(stdout)) == InvalidPipe) std::cout << "[Process::execAndPipe] Unable to dup stdout" << std::endl;
Now the dup2() is used to duplicate file descriptors. If you want to get the output from the process (say STDOUT, also known as FD1), you need some way to feed it back to your parent program. So the easiest way is to create a pipe. The parent program has one end (call it FD4) and the child has the other (call it FD5). Output from one end moves to the other end, and bam: easy communication! But how do we trick the program to write its output on FD5 instead of FD1? Thats where dup2() comes in. dup2() copies a file descriptor into another FD, making both of them act the same. So you can duplicate FD5 into FD1 and now anything written to FD1 is the same as writing to FD5! Program writes to FD1, ends up in FD5, goes to FD4, and we're good. Goes over our pipe to the parent, allowing storing in the vector, yadda, yadda.
So lets talk a bit more about forking [I'm sure you're excited about Yet Another Tangent]. See, forking and multithreading dont get along. At all. Forking makes a copy of the process's data space, but ONLY the current thread's callstack. All other threads just dissapear in the new space. Its kindof like a camera that takes a normal picture, except it will only show one person (the active one). Everyone else was never there : if they dug a hole, the hole is still there but thats it. So whats bad about this? Consider this: you're a good programmer (cause of course you are!), and you make things thread safe. Therefore, you have mutexes, critical sections, semaphores, and other constructs to make sure multiple threads dont mess with stuff at the same time. So consider this: a thread enters a mutex, locks it, then BAM: another thread forks. Data is copied, but only the thread that forks is in the new process. What happens to that mutex? Well, its still locked! And the thread that locked it can't unlock it, cause it never existed [in the new process's view at least]. So if your new thread now tries to use anything that needs that mutex, welp, you're screwed : the lock is frozen shut. Meet Mr. Deadlock.
Sounds like fun, eh? So theirs some pretty big warnings about not calling things between fork() and execve() if you're multithreaded. You can't guarantee the state of anything at all, because so many things are trying to be thread-safe. Even simple things like malloc() or printf() might use a global lock somewhere, and could get locked. So maybe it's dup2()s fault! After all it doesn't say its async-signal safe (which is what the man pages says is the only guaranteed working functions). But the dup2() thing is used by a lot of better programmers than I, so either:
they have the same issue and never ran into it
its something else.
So after another half hour of messing with things, I finally looked at the LLDB trace a bit closer for the child process.
The mutex being locked is within fileno(). .....What?
fileno() should be a pretty brain dead function. It gets the FD number for a FILE* pointer. See, UNIX always has used integers for FDs, such as FD1 being stdout. However, when it came time to make C portable (especially to Windows), it needs to hide details like that. So C uses FILE* (the same thing functions like fopen() do) as its main file handle. So stdout for example, is a FILE* to remain portable. Luckily on POSIX, they have fileno() to convert from the C form to the actual int code, which other POSIX functions like dup2() want. So fileno(stdout) is an easy way to get the number 1 (since its always file descriptor 1).
Here's glibc's version of the function for an example:
// this code block is GPL from glibc-2.25. // not that theirs any reason to copy it. #define _IO_fileno(FP) ((FP)->_fileno) int __fileno (_IO_FILE *fp) { CHECK_FILE (fp, EOF); if (!(fp->_flags & _IO_IS_FILEBUF) || _IO_fileno (fp) < 0) { __set_errno (EBADF); return -1; } return _IO_fileno (fp); }
Simple! It just accesses the struct backing 'fp', and grabs the fileno from it (with error handling and safety things around it).
Well, until you find out that on OSX, fileno() appears to take a mutex. I'm not sure if its a global mutex or one tied to the FD's backing data, but either way it locks a mutex. The same mutex that output uses. A mutex which quite possibly is locked because another thread before forking was outputting progress information or rules to the screen.
So the events to cause this was basically:
WolfRez runs, starts up multiple tasks [24 on this computer].
One thread outputs to the screen its normal messages. This takes an internal mutex by the OS/standard library.
Another thread starts running a task requiring it run an external program (say luac or pngcrush).
That causes WolfSystem::Process to run, causing a fork(), freezing the mutex closed.
Post fork, the process tries to duplicate stdout. To do that, it needs the number so it calls fileno().
fileno() tries to take the lock that was taken prior to the fork.
And since the fork happened, the lock is frozen and will never be unlocked. Deadlock.
Sigh...
So the fix? POSIX also defines the simple defines STDOUT_FILENO STDIN_FILENO STDERR_FILENO which has the explicit numbers (1 2 3) for the standard streams. Which is all that was needed in the first place. So its an easy change. Rerun everything, and its all perfectly happy now.
And that my friends is why you're not supposed to do anything complex at all between a fork() and its execve(). You get to spend 5 hours with Xcode, lldb, pstree, and man pages. You get to question your abilities, what the hell is happening, and try to remind yourself that computers are supposidly logical. And get to listen to all of She's albums over and over and over. On the plus side though, learned a TON about how lldb works, and way too much about how OSX works. Now to forget it all, because after all : programming is about solving problems, then having them nicely wrapped so you can forget it all.
Programming in a nutshell : 5 hours of work for 5 seconds of typing to fix it. And the fix was something you should have done in the first place.
Now for some 酒 and some massively needed sleep.
0 notes