2015-02-11 11 views
10

Khi xuất khẩu chức năng Haskell được gọi từ C, khi nào rác của Haskell được thu thập? Nếu C sở hữu main thì không có cách nào để dự đoán cuộc gọi tiếp theo trong Haskell. Câu hỏi này đặc biệt thích hợp khi chạy Haskell đơn luồng hoặc không có GC song song.Khi nào bộ thu gom rác chạy khi gọi Haskell xuất từ ​​C?

+0

Nếu bạn lo lắng về việc xuất khẩu hoặc xuất khẩu cụ thể của nước ngoài, bạn có thể thêm ['performGC'] (http://hackage.haskell.org/package/base-4.7.0.2/docs/System-Mem.html #v: performGC) trước khi trả về 'Addr'. – Cirdec

+0

@Cirdec What 'Addr'? –

+5

IIRC, bộ sưu tập rác sẽ có cơ hội chạy mỗi khi mã Haskell phân bổ thứ gì đó. Nếu chương trình của bạn thường xuyên gọi vào Haskell, điều này là đủ. Nếu không, nếu bạn lo lắng về việc giữ lại bộ nhớ Haskell quá nhiều thời gian, bạn có thể kích hoạt GC gọi 'performGC' từ C. – chi

Trả lời

2

Khi bạn khởi tạo thời gian chạy ghc, bạn có thể vượt qua rts cờ để nó qua argc và argv like so:

RtsConfig conf = defaultRtsConfig; 
    conf.rts_opts_enabled = RtsOptsAll; 
    hs_init_ghc(&argc, &argv, conf); 

này cho phép bạn set options, ví dụ sửa chữa một kích thước heap tối đa nhỏ hơn hoặc sử dụng một thuật toán nén trên vườn ươm để giảm bớt phân bổ. Hơn nữa, lưu ý có một GC nhàn rỗi có khoảng thời gian có thể được thiết lập (hoặc vô hiệu hóa), và nếu bạn liên kết thời gian chạy luồng, mà nên chạy hay không bạn đã bao giờ mang lại một cuộc gọi Haskell.

Sửa: Tôi đã không thực sự thực hiện thí nghiệm để xác minh những điều sau đây, nhưng nếu chúng ta nhìn vào source of hs_init_ghc chúng ta thấy rằng nó khởi xử lý tín hiệu, bao gồm các nội timer handlers mà trả lời trên SIGVTALRM và thực sự nó cũng bắt đầu thời gian, mà các cuộc gọi (trên POSIX) timer_create mà nên ném những tín hiệu trên khoảng thời gian đều đặn. Đổi lại, điều này định kỳ nên "thức dậy" RTS cho dù có bất cứ điều gì xảy ra hay không, điều này có nghĩa là nó sẽ chạy GC nhàn rỗi cho dù hệ thống có quay trở lại Haskell từ C. Nhưng một lần nữa, tôi chỉ đọc mã và bình luận, không tự mình thử nghiệm.

+0

Bạn dường như đang ở trên một câu trả lời "câu hỏi cũ". Bất kỳ lý do cụ thể, hoặc là bạn chỉ trong tâm trạng? – dfeuer

+2

@dfeuer mất ngủ và cưỡng bách thường xuyên vượt qua tôi để cố gắng giảm tỷ lệ câu hỏi chưa được trả lời của chúng tôi. – sclv

+0

@sclv Tôi gần như đã sẵn sàng chấp nhận câu trả lời này, nhưng thịt của câu hỏi của tôi vẫn còn: khi nào GC thực sự chạy? Nó chỉ là "khi có phân bổ" ở bên Haskell hay cái gì đó? –

Các vấn đề liên quan